Irrlicht is extremely easy to use, but the interface to the engine can be made even simpler.
We need an intelligent world manager with dynamic algorithm selection.
This manager should be able to optimize the scene for quickly responding to sequences of geometric queries.
( Are such things possible in C++ where logic is hardcoded ? )
In pseudocode:
Code: Select all
class WorldManager {
public:
// ctors, dtors, etc.
// ...
//--- Interface will be MUCH simpler. Let the engine decide which algorithms to use.
// The user of the engine won't need to know about, say, spatial partitioning algorithms,
// needn't specify exact types of scene nodes to create, adjust and experiment with settings,
// striving to achieve optimal performance, etc.
private:
// For example, the engine can exploit parallelism, or fast and memory hungry algorithms, or anything else,
// based on the machine characteristics.
void Pre_AnalyzeHardwareCapabilities();
void Pre_AnalyzeScene();
/* Ideally, scenes shouldn't require heavy preprocessing.
Internal acceleration structures should be refitted at run-time,
using information about how they are used.
*/
void Pre_MarkAreasWithAlgorithms();
#ifdef DEVELOPER_MODE
// The engine may use neural nets trained by experts.
void Pre_AskHumanAboutMyChoice();
void Pre_AskHumanToSelectAlgorithms();
#endif
void SaveStatistics();
//--- Dynamic algorithm selection ----------------------------------------------
void AnalyzeCurrentScene();
void SelectAlgosForRendering();
/* use deferred, self-organizing, self-optimizing data structures,
record usage history and refit them.
Real-time PVS generation, selecting occluders,
intelligent grouping of display objects ( for collision detection and culling ), selecting different bounding volumes,
culling physics, animations, shadows, special effects, etc.
*/
void SelectAlgosForHandlingCollisions();
/* use probabilistic, stochastic, non-deterministic algorithms if too many small polygons,
approximations( physics LOD ) when the time left for physics is short.
*/
/* the engine should learn and experiment, recognize patterns.
*/
void SelectBoundingVolumes();
void RefitAccelerationStructures();
void Schedule();
void Predict();
void Remember_achieved_FPS_and_Algorithms_used();
void UpdateStatistics();
void ReconsiderCurrentChoice();
// ...
#ifdef DEVELOPER_MODE
void AskHumanToClassifyTheScene(); // indoors/outdoors, closed/open, static/dynamic, structured/unstructured, etc.
void AskHumanWhichTechniquesArePreferred();
#endif
/* Havok ( Bullet ) has something similar to this.
private:
PriorityQueue< Task > m_pendingTasks;
List< Task > m_scheduledTasks;
// ...
*/
};
uncommon to install several such add-on cards.