Subversion Repository Public Repository

Divide-Framework

This repository has no backups
This repository's network speed is throttled to 100KB/sec

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "Headers/SceneGraph.h"
#include "Hardware/Video/Headers/GFXDevice.h"
#include "Managers/Headers/SceneManager.h"
#include "Rendering/RenderPass/Headers/RenderQueue.h"
#include "Geometry/Material/Headers/Material.h"

namespace Divide {
    SceneGraph::SceneGraph()
    {
        _root = MemoryManager_NEW SceneGraphNode(this, MemoryManager_NEW SceneRoot(), "ROOT");
        _root->getComponent<RenderingComponent>()->castsShadows(false);
        _root->getComponent<RenderingComponent>()->receivesShadows(false);
        _root->setBBExclusionMask(TYPE_SKY |
            TYPE_LIGHT |
            TYPE_TRIGGER |
            TYPE_PARTICLE_EMITTER |
            TYPE_VEGETATION_GRASS |
            TYPE_VEGETATION_TREES);
    }

    SceneGraph::~SceneGraph()
    {
        D_PRINT_FN(Locale::get("DELETE_SCENEGRAPH"));
        SceneNode* root = _root->getNode<SceneRoot>();
        // Should recursively call unload on the entire scene graph
        _root->unload();
        // Should recursively call delete on the entire scene graph
        MemoryManager::DELETE(_root);
        // Delete the root scene node
        MemoryManager::DELETE(root);
    }

    void SceneGraph::idle() {
        for (SceneGraphNode*& it : _pendingDeletionNodes) {
            it->unload();
            it->getParent()->removeNode(it);
        }

        MemoryManager::DELETE_VECTOR(_pendingDeletionNodes);
    }

    void SceneGraph::sceneUpdate(const U64 deltaTime, SceneState& sceneState){
        _root->sceneUpdate(deltaTime, sceneState);
    }

    void SceneGraph::Intersect(const Ray& ray, F32 start, F32 end, vectorImpl<SceneGraphNode* >& selectionHits){
        _root->Intersect(ray, start, end, selectionHits);
    }

    void SceneGraph::print() {
        PRINT_FN(Locale::get("SCENEGRAPH_TITLE"));
        Console::getInstance().toggleTimeStamps(false);
        printInternal(_root);
        Console::getInstance().toggleTimeStamps(true);
    }

    ///Prints out the SceneGraph structure to the Console
    void SceneGraph::printInternal(SceneGraphNode* const sgn){
        if (!sgn) {
            return;
        }
        //Starting from the current node
        SceneGraphNode* parent = sgn;
        SceneGraphNode* tempParent = parent;
        U8 i = 0;
        //Count how deep in the graph we are
        //by counting how many ancestors we have before the "root" node
        while (tempParent != nullptr){
            tempParent = tempParent->getParent();
            i++;
        }
        //get out material's name
        Material* mat = nullptr;
        RenderingComponent* const renderable = parent->getComponent<RenderingComponent>();
        if (renderable) {
             mat = renderable->getMaterialInstance();
        }
        //Some strings to hold the names of our material and shader
        stringImpl material("none"), shader("none"), depthShader("none");
        //If we have a material
        if (mat){
            //Get the material's name
            material = mat->getName();
            //If we have a shader
            if (mat->getShaderInfo().getProgram()){
                //Get the shader's name
                shader = mat->getShaderInfo().getProgram()->getName();
            }
            if (mat->getShaderInfo(SHADOW_STAGE).getProgram()){
                //Get the depth shader's name
                depthShader = mat->getShaderInfo(SHADOW_STAGE).getProgram()->getName();
            }
            if (mat->getShaderInfo(Z_PRE_PASS_STAGE).getProgram()){
                //Get the depth shader's name
                depthShader = mat->getShaderInfo(Z_PRE_PASS_STAGE).getProgram()->getName();
            }
        }
        //Print our current node's information
        PRINT_FN(Locale::get("PRINT_SCENEGRAPH_NODE"), parent->getName().c_str(),
            parent->getNode()->getName().c_str(),
            material.c_str(),
            shader.c_str(),
            depthShader.c_str());
        //Repeat for each child, but prefix it with the appropriate number of dashes
        //Based on our ancestor counting earlier
        for (SceneGraphNode::NodeChildren::value_type& it : parent->getChildren()) {
            for (U8 j = 0; j < i; j++) {
                PRINT_F("-");
            }
            printInternal(it.second);
        }
    }
};

Commits for Divide-Framework/trunk/Source Code/Graphs/SceneGraph.cpp

Diff revisions: vs.
Revision Author Commited Message
331 Diff Diff IonutCava picture IonutCava Sat 06 Dec, 2014 20:53:45 +0000

