Jump to content
  • Advertisement

Blogs

 

Graphics Programming weekly - Issue 66 — December 9, 2018

Breaking down barriers – part 6: experimenting with overlap and preemption the final part of the series presents how different GPUs are able to overlap the workload between different async and graphics queues work on the same graphics queue presents how split barriers influence the overlap additionally presents the ability of Windows to preempt GPU work when multiple applications are sharing the same GPU code wayback-archive Real-time fluid simulation in shadow of the tomb raider slides for the fluid simulation used in Shadow of the Tomb Raider have been released the content of the talk was discussed last week in issue 65 Scriptable Render Pipeline - Single-Pass Forward Rendering next part of the series about the development of a forward shading pipeline using the Unity scriptable render pipeline implements support for directional, point, and spotlights show how to interact with the Unity provided light culling system code wayback-archive Shading Atlas Streaming object based shading approach designed for VR rendering splits rendering into client and server operations the server calculates visible geometry and object space shading the results are stored into a shading atlas the client receives a preprocessed vertex stream and the shading atlas the visible geometry is rendered from a single vertex buffer and shading is applied from the information cached in the shader atlas presents the memory management technique and mip-level selection paper archive video summary parallel memory management archive wayback-archive Metal Documentation Index user created index-page for the Apple Metal documentation contains links to samples, class documentation, best practices documents, tools and debugging helper wayback-archive Going slightly physically based shows how to validate using image comparison and using a furnace test how to implement a plastic and glass BSDF make the ray tracer less biased through changes to the way the number of bounces is determined wayback-archive Khronos - 2018 SIGGRAPH Asia Khronos talks from Siggraph 2018 Asia talks about Vulkan memory management, subgroup operations and the design of a FrameGraph style engine architecture introduction to WebGL and overview of the latest updates to the GLTF format wayback-archive Code reviews - Lamorna Engine series of videos walking through the implementation of a software renderer written in multithreaded C++ using SIMD presenting the whole pipeline from vertex fetching, vertex processing, culling, projection, binning, rasterization, mipmapping and finally shading wayback-archive The importance of good noise explains why noise is significant in computer graphics and how to animate blue noise over time so that it retains its properties wayback-archive Tech Focus: Wolfenstein 2's Variable Rate Shading: Nvidia Turing Analysis! video summary of variable rate shading presents a few approaches that are used to drive shading rate selection what options are exposed in Wolfenstein 2 and how they influence performance and quality Directional Lightmap Encoding Insights new encoding model for Ambient Highlight Direction (AHD) lightmaps that eliminate common interpolation artifacts and how to fit AHD from spherical harmonics data wayback-archive If you are enjoying the series and getting value from it, please consider supporting this blog. Support this blog
Read more

jendrikillner

jendrikillner

C# Players Guide : Classes (Balls Exercise)

Hello... This is my version of the Chapter 18 CLASS exercise about throwing and popping a bunch of balls. : NOTES :  Random() For the most part as I worked through the exercise things became clear but I am still confused about "scope" or w/e it is called that determines when a variable is available to be read by other sections of the code. I wanted to use Random(); to build random numbers on the fly, but it seemed that I was either calling the random very quickly in succession, so all the results were identical, or I wasn't able to access the random object I created when I wanted to. I got around this problem by creating a custom random class called RAN. This initiated Random() during the creation of the class in the main program.. so that only happened once. Then it had functions to produce the random numbers I wanted, in the type I wanted. Also I found the code to be really ugly and hard to read if I just used Random(). I was using Bytes for my 0-255 colour codes.. and as far as I know Random() is returning only floats.. so every time I had to use Random() object I had to use Convert()... this lead to it being a mess. So I build into the RAN class in a way to choose the types for me to clean this up a little. This is only using Random() to for loop 5-50 times and make a list of balls with a size of 1-25 Random rand = new Random(); List<Ball> balls = new List<Ball>(); for (int i = 0; i < Convert.ToInt32(rand.Next(5, 50)); i++) { balls.Add(new Ball(Convert.ToInt32(rand.Next(1, 25)))); } The Colour class that was using bytes was even worse. balls[1].colour.red = Convert.ToByte(rand.Next(1, 255)); balls[1].colour.green = Convert.ToByte(rand.Next(1, 255)); balls[1].colour.blue = Convert.ToByte(rand.Next(1, 255)); And the BALL class was every worse worse!! Ball ball = new Ball(Convert.ToByte(rand.Next(1, 255)), Convert.ToByte(rand.Next(1, 255)), Convert.ToByte(rand.Next(1, 255)), Convert.ToInt32(rand.Next(1, 25)); I found it really strange that using Random() to get specific types would cause such ugly and bloated looking code. So I ended up making my own Random Class called Ran(). This would change the above code to.... Ran Ran = new Ran(); List<Ball> balls = new List<Ball>(); for (int i = 0; i < Ran.Int(5, 50); i++) { balls.Add(new Ball(Ran.Int(1, 25))); } balls[1].colour.red = Ran.Byte(); balls[1].colour.green = Ran.Byte(); balls[1].colour.blue = Ran.Byte(); Ball ball = new Ball(Ran.Byte(), Ran.Byte(), Ran.Byte(), Ran.Int(1, 25)); Which seems to me to be a zillion times easier to read. I has occurred to me now, while writing these notes on the lesson that I probably should have put the conversions into the BALL and COLOUR class themselves.. so it always takes a float in the constructor but stores it as a Byte.. or something like that.. but even doing that would change all the stuff like so.... Ran.Byte() -> random.Next(0,255) Ran.Int(1,25) -> ranomd.Next(1,25) I dunno.. even this looks worse than my custom thing I guess... it seems that there is something I may be missing here... as it seems ugly and hard to write. Maybe there is a better way to handle conversions instead of Convert.ToInt32 or w/e : NOTES :  Code Comments I really need to start looking into making proper notes into my code. There should be a way using the ///sumemry type stuff to add ways to have VS use intense to show me what the members are expecting as I go. I will make a effort to comment more in my next one, but thought I would level this entire project with no comments.. just to see how little I understand it when I next look at it. C# Players Guide dose cover comments but after reading it a few times it is still confusing.. I need to source google page on this before next time. - THING TO DO. : NOTES :  Possible Error I think there is a error in the main program, not a fatal one.. but I believe now I am going though it for my notes that I should have used <= instead of < for the for loops. As I am counting from 1 and not from 0. I will not bother fixing this.. but it is something to keep in mind. The 0 start in the Arrays and Lists is a little hard to remember. I think it is not an error though as I am using +1 in the readouts... but I am done for now and will not be checking or changing anything lol. It is time to move on. : CODE : Ball Class Colour Class Program Custom Random Class Exit Program Class : EXAMPLE OUTPUT : Well, see ya next time!

A4L

A4L

 

Engine: Save/Load and other fun

I'd like to make this a bit more regular hobby, releasing updates on my own game engine (among other projects), yet sometimes my real work steps in and I tend to be quite busy. Anyways back to the important part and that is what is this article about. Making a game engine with WYSIWYG editor is quite a challenge, it takes years of practice and learning, any resources are scarce - and therefore you have to improvise a lot. Sometimes it takes dozens of attempts before you got it right, and the feeling when you finally did it right is awesome. This time I'm going to dig a bit into how I designed save, load & publish system, and which parts of it are done. Introduction To understand save/load/publish system, one needs to understand how his engine is going to work. In Skye Cuillin (codename for my game engine) you have editor application, which is used to create your game scenes, test them and possibly publish them. On the other hand, the planned runtime application takes in exported scene a plays it. There are 2 possible ways to save a scene - first is something I call  Editable Scene, second thing is what I call Exported Scene. Both file formats serves different purposes and stores all the data in completely different way. Editable Scene is saving primarily just a scenegraph, with all entities and their components in a way where editor can easily load them again. It doesn't store any resource files (meshes, textures, etc.) but uses the one on the hard drive. This is mainly to keep the amount of data in the file to minimum (after all it is a text file, not binary file). Exported Scene is storing both - scenegraph, with all entities and their components, along with all resource files (meshes, textures, etc.) in a specific compressed and binary encoded format, so it is fast to load, but losing possibility to be loaded back into editor. I won't get into details of Exported Scene type today, as that part is still in testing - yet I want to show some details on how Editable Scene is working. Further, I will describe and talk only about Editable Scene format. Saving & File Format In the engine, the scenegraph is a N-ary tree with a single root node. This node can't be edited in any way and can't have any components except transform component, which is at coordinates of (0, 0, 0). It is intentionally shown also in the scene graph view on the left side in the editor, and user is unable to select it through there. The only action that can be performed on it is adding new Entity as its child (either by assigning Entity's parent as root, or adding new entity into scene under root), or removing Entity as its child (either by re-assignment under different parent Entity, or actual deletion). Entity class has a Serialize method, which is this as of now: std::string Entity::Serialize() { std::stringstream ss; ss << "Entity" << std::endl; // Store the name ss << mName << std::endl; // Note. Each entity except Root will always have a parent! // Store the parent name if (mParent) { ss << mParent->mName << std::endl; } else { ss << std::endl; } // Store the transform ss << mTransform.Serialize(); // Store components for (auto it = mObject.ComponentsItBegin(); it != mObject.ComponentsItEnd(); it++) { ss << it->second->Serialize(); } ss << "(" << std::endl; // Store children (recursively) if (mChildren.size() > 0) { for (auto child : mChildren) { ss << child->Serialize(); } } ss << ")" << std::endl; return ss.str(); } Simply store some keyword, base entity data (name, parents and transformation), component data and then list of children within parentheses. Also note that each component has Serialize method which simply serializes it into text. On side, all this is also being used for Undo/Redo functionality of the engine. Example of serialized entity (spotlight) can look like this: Entity SpotLight Root Transformation -450 90 -40 0 0 0 0 1 1 1 LightComponent 1 1 1 1 1 1 2000 1 0 0.01 256 1 5000 900 -0.565916 -0.16169 0.808452 0 45 0 0 ( ) Another example (with links to resources) is F.e. this cube: Entity cube_Cube_Cube.001_0 cube Transformation 0 0 0 0 0 0 0 1 1 1 MaterialComponent ../Data/Shared/Models/Textures/Default_basecolor.tga ../Data/Shared/Models/Textures/Default_normal.tga ../Data/Shared/Models/Textures/Default_metallic.tga ../Data/Shared/Models/textures/Default_roughness.tga ../Data/Shared/Models/Textures/Default_height.tga MeshComponent cube_Cube_Cube.001_0 ( ) The names of resources are simply names used in key-value databases (key is name, value is pointer to resource). All resources in project folder are loaded when starting editor - therefore these reference names will always point to correct resources in key-value database for resources (this is assuming project folder matches the one which should be for scene). Loading When saving was done with Serialize method, then it makes sense to implement Deserialize method, which takes text as input and initializes everything for given entity based on it. While it is a bit longer, I'm going to paste here while source of it: void Entity::Deserialize(Scene* scene, const std::string& s, Entity* parent) { std::vector<std::string> lines = String::Split(s, '\n'); // Read name and store it mName = lines[1]; // We need to prevent creation of entity if it already exists in scene. This is mainly because root entity will be stored, // while at the same time it also already exists in scene (it always has to exist). if (scene->GetEntity(mName) == nullptr) { // If we didn't specify parent for deserialize through parameter if (parent == nullptr) { // Get entity from next line, locate it in scene and use it Entity* parsedParent = scene->GetEntity(lines[2]); parsedParent->AddChild(this); } else { // Parent is current node (only when passed through parameter - deserialize for some Undo/Redo cases) parent->AddChild(this); } } // Restore transformation, which is composed of 4 lines: // 1. keyword - "Transformation" // 2. translation X Y Z numbers representing 3D position - "0 0 0" // 3. rotation X Y Z W numbers representing quaternion - "0 0 0 1" // 4. scale X Y Z numbers - "0 0 0" // These 4 lines need to be joined, and passed in as a parameter for Deserialize method into Transform object std::vector<std::string> transformData; transformData.push_back(lines[3]); transformData.push_back(lines[4]); transformData.push_back(lines[5]); transformData.push_back(lines[6]); std::string transform = String::Join(transformData, '\n'); mTransform.Deserialize(transform); // Deserialize each component one by one unsigned int lineID = 7; while (true) { if (lineID == lines.size()) { break; } if (lines[lineID].size() < 1) { lineID++; continue; } if (lines[lineID][0] == '(') { break; } ComponentId compId = ComponentTypeId::Get(lines[lineID]); Component* c = ComponentFactory::CreateComponent(compId); std::vector<std::string> componentData; componentData.push_back(lines[lineID]); unsigned int componentEnd = lineID + 1; while (true) { if (componentEnd == lines.size()) { break; } if (lines[componentEnd].size() < 1) { componentEnd++; continue; } if (lines[componentEnd][0] == '(') { break; } if (lines[componentEnd].find("Component") != std::string::npos) { break; } componentData.push_back(lines[componentEnd]); componentEnd++; } std::string component = String::Join(componentData, '\n'); c->Deserialize(component); mObject.AddComponent(compId, c); lineID = componentEnd; } // If at this point we're not at the end yet, it means there are children for the node, parsing // those out is a bit tricky - we need to take whole list of entities within node, each into // separate string buffer // Children tree depth search (only level 1 has to be taken into account, all other levels have // to be included in string buffer for respective entity int level = 0; // Should we instantiate entity? int instEntity = 0; // String buffer std::vector<std::string> entityData; // Note: When deserializing children we can always pass 'this' as parent, simply because due to // the format, we know the hierarchy of the entities while (true) { if (lineID == lines.size()) { break; } if (lines[lineID].size() < 1) { lineID++; continue; } if (lines[lineID][0] == '(') { level++; if (level != 1) { entityData.push_back(lines[lineID]); } lineID++; continue; } if (level == 0) { break; } if (lines[lineID][0] == ')') { level--; if (level != 1) { entityData.push_back(lines[lineID]); } lineID++; continue; } if (level == 1) { if (lines[lineID].find("Entity") != std::string::npos) { if (instEntity == 1) { Entity* e = new Entity("_TempChild"); std::string entityString = String::Join(entityData, '\n'); e->Deserialize(scene, entityString, this); entityData.clear(); unsigned int id = scene->GetIDGenerator()->Next(); e->mSceneID = id; scene->GetSearchMap()->Add(id, e->GetName(), e); } // Offset line here by 1, in case name contained 'Entity' so we don't double-hit keyword instEntity = 1; entityData.push_back(lines[lineID]); lineID++; } // Push line entityData.push_back(lines[lineID]); } else { // Push line entityData.push_back(lines[lineID]); } lineID++; } // If there is one more, instantiate it if (instEntity == 1) { Entity* e = new Entity("_TempChild"); std::string entityString = String::Join(entityData, '\n'); e->Deserialize(scene, entityString, this); entityData.clear(); unsigned int id = scene->GetIDGenerator()->Next(); e->mSceneID = id; scene->GetSearchMap()->Add(id, e->GetName(), e); } } Which will load whole scene, and instantiate it into current scene graph (before loading scene it is cleared so that only root remains). Showtime And of course - save/load system has to be showed out!  

Vilem Otte

Vilem Otte

 

the world where i don't belong, chapter 1 Ambitions

(This is only the beginning of the book 'The world where i don't belong' . Expect typos, plot holes, odd subplots and the occassionally wrongly named character, especially minor characters. It is made public only to give people a rough idea of how the final story will look)   Chapter 1 Ambitions One day a family found me in a wrecked carrage. There was blood and scraps all around the carrage. They told me that they found me, a human infant, in the cart unharmed, for some unkown reason. As my infant self was crying out for help, they noticed that i had an unusual item ( a watch) and a mysterious mark on my chest. The mark had 5 dots in the center and 2 feathers surounding it, one being upside down, while the other standing straight. Above that was some kind of letter, that no one was able to read. They graciously took me in out of pity, so i didn’t have to live all alone in solitude. I spent several years together with that family, it was nice as they made me feel at peace with my self. But one night my family was wrongly accused for doing something that they haven’t done. Because of that, knights had argue with my familiy to find a reason for this treason, but the knights didn’t dare to listen. As the knights were about to harm us, everything went dark i was so scared, i cried for help, beging someone to answer my crying pleas. But in the end no one answerd, the thought of me being left alone, scared and defensless, made me terrified. Just when i was about to lose all hope, a terribal pain in my chest appeared. It felt like something was coming out from me, i looked at my chest and saw that one of the dots strated to shine. With that my vision became white, as if some kind of explosion had happend. After the ‘‘explosion’’ i started to regain my vision. But the sight i saw was something i wish i had never seen. Everywhere there were dead bodies around me one of my families and the other of the knights. As i looked around i saw that that my mother was pierced with a wooden stick and my fathers eyes had exploded. But the most teriffiying of them all were the knights, their bodies squished by the metal. All around me ther was a pool of blood, as i looked at my hand i saw blood in my hand, fearing myself and the treasion i committed, i ran. As i ran i started to think was this the reason why i was found in a broken carrage? To this day, i still don’t know the real answer. Months had past as i lived in poverty, i noticed a poster that stated, they were recruting new knight trainees. I thought to myself, that this could feed me and repay the blood i shed. But first i had to get in the academy. Once i became an adult, with my training completed, they alowed me to enter real battles. The fights were gruesome, but for some reason i was no longer afected by that anymore. I had many battles against the demons. It seemed that i didn’t care for life anymore, as long as i had the chance to slaughter anything, i didn’t have to think about the difficulties of life. But i couldn’t call that living. The battles were mostly easy as they couldn’t, even, come close to damage me. In one fight against the demon army, i decided that i’d try to find something to live by, as long as it gave my life meaning- i didn’t care. It could have been to find the real reason for that mark on my chest or that mysterious item. In the end, all i could think about what i should srtive for, was about what i should live for, lamely enough that’s what i decide. I also have no idea why i didn’t care for my comrads anymore, it looked like i had no empathy left... At the end of the battle, I lost and was taken captive, wearing tatered clothes, the demons wanted to execute me, to taunt the human nations. Alltough that wasn’t realy civilized, i had thought that they would be more barbaric, but they weren’t. In the academy, they made it seem like, that they were like ruthles brutes with no knowledge of proper etiquette. That was clearly proven wrong in that situation. They weren’t hostile at all, unlike humans who ruthlesly killed them, tourtered them and made them slaves, they even killed them if they couldn’t move, because of those injuries. As they made their way to execute me, i felt like i could finnaly rest in peace. I wouldn’t have to think about how to fit in with the humans. In the end that wasn’t the case as they tried to stab me, they failed. They tried and tried again without succsess, when they lost all hope they called their general, who also tried to excecute me, but all efforts were in vain. It looked like the demons couldn’t damage me, no mater what! All of the demons were left speachless, for a situation like that hasn’t ever happend to them. The demons who had no idea what was the cause of this, they asked me, if i knew what might be the reason. I answered ‘’Curses! i don’t know, i’ve had too many unusual thing happen to me in my life! If i knew i wouldn’t even bother talking to you! Curse this rotten mark!’’ As i cursed the mark, the demon general asked me ‘’what mark?’’. It seemed like he hadn’t noticed it, so i said ‘’ the mark on my chest’’. The general thought that that was a magical rune, but wasn’t sure. The general decided to send me to his superiors, this happend until i was send to the demon lord himself. I was confronted by the thing i had sought to defeat, in order to survive. Even tough that was the case he didn’t treat me likes some lowly being, instead he decided to give me an offer. I could feel that depending on my answer it would change my fate. He offered me to join his ranks, if i didn’t like my own kind. In astonishment i was baffeled, for someon of such high stature to offer such a deal. In haste i answered ‘’ i would be hounerd to serve under you!’’. With that we arvie at the present and because of that moment my story had started, with no turning back!

Soulight

Soulight

 

Dev Log #1

Intro Its been little over a week since I started this project. So far I have setup the Bitbucket and sprint on Trello and Ollert so my planning and version control seems solid. Aside from that I have finished some other things I will list down. So far it seems I am ahead of track despite my bumpy progress, currently no lines of code have been written but that is high on the todo. Splash Screen This was really tricky not being an artist myself I had go to search for ready made templates I could use all sites I found usually charge a registration fee which for the scope of the current project seemed too high maybe some other time. So I did the next best thing loaded up Gimp watched a few youtube tutorials got some fancy text going added a bit of highlight and I have a splash screen logo ....is it as good as the templates found on other sites not by a long shot but it will do. Loading Screen To do this I had to first get a UI kit from the unity asset store I found I nice old school themed one which I think works well for that I have planned. The loading screen main purpose is really just to wait for the main scene to load initially I was planning on having it load individual assets but in hind sight those will load too fast for the loading screen to be of any use given the scope of the game but who knows the future may prove me wrong and I might still do this. So far the loading screen will mostly be a fake one going from 1-90 then stopping to wait till everything is loaded then moving to a 100% that is if everything hasent already loaded in which case it will fill directly to 100. Main Menu Initially I was planning on implementing the main menu but if I want to have a transparent main menu with game running in the background but without the player character present. So I have pushed the main menu implementation to the last since I need to get the basic game play done first. The UI however is done and setup the buttons will not be mouse clickable and instead will use arrows keys to select them and action to trigger.   Upcoming For the next dev log I should have the FSM and loading and building asset bundles ready that should be more code heavy while this one was image heavy.

Treader

Treader

Sling Bot Boarding Day 7, Toy Build 4! :D

Not much to say about today's build that I didn't post yesterday... or earlier... wait.. what day is it??.  haha In fact, there's nothing else to be said...  Just play it!! .zip = Win32 (Scanned clean with Kaspersky VirusDesk, see .png for checksums) SBBB4.zip  

Septopus

Septopus

And so it begins.....

Well.. the place to start is at the beginning, yet I have started this blog about a week into my new hobby. So unfortunately this blog will be missing the initial steps of my own personal development. Yet I guess it is close enough. I have mapped my short term goals into a few early milestones. Learn the Basics of C# Create a console text adventure game to practice what I learned Learn the Basics of Unity Rebuild my text adventure into a Unity Project. These are my initial milestones. not exactly mold breaking in originality but I am a relatively pragmatic type of person and feel small steps is the way to go. For me, I think the best way to learn something complex is to learn by doing smaller, less complex things inside the same topic. To that end I have purchased a book called The C# Players Guide. My time over the next few weeks will working though this book and then taking what I know into my first "real world" project. A Text Adventure Game. I am finding the book to be pretty interesting and easy to read. Though sometimes it feels like it is giving only a very cursory overview of things, leaving the reader to use google or a website like GameDev.net to gain further insight. I may look towards a more complicated book after this. I have read that C# In Depth is a good book to follow up from the Players Guide. Anyway, Up, up, up the ziggurat, lickety-split! -- A4F As I said I have already started on The C# Players Guide . Here are the previous exercises I have worked through. Chapter - 01 - Hello World Chapter - 05 - Variables Chapter - 07 - User Input Chapter - 09 - More Math Chapter - 10 - Switch State Chapter - 12 - FizzBuzz Chapter - 12 - Looping Chapter - 13 - Arrays Chapter - 13 - forEach Chapter - 14 - Enumeration Chapter - 15 - Methods (1) Chapter - 15 - Methods (2) Recursion - Fibonacci (Hard! This one hurt my brain a little!) Chapter - 15 - Methods (3) - TryItOut Chapter - 17 - RandomDie  

A4L

A4L

Sling Bot Boarding Dev Day 6, Scoring!

I've got a few more features to cram in here before I put out another toy build, but here's what I got going today: Scoring System: points are accumulated for Air Time, and rotations(tricks) that are performed while in the air(right now, just turning and flipping).  A combination multiplier is calculated each physics frame to determine if multiple rotations are being executed simultaneously(rotate & flip), this will double that frames point value, if the player velocity also exceeds 150km/h it will triple that frames value. In the screenshot below you can see the new Records section, this holds your current high speed, your longest air time(distance) measurement, and your highest single combo score. My next toy build will include a replay button for each of these record items so you can revel in your own robot glory!! The total score on the right will be more important for running courses and racing, which I have yet to begin on.. Even More Camera Improvements:  I was still unhappy with the camera follow as of toy build 3, so I played with the rotation Lerp speed, in toy build 3 the camera's movement and rotation Lerp speed modifiers are the same.  I've cut the camera rotation Lerp speed in half now and it does a much better job of keeping the player centralized in the view.  Don't really have a screenshot for that though..  Lets see... Oh YES!!  Glitter!  Hahaha, I dunno if it will stay like this exactly...  But it's pretty fun. Now when ever there are points being accumulated you get a visual signal in the from of red and green glitter shooting from the ends of your board. These are just cubes I colored to use as placeholders for something nicer, but I almost like them just as they are... The more combinations you do the more glitter you get. It makes a nice visual feedback for the player, at least I think so. That's all for today, Happy coding everybody!      

Septopus

Septopus

 

Froggy Hop : Postmortem and some simple tricks I've put into it that I think went right.

ABOUT : First of, I wanted to give 1000 pixel KUDOS! to the GD challenge organizers and to all the entrants cheering each other and giving motivation to meet the deadline. I joined GameDev Challenge to force myself to finish a playable prototype game out of my simple and heavily under development game engine sit on top of MonoGame; after leaving Irrlicht, XNA and Unity years back, I'm back again to my game development hobby specifically started again last year after I find out that MonoGame is very much alive and kicking and targeting multiple devices now, ( but I'm planning to use Unity again on it's current form) anyways, but what's the purpose of me making a game engine if I cannot make a playable prototype game from it? So I joined GD Challenge to make a collection of prototype game out of my engine. Froggy Hop is my 3rd entries after joining Multiplayer PacMan and Tower Defense challenges and what do you know ^_^y I now have 3 working playable prototype that I can expand, revise, enhanced and maybe later release it on other platforms if ever the prototype becomes commercial grade. Here goes some of development incidents and it's implication on completing the project and meeting the deadline. WHAT WENT RIGHT 1. Applying fake model animation tricks : From the start I know I don't have much time to do all the characters modelling, rigging and doing all the skeletal animation stuff, it requires a lot of time and a very tedious process for a none 3D artist like me, but I think I can code some additional component much faster than rigging and animating a model. What I did was, create an additional entity component and called it Grow and Shrink Component, rather than creating a skeletal animation of snake with crawling action which will take some time and  additional memory bandwidth of mesh frames on my content manager and I think it's a nice additional features of my engine. FAKE SNAKE WALKING ANIMATION : I've  just created a static Sake Model and apply the Shrink and grow component to it's entity to mimic that it's walking by just applying minimum, maximum scaling and it's growth and shrink amount, What's cool about component is that it's an apply and forget on the game logic, but of course the system device engine will take care of it, assuming I'm just a user.   FAKE BEE WINGS FLAPPING : Another fake animation again O.O,  I Add rotation component on Bee wings and rotate it fast enough to mimic that it's flapping it's wings; and add it as a child entity to the bee's main body.     2. Using a grid base node path : Using my existing grid node routine that I've used on my Multiplayer PacMan entry, PacMan is actually 3D but in 2D representation most of entity there are just a 3D Quad.

In this entry the Level map  model is just a display and an eye candy it really has nothing to do with the  game logic, the player is just repositioning on the grid node world position base on user's input just like what I did on Multiplayer PacMan.  
3. Using simple collision detection: Alright folks now let's hit the nail with a tank! 😄 and apply some cool and lovely physics engine like HAVOK, NEWTON, ODE or TOKAMAK that would be cool right ? WRONG! NO! WRONG! NO! ( speaking to self )  for this type of game I think I can implement a much simpler collision detection without using a heavy weight 3D physics engine.
   
Ok let's just use Bounding box or Bounding sphere since it's already available on my engine, upon applying the component it will automagically transform and recalculate it's bounding properties AAB or OOB for BBox when the entity orientation change sounds cool!? WRONG! NO! WRONG! NO!     although it will suffice my needs for collision detection, but I think theres a much lighther and easier way to implement collision for this type of game.
   
Distance checking! Horrray! HepHep! Horray! : -D how about adding a minimum distance property for each entity and compare that to the player position, yep, I just use distance checking for the collision and I just created a collection of obstacle list per region, I dont have to check other obstacle that's too far away to collide on the player, if player is on region 1 in the map and theres only two entities over there; for example two bees it will only check collision for those two bees, I ended up using a very simple collision checking routine  which I think did the job done. I hope I followed the KISS design principle in this entry, the code is not relevant to this post but wanted to share the code I've use is just a simple routine.        3. Using tools I'm more familiar and comfortable with the usage: I use Bryce 5 the splash screen; MagicaVoxel, FragMotion, MilkShape and DeleD for modeling, rigging and animation; .Net paint and Gimp for any texture manipulations and Audacity for trimming and adjustment to background musik and sound effects.
WHAT WENT WRONG : Aside from a month not playing Legend of Zelda Breath of the Wild to finally finish it and playing other games; really, nothing really went wrong :- D Using features not yet available on my engine : Initially I don't have plan on putting shadow on this entry, I just want to apply simple sobel filtering normal map shader on the level model and just using Basic effects on other entities, but my spider sense is tingling that it would be nice if it has a shadow, but my shadow map shader is still work in progress and has bugs  and no TCF implementation or what so ever aside from that I'm using sobel normap map shader which I will need to incorporate with light sources with sobel normal mapping and shadow map! WHAT!!!  It really causes heavy delay on the project, I posted my shader problem here and there, but eventually found a solution for the fix.
CONCLUSION : I almost gave up on this entry due to lack of time, but that's where the weakness lies in giving up not just on this entry but in general, one or more try will not hurt and see where it goes; More or less my experience on this challenge is awesome and it's the game I made that my GF wanted to try and play testing up to completion at least she knows why I'm busy after work ^_^y I just always get too tired when shes around LOL.


Dexter Z      

DexterZ101

DexterZ101

 

Next Challenge Poll!

Time to vote for the next Challenge! Select which themes you would be interested in for the next GameDev Challenge. You can select as many as you'd be interested in seeing - so be selective in your choice. This poll will close end-of-day December 14. The Loot Box means we ignore all the votes and the theme is randomly selected from the list in the poll.

khawk

khawk

 

Nanotale, our new typing game is now in development

NanotaleTeaser_with_sound.mp4 Something is wrong with the heart of magic. Play a young archivist venturing out into a dying world, cataloging its mysteries and its wonders to unearth the truth. Nanotale is the new adventure from the Typing Chronicles franchise and the spiritual successor to the acclaimed Epistory. We are proud to finally be able to announce the development of our new typing game, Nanotale - Typing Chronicles, the spiritual successor to 2016’s acclaimed indie title Epistory - Typing Chronicles. 

Something is wrong with the heart of magic. Play a young archivist venturing out into a dying world, cataloging its mysteries and its wonders to unearth the truth.

Nanotale - Typing Chronicles is an atmospheric typing adventure RPG set in a colorful vibrant world that blooms to life under the words of Greg Buchanan [www.gregbuchanan.co.uk]. Developed by Fishing Cactus Games with the same core team as Epistory - Typing Chronicles, we can’t wait to share the adventure! Wishlist the game NOW   Weekly Updates Today is the opening of our Steam page, and with it, the beginning of us being able to talk about the project. To make sure that communication between players and devs flows perfectly, we will post weekly updates about the game on the following channels:

Nanotale Steampage
Twitter
Facebook [www.facebook.com]
Discord [discord.gg] Your voice is important Many of player participated in our survey last year about those features they loved in Epistory and how they would like to see these features in our next title.
That survey has been used as a solid base when brainstorming about the Nanotale - Typing Chronicles. It helped us to capture the DNA, the essence of Epistory, to create a new game that we hope will please the community. Sometimes decisions have to be taken. Some are harder than others, but we will count on you to continue to enlighten us about what you think of Nanotale - Typing Chronicles. We want you to take part in this incredible new typing adventure with us!

Leave us your thoughts in a comment and don’t hesitate to spread the news all around you! 

Thank you!

FishingCactus

FishingCactus

Astroworks Devlog #1

Devlog #1 - Beginning 6th of December 2018 Really A Studio
- Follow us on Twitter!
- Subscribe to our Youtube channel for upcoming devlog videos!
- Join our Discord server!
- Consider supporting the team on Patreon!
- Interested in contributing to the project? Fill out our application form or contact a Producer on the Discord server! Who are we Really A Studio (RAS) is an independent game development team. RAS was founded on the 30th of October 2018 as a bootstrap startup with the goal of creating innovative, quality video games. Our incredible team consists of passionate designers, artists, 3D technologists, sound engineers, and content producers from all around the globe working together to create great games. Our first and current project is Astroworks, a singleplayer sci-fi action game set to release in 2019Q1. Astroworks Concept Astroworks is a story-driven 3d arcade space combat action game. Fight against a galactic megacorporation turned evil with multiple spaceship choices, heaps of weapons and abilities, featuring tons of explosions! Embark on challenging missions which include fighting against swarms of enemy battle drones, blowing up enemy capital ships, sabotaging factories, spaceship races and more! Today’s topics: Backstory & the main villain: The Crimson Duke Backstory Astroworks is a galactic megacorporation. It has monopoly status over several markets. It has a severe problem with logistics, because it overexpanded and the speed of travelling between star systems takes a long time and the resource for powering their spaceships are way too expensive. On a small colonial planet called Thars, a new material called filinium (pronounced fiLInium) is discovered in the asteroid belt orbiting it which soon gets used as the fuel for local spaceships and it proves to be extremely effective and also makes the ships move at a much faster speed. Stories about this new miracle fuel starts spreading in the galaxy like wildfire, and the residents of Thars make a nice living out of trading their filinium. Thars has been a scarcely inhabited planet for a long time with only a few small sized colonies scattered across its surface. But now after the discovery, its population started growing and cities started to sprawl. In one of the bigger cities The Azure Ghosts forms, an underground criminal gang with a purpose to raid the trade routes around the planets orbit. Soon enough they start to construct an in-orbit headquarters for themselves, manned with small, weaponized spaceships. Thanks to this they are able to create a nice pirate infrastructure. The Azure Ghosts becomes a formidable foe for any peaceful merchant who wishes to make a profit on filinium. Meanwhile, Astroworks is taken over by an ambitious new leader called The Crimson Duke. He thinks that filinium would make Astroworks the sole biggest power in the galaxy, only if they could get their hands on it. So he decides to rebrand Astroworks to his likings and he sets out to take Thars and all its filinium, no matter the cost. The Crimson Duke (early sketches) Personality The Crimson Duke has a charming and calculating personality. He will use anything within his power to make others work for him. He sees others as mere toys and tools. If anyone refuses his offers, The Crimson Duke will quickly “deal” with them. There are lots of rumours about The Crimson Duke’s deeds. Although he usually tries to make allies with the people he meets as long as they prove useful in any way. This makes most people believe that he is an amiable person. However, when they get to see his true self it’s probably already too late. Back Story (sketch) The Crimson family has controlled the Astroworks megacorporation for more than 50 years. Since childhood, The Crimson Duke’s father was teaching him only one thing thoroughly: “Impose your will on others. It’s the best way to achieve more power.” The words of his father became a lifetime credo for the young Duke. After reaching adulthood, The Crimson Duke started working with his father to usurp the leading role of Astroworks from his uncle. Using any methods necessary, together they persuaded others to work for them or eliminated those who became a threat. If someone proved to be too powerful for a simple elimination, they formed a temporary alliance with friends of their enemies… waiting for the moment when they could “satisfyingly” end it. The continuous blood baths and assassinations along with the fact that The Crimson Duke usually wore red clothes resulted in his nickname. A nickname that he likes because it sparks terror in his enemies. When his father was finally appointed as leader of Astroworks, The Crimson Duke only needed to take care of one last thing. With a proud look on his face, his father didn’t resist when The Crimson Duke sliced his throat with a dagger. With full control over Astroworks, The Crimson Duke started its military appropriation for resources and expansion while causing destruction all over the galaxy. Now, The Crimson Duke has set his eyes on a promising new resource: filinium. If he achieves control over its production, Astroworks will finally be the greatest megacorporation in the galaxy. And The Crimson Duke believes that he will fulfill his objective to be the most powerful man, so powerful that nobody will ever be able to oppose him. The Crimson Duke’s capital ship: Narrator (clay model of the capital ship) (clay model of the command pod detached from the capital ship) Description As the perfect representation of Astroworks’ power, the capital ship Narrator is enormous and has an incredibly high firepower potential. Thanks to its defensive structures no enemy spaceships dare to get close, and thanks to its energy shield it is impossible to damage it from further away. On top of these impregnable defenses the capital ship is able to launch devastating laser beams which obliterate anything caught in its path. Thank you for your attention! Tune in next time as well and don't forget to follow our activity on these sites: Really A Studio
- Follow us on Twitter!
- Subscribe to our Youtube channel for upcoming devlog videos!
- Join our Discord server!
- Consider supporting the team on Patreon!
- Interested in contributing to the project? Fill out our application form or contact a Producer on the Discord server!

Qunary

Qunary

Sling Bot Boarding Toy Build 3!! :D

Hey Everybody! Toy Build 3, sporting improved camera follow, and Instant Replay!! I'm really interested to hear how the replay feature works for you guys, it stores the replay data based on the frame-rate and not a fixed clock tick, so I'm hoping I got the math right and it replays correctly for all frame-rates equally...   Currently the buffer is fixed @ 1200 samples, so the actual replay time will vary according to your frame rate a bit.  Once the buffer is full, it removes the oldest frame and adds the next.  So you can replay at any time(when the buffer is full) and get the last n seconds of play.   Pretty awesome!  .zip = Win32 (scanned clean with Kaspersky VirusDesk before upload, see attached .png for checksum) SBBB3.zip

Septopus

Septopus

 

There’s BIG open source news on our 9th birthday

Ten years ago, two guys got together with a goal to change the mobile development world. A year later, Corona SDK was born. My, how time has flown! Since those first days, we’ve frequently seen developers reach the #1 spot in various app stores. We’ve seen apps that have received millions of downloads, and app developers who have made a full time career out of mobile app development. But for many, it’s also a challenging time. The mobile app market has become over saturated. There has been a race-to-the-bottom in app pricing. New challenges extend up the development toolchain and impact the quality of top app engines. In this evolving industry landscape and these emerging challenges, change is good and necessary. With that in mind, we would like to introduce a big change for Corona. We have decided to get you — the developer community — more involved in Corona’s development, and open-source most of the engine. There are features you want, updates you need, and it’s simply time to get you more involved in Corona’s future. Corona Labs will continue to support the engine and going open source means more transparency to the process. We are certain you will have a lot of questions about how this will work, and as we have more to share, we will be continuously sharing new details with you. Also, feel free to discuss this in our community forums and in the CDN Slack. We’d like to assure you that our goal is to increase transparency by enabling access to the source, and allowing each and every one of you to add your unique contributions to Corona’s future. Any media questions should be directed to the Corona Labs Developer Relations team at devrel@coronalabs.com.
View the full article

CoronaRob

CoronaRob

The Great Tribes Devblog #32

Hello dears! It's been a month and a half since my last diary, a huge amount of work has been done during this time. So that was my task sheet, without considering the tasks that I perform on in-game mechanics: All tasks were performed not in the order in which they were located in the list, and there are no small tasks that had to be solved along the way. Many of the tasks did not concern my participation, such as Alex slowly changed to buildings:

  Work on selection of color registration of a terrane:
  The option that we have chosen to date will show a little below. The first thing I had the task of implementing shadows from objects on the map and the first attempts to implement through Shadow map gave this result: And after a short torment managed to get this result:
 
Next, the task was to correct the water, pick up her good textures, coefficients and variables for better display, it was necessary to make the glare on the water:
  At the same time, our small team joined another Modeler who made us a new unit: The model was with a speculator card, but the support of this material was not in my engine. I had to spend time on the implementation of special map support. In parallel with this task it was necessary to finish lighting at last.
  All as they say, clinging to one another, had to introduce support for the influence of shadows on the speculator:
And to make adjustable light source to check everything and everything: As you can see now there is a panel where you can control the position of the light source. But that was not all, had to set an additional light source simulating reflected light to get a more realistic speculator from the shadow side, it is tied to the camera position. As you can see the armor is gleaming from the shadow side: Wow how many were killed of free time on the animation of this character, the exact import of the animation. But now everything works fine! Soon I will record a video of the gameplay. Meanwhile, Alexei rolled out a new model of the mine:
  To make such a screenshot with the approach of the mine had to untie the camera, which made it possible to enjoy the views:
  In the process of working on the construction of cities, a mechanism for expanding the administrative zone of the city was implemented, in the screenshot it is indicated in white: I hope you read our previous diary on the implementation of visualization system for urban areas:
  As you may have noticed in the last screenshot, the shadows are better than before. I have made an error in the calculation of shadows and that the shadows behind the smallest of objects and get the feeling that they hang in the air, now the shadow falls feel more natural. The map generator was slightly modified, the hills were tweaked, made them smoother. There were glaciers on land, if it is close to the poles: A lot of work has been done to optimize the display of graphics, rewritten shaders places eliminating weaknesses. Optimized the mechanism of storage and rendering of visible tiles, which gave a significant increase and stable FPS on weak computers. Made smooth movement and rotation of the camera, completely eliminating previously visible jerks. This is not a complete list of all solved problems, I just do not remember everything Plans for the near future: - The interface is very large we have a problem with him and really need the help of specialists in this matter.
- The implementation of the clashes of armies.
- The implementation of urban growth, I have not completed this mechanism.
- Implementation of the first beginnings of AI, maneuvering the army and decision-making and reaction to the clash of enemy armies.
- The implementation of the mechanism storage conditions of the relationship of AI to the enemies, diplomacy.
- AI cities. Thank you for your attention!
Join our group in FB: https://www.facebook.com/groups/thegreattribes/

Zemlaynin

Zemlaynin

SFX Underground Sewers Fantasy Atmosphere - Sound Design

Hi ! Here is another background fantasy sound atmosphere that I wanted to share with you. This is the inside of a deep artificial tunnel, most likely a sewers. We can hear a lot of water dripping from several sources. A few gusts of the howling wind from time to time. Hatches opening and pouring out a thick and slimy content.
Mice and bats seem to be the main tenants of these corridors.
There is a constant rumble in the background that seems to be coming from deep depths of the earth, giving the impression of endless tunnels. The atmosphere is thick, wet and scary.   You can find this sound and loads more at: http://www.ogsoundfx.com
 

Starting Zone

I've been making games since I was a kid, but I've only finished one game in the last twenty years. When I was young I kept it simple and was able to make a few MS-DOS games. Then I wanted to keep making it better. I've tried so many different strategies to get better at game development. I've tried working with people and getting ghosted by team members one after the other in many different projects. I don't blame them much, it's a big ask for most of their free time for a hobby they find out isn't what they want to do. I also don't want to hold anyone back if they want to move onto a better managed project where they can flourish. And that lead me to my last strategy, to start out simple again and do everything alone, but if people wanted to help I would be happy. And I was doing pretty well, I learned a lot in the project, making a game from start to finish as we know is a lot of work that requires a lot of different skills. I looked back at the five years I took to make my last game (well, there was a lot of procrastination), where my skills are as a game developer, and where I wanted to be and I was disappointed by what I saw my path was. If I made my next game, a little more complicated and developed a little faster, I was still looking at a project that would take a year or two and I'd learn a little more. I have a few games, like I'm sure we all do, that I really want to make but don't yet have the skills to do them well. So an idea about training myself up without going through the whole process slowly developed. Focus on one skill at a time, then add in one more once I've gotten good at it, and one more, until I'm pretty good at most things. So I over engineered what I call RIP (repetitive iterations for proficiency). I think the idea is good, I think it will help me get better much faster, and I'm going to try it out to see if it works. I'll blog my progress as I go, maybe other people will find something useful in it. I've already made the first two one level games, a Ninja Gaiden (NES) clone and a Super Mario Bros. (NES) clone, and am currently working on a Bionic Commando (NES) clone. The first several projects in the plan are to take a game I like to play that falls into the more simple game genres (platformer, action... etc.), and reproduce all the gameplay for the first level.

DavinCreed

DavinCreed

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!