Something I’ve spent along time doing is thinking of what different things I want to include my engine and possible tools that should be created to accompany my engine. They may or may not end up in the finish build for now its really just a rough template of ideas. This list is in no particular order.
- Level Editor – This is one of the main things that we quite often associate with an engine, of course due to time and feasibility it would have to be kept fairly primitive but nether the less would be a fine edition to the engine. Basic functionality I guess would be being able to import models and assets into the editor and being able to manipulate their transformations. It would also be good of course to add Prefabricated entities for things such as players, lights, spawn points, and whatever else is included with the final design. In an ideal world the engine would all be in one nice little neat package so you could play in the editor much like we see with Unity 3d but we’ll have to see. Integration with an editor probably won’t be until late into the development cycle as I see it more of a tool that sits on top of the engine but I’ll be keeping it at mind during the design process of the engine I ideally want to make it as simple as possible to integrate when it comes round to it. The other thing while I remember is it would be really nice to have a hierarchical view of the entities in the scene nicely sorted and orientated easy to see and select so they can be manipulated in the scene.
- Prefabricated entities + Instancing – I was going to have these as two but I think they kind of link together. I would like to be able to combine multiple entities in the scene into what would be known as a prefabricated entities this way it’s there if you want to use it again you can without reconstructing it and any changes made to the prefab will effect all the entities throughout the scene. Considering their all the same I’ll be using a rendering technique know as instancing as a form of optimization more than anything. When you add a prefab to the scene I’m probably going to have it so that it won’t create any new objects but use the ones that have already been created basically.
- Space Partitioning – I would very much like to implement my own partitioning system such as an Oct Tree, I haven’t totally got this planned out yet but I’ve been having a look, like most things I understand the concept but I’m trying to work out the implementation for myself, I’ve spent some time looking at different containers I could use, at first I though I was just going to use a map container but I herd somewhere that they can be quite slow to work with for such a system so I guess I’ll have to do some more research.
- Content Management – It would be nice to have something in the system for handling the content management as far as loading and unloading assets is concerned and caching resources so that they may be used later,Object Pools. I haven’t planned this out yet but I know from experience that constantly loading and unloading data when it is not necessary can cause a huge performance hit to the system causing it to be a bit jumpy, a good content management system becomes especially hard when creating something suitable for a sandbox where all the time you are having to load and unload large amounts of assets.
- Level Of Detail – It would be good to have support for different LOD’s both on models within the scene and for things such as terrain where large levels of detail are not necessary when far away.
- Volumetric lighting – would be a nice edition.
- Volumetric fog + other effects – just would be really nice to have.
- Lighting – point lights, spot lights, directional lights, usual stuff. Obviously would be nice to have various effects to modify the lights such as the brightness, color, distance, falloff and more. But at least get the basics down. and be able to be Real Time and Dynamic.
- Shadows – Haven’t really looked into shadows much but have a general idea of the concept. Real time and Dynamic Ideally.
- Scripting Language – Implantation of a good scripting language could be potentially useful there’s already things I’ve come across that are too easy when implementing in c++ such as reflection which isn’t naively supported by c++ i believe. I need to look more into it though I’m not exactly sure of what exactly I want to achieve yet and how I want to do it.
- UI/ Menu Editor – A useful edition could be a dedicated tool for creating in game menus and Interfaces. At the very least have a nice section of functions that can be used for creating interfaces and menus, I don’t think it’s really so much of a necessity to have a visual UI/Menu editor.
- Terrain Generation – It would be great to have some form of terrain generation with varying levels of detail, some kind of quad tree in relation to detail level based on view from active camera. At the very least I would like to be able to generate a terrain from a height map and at the most I would like it integrated into the editor with various tools for manipulating the geometry of the terrain.
- Shaders – A lot can be done with Shaders, I’ve spent some time looking into the rendering and graphics pipeline so hopefully It’ll work out. I’m undecided what shader language I will be focusing on I could just us GLSL a shader language used with Opengl, or I could use nvidias shader language cg which is compatible with Opengl and Direct X so could save some time in the future if I was to port the engine to Direct X. I would like to make use of Vertex Shaders, Geometry Shaders and Fragment Shaders. I’ll get more into this at a later stage when I look at the OpenGl graphics pipeline in relation to the engine design.
- Abstractness to the Rendering System -It would be nice to some degree to try and keep the rendering system in some way abstract from the graphics library that it is using, this could make porting the engine to use other graphics libraries in the future a lot easier. I’ve spent most of my time trying to design this part of the system and It’s still for the most part incomplete but I’ll be going onto this much more later. In my mind this is the hardest part of the system at the moment and one of the most crucial so I’m tying to take my time with the design process. I’ve been doing a lot of research, planning and more than anything thinking about what I want to achieve and how to keep it well optimized at the same time.
- Input Management System – This is something that I’ve already done a nice bit of work towards implementation, For now I’ve took the bind a function to a key press approach, as it stands at the moment you can bind a key to a function which is then in turn called on the key press I thought it may be better to check for all key presses once in the engine loop rather than every object you want to receive input on checking every time its update function is called. Slightly better optimization in my mind. I’m thinking you could have an object which is the current object under control with the player that the input manager keeps track of then it calls the function on that active object and none others, could be combined possibly with some kind of player indexing system in order to manage multiple inputs through one machine at the same time and only call the functions on the objects associated with a given player index. Bit hard to explain what I’m thinking but I may go into more depth at a later stage.
- Networking – It would be great to have some form of networking but at this stage I don’t have a clue how I might going about implementing it in the engine, It’s more something I would like to implement but probably won’t it’s always something I could look into in the long term after I’ve finished uni if my engine hasn’t been a complete failure.
- Scene cameras – To view inside the scene, each view port will render the view given by a Scene Camera, The scene camera will hold data relating to the orientation, position and field of view. I pretty much have a clear idea how to implement this and I don’t think it’ll take to long.
- Objects – Everything object in the scene will inherit from a class called object, among these objects we will have container objects and entities, container objects will hold other containers and entities, This will group the entities so they can easily be manipulated and allows for a lot of flexibility. Entities Ideally will be able to be written in code or a scripting language if implemented.
I will leave it at that for now, there’s still a long list but it’s getting late so I leave it at that for now and probably add more at a later stage. If your one of the few that have found this blog please feel free to criticize my bad spelling and grammar. Thanks for Reading.