[Ionut]
- Limited line length to 132 characters to improve readability and diff-comparisons
- Refactored memory allocation/deallocation functions
- Fixed a few compatibility issues with HashMap.h
- Fixed a bug in GPU Skinning shaders (cast a float to int)

330 Diff Diff IonutCava picture IonutCava Fri 10 Oct, 2014 17:19:11 +0000

[Ionut]
- New rendering algorithm :
— Perform second pass for visible nodes gathering all render commands and uploading them to an indirect draw buffer
— Render geometry with indirect draw commands
— Removed per-node range binding of the node buffer. Instead, bind the entire buffer once and index data in shaders
— Use “baseInstance” parameter from IndirectDrawCommand as a node buffer index
— Prefer DSA extensions for updating buffer data where applicable
- Moved all rendering specific code from SceneGraphNode to a new RenderingComponent
- Optimized “toString” utility function

328 Diff Diff IonutCava picture IonutCava Sat 04 Oct, 2014 18:03:36 +0000

[Ionut]
- Added per SceneGraphNode material instances. (Cloned from the SceneNode’s material)
- Improved shader loading for materials

326 Diff Diff IonutCava picture IonutCava Tue 30 Sep, 2014 21:11:32 +0000

[Ionut]
- Fixed more memory leaks
- Simplified Task interface and timing System
- Improved compatibility between Boost, STL and EASTL with random combinations of vectors, strings and maps
- Simplified Light class by removing the “slot” member
- Random optimizations

325 Diff Diff IonutCava picture IonutCava Wed 17 Sep, 2014 20:06:13 +0000

[Ionut]
- Reworked transform system:
— Parent transform chain system moved from Transform class to the PhysicsComponent
— PhysicsComponent now returns all transform values needed both global and local (still needs heavy optimization and caching)

- Reworked SceneGraph node management:
— Proper ref counting of SceneNodes and proper removing of resource (ResourceCache is now empty on destruction, as it should be)
— Removed parent transform tracking as that’s the PhysicsComponent’s responsibility
— Only nodes loaded via the ResourceCache are allowed to be added to the SceneGraph (added proper loaders for Impostors, Sky, etc)

- Optimized some of the math classes (mat4, mat3)

324 Diff Diff IonutCava picture IonutCava Sun 14 Sep, 2014 14:01:39 +0000

[Ionut]
- New memory management system (no custom allocators in this commit)
— Memory tracer to detect memory leaks on shutdown (from: https://www.relisoft.com/book/tech/9new.html)
— SAFE_DELETE_XYZ are now inline template functions not macros
— ASSERTION system now supports logging and message boxes and continue on error configurable for each build type
— Fixed a lot of memory leaks detected by the new system (some still remain)

- Added SRGB support (part 1)
— Albedo textures are loaded as SRGB (make sure resources are SRGB)
— Shaders output gamma corrected colors
— Moved terrain textures back to 2 array system (albedo and normal maps, albedo maps using a SRGB sampler)

- Sky is now loaded via the ResourceCache system
- Added include safeguards in shader atoms

322 Diff Diff IonutCava picture IonutCava Sat 06 Sep, 2014 20:33:47 +0000

[Ionut]
- Refactored most of Boost related code to be C++11 based
— Boost is only used for ThreadPool, Mutex handling, XML parsing and networking (ASIO)
— Function binds, threads, regex, NonCopyable base, Hashing algorithms and more are now using C++11 libraries
- Replaced all FOR_EACH calls with standard, range, “for” calls

321 Diff Diff IonutCava picture IonutCava Wed 03 Sep, 2014 22:05:15 +0000

[Ionut]
- Added support (and enabled by default) for the EASTL library (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html / https://github.com/paulhodge/EASTL)
— Strings, vectors and hash_maps can be combined from EASTL, STL and Boost (not all combinations work. e.g. EASTL strings with STL/Boost containers due to the lack of a proper hash function)

318 Diff Diff IonutCava picture IonutCava Sat 30 Aug, 2014 17:35:53 +0000

[Ionut]
- Wrapped the entire code in a “Divide” namespace
- VertexBuffers now call “shrink_to_fit” on all internal data storage
- Improved some vector performance by preferring “emplace_back” instead of “push_back” + proepr usage of reserve / resize
- Wrapped OIS specific types and classes in Divide::Input namespace
- Added the messageBox.layout file (forgot it in the previous few commits)

307 IonutCava picture IonutCava Tue 12 Aug, 2014 19:45:12 +0000

[Ionut]
- More editor work:
— Per object skeleton rendering, bounding box rendering and shadow map toggling
— Full screen depth preview toggle
— Text entry based transforms