From 0caf3b96b4b16b1be3ba76a765996bf53fcf888a Mon Sep 17 00:00:00 2001 From: floralrainfall Date: Tue, 11 Jul 2023 12:42:38 -0400 Subject: [PATCH] workspace instancing (needs shader) --- Content/fonts/Material.material | 7 +- Content/fonts/OgreXMLConverter.log | 42 ++++++------ Content/fonts/brick_tex.PNG | Bin 0 -> 5740 bytes Projects/Client/Studio/Source/main.cpp | 4 -- .../Engine/Header/App/CoordinateFrame.hpp | 1 + .../Engine/Header/App/V8/Tree/Instance.hpp | 7 ++ .../Engine/Header/App/V8/World/Workspace.hpp | 18 ++---- .../Engine/Source/App/CoordinateFrame.cpp | 4 +- .../Source/App/V8/DataModel/BasePart.cpp | 5 +- .../Engine/Source/App/V8/Tree/Instance.cpp | 2 + .../Engine/Source/App/V8/World/Workspace.cpp | 60 ++++++------------ Projects/Engine/Source/App/V8/World/World.cpp | 2 + 12 files changed, 70 insertions(+), 82 deletions(-) create mode 100644 Content/fonts/brick_tex.PNG diff --git a/Content/fonts/Material.material b/Content/fonts/Material.material index 5a4c9c8..36212e6 100644 --- a/Content/fonts/Material.material +++ b/Content/fonts/Material.material @@ -1,4 +1,4 @@ -// generated by blender2ogre 0.8.3 on 2023-07-10 17:26:00 +// generated by blender2ogre 0.8.3 on 2023-07-10 20:18:50 material Material { receive_shadows on technique { @@ -6,6 +6,11 @@ material Material { diffuse 0.8 0.8 0.8 1.0 specular 0.512 0.512 0.512 1.0 64.0 + texture_unit { + texture fonts/brick_tex.PNG + tex_address_mode wrap + colour_op modulate + } } } } diff --git a/Content/fonts/OgreXMLConverter.log b/Content/fonts/OgreXMLConverter.log index 07d3641..92bafe4 100644 --- a/Content/fonts/OgreXMLConverter.log +++ b/Content/fonts/OgreXMLConverter.log @@ -1,21 +1,21 @@ -17:26:00: XMLMeshSerializer reading mesh data from /home/caesium/projects/rbxnu/Content/fonts/Cube.mesh.xml... -17:26:00: Reading geometry... -17:26:00: Geometry done... -17:26:00: Reading submeshes... -17:26:00: Submeshes done. -17:26:00: Reading mesh names... -17:26:00: Mesh names done. -17:26:00: XMLMeshSerializer import successful. -17:26:00: MeshSerializer writing mesh data to stream /home/caesium/projects/rbxnu/Content/fonts/Cube.mesh... -17:26:00: File header written. -17:26:00: Writing mesh data... -17:26:00: Writing submesh... -17:26:00: Exporting submesh texture aliases... -17:26:00: Submesh texture aliases exported. -17:26:00: Submesh exported. -17:26:00: Exporting bounds information.... -17:26:00: Bounds information exported. -17:26:00: Exporting submesh name table... -17:26:00: Submesh name table exported. -17:26:00: Mesh data exported. -17:26:00: MeshSerializer export successful. +20:18:50: XMLMeshSerializer reading mesh data from /home/caesium/projects/rbxnu/Content/fonts/Cube.mesh.xml... +20:18:50: Reading geometry... +20:18:50: Geometry done... +20:18:50: Reading submeshes... +20:18:50: Submeshes done. +20:18:50: Reading mesh names... +20:18:50: Mesh names done. +20:18:50: XMLMeshSerializer import successful. +20:18:50: MeshSerializer writing mesh data to stream /home/caesium/projects/rbxnu/Content/fonts/Cube.mesh... +20:18:50: File header written. +20:18:50: Writing mesh data... +20:18:50: Writing submesh... +20:18:50: Exporting submesh texture aliases... +20:18:50: Submesh texture aliases exported. +20:18:50: Submesh exported. +20:18:50: Exporting bounds information.... +20:18:50: Bounds information exported. +20:18:50: Exporting submesh name table... +20:18:50: Submesh name table exported. +20:18:50: Mesh data exported. +20:18:50: MeshSerializer export successful. diff --git a/Content/fonts/brick_tex.PNG b/Content/fonts/brick_tex.PNG new file mode 100644 index 0000000000000000000000000000000000000000..0b8a6c58b0e51e4c8d6b82f942ebb302f8e36fa4 GIT binary patch literal 5740 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 IZ#c*PAF##Wr2qf` literal 0 HcmV?d00001 diff --git a/Projects/Client/Studio/Source/main.cpp b/Projects/Client/Studio/Source/main.cpp index cae0f93..f1c1d11 100644 --- a/Projects/Client/Studio/Source/main.cpp +++ b/Projects/Client/Studio/Source/main.cpp @@ -21,10 +21,6 @@ int main(int argc, char** argv) window.ogreWidget->initializeOgre(); RNR::World* world = new RNR::World(window.ogreWidget->ogreRoot, window.ogreWidget->ogreSceneManager); - Ogre::SceneNode* workspace_node = window.ogreWidget->ogreSceneManager->getRootSceneNode()->createChildSceneNode(); - workspace_node->attachObject(world->getWorkspace()); - workspace_node->setVisible(true); - printf("main: workspace = %p (%p)\n",workspace_node, world->getWorkspace()); window.updateTree(world->getDatamodel()); while (window.isVisible()) diff --git a/Projects/Engine/Header/App/CoordinateFrame.hpp b/Projects/Engine/Header/App/CoordinateFrame.hpp index 3ec459a..da92dab 100644 --- a/Projects/Engine/Header/App/CoordinateFrame.hpp +++ b/Projects/Engine/Header/App/CoordinateFrame.hpp @@ -6,6 +6,7 @@ namespace RNR class CoordinateFrame { Ogre::Vector3 m_position; + Ogre::Vector3 m_scale; Ogre::Matrix3 m_rotation; public: CoordinateFrame(); diff --git a/Projects/Engine/Header/App/V8/Tree/Instance.hpp b/Projects/Engine/Header/App/V8/Tree/Instance.hpp index 962f854..25c885c 100644 --- a/Projects/Engine/Header/App/V8/Tree/Instance.hpp +++ b/Projects/Engine/Header/App/V8/Tree/Instance.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -18,6 +19,8 @@ namespace RNR private: + Ogre::SceneNode* m_node; + Ogre::MovableObject* m_object; std::string m_name; RNR::Instance* m_parent; std::vector m_children; @@ -44,6 +47,10 @@ namespace RNR void setParent(RNR::Instance* newParent); void setName(std::string name); + void setNode(Ogre::SceneNode* node) { m_node = node; }; + Ogre::SceneNode* getNode() { return m_node; }; + void setObject(Ogre::MovableObject* object) { m_object = object; }; + Ogre::MovableObject* getObject() { return m_object; }; std::vector* getChildren() { return &this->m_children; }; int numChildren() { return this->m_children.size(); }; diff --git a/Projects/Engine/Header/App/V8/World/Workspace.hpp b/Projects/Engine/Header/App/V8/World/Workspace.hpp index 622f09d..9e29347 100644 --- a/Projects/Engine/Header/App/V8/World/Workspace.hpp +++ b/Projects/Engine/Header/App/V8/World/Workspace.hpp @@ -5,22 +5,16 @@ namespace RNR { - // this acts as both an Instance to fit in the RNR graph, and as an Ogre MovableObject to fit in the Ogre graph - // all instances that are Renderable are stored in the children of this - class Workspace : public Instance, public Ogre::MovableObject + class Workspace : public Instance { public: Workspace(); - virtual void _updateRenderQueue(Ogre::RenderQueue* queue); - virtual const Ogre::String& getMovableType(void) const; - virtual const Ogre::AxisAlignedBox& getBoundingBox(void) const; - virtual Ogre::Real getBoundingRadius(void) const; - virtual void visitRenderables(Ogre::Renderable::Visitor* visitor, bool debugRenderables); + void build(); private: - Ogre::AxisAlignedBox m_bbox; - Ogre::String m_type; - - void renderQueueAddInstance(Ogre::RenderQueue* queue, Instance* instance); + Ogre::InstanceManager* m_instMan; + Ogre::SceneNode* m_worldspawn; + + void buildChild(Instance* child); }; } diff --git a/Projects/Engine/Source/App/CoordinateFrame.cpp b/Projects/Engine/Source/App/CoordinateFrame.cpp index 852d7ca..da540f6 100644 --- a/Projects/Engine/Source/App/CoordinateFrame.cpp +++ b/Projects/Engine/Source/App/CoordinateFrame.cpp @@ -2,7 +2,7 @@ namespace RNR { - CoordinateFrame::CoordinateFrame() : m_position(0.f,0.f,0.f), m_rotation() + CoordinateFrame::CoordinateFrame() : m_position(0.f,0.f,0.f), m_scale(1.f,1.f,1.f), m_rotation() { m_rotation.FromEulerAnglesXYZ(Ogre::Radian(0.f), Ogre::Radian(0.f), Ogre::Radian(0.f)); } @@ -10,7 +10,7 @@ namespace RNR Ogre::Matrix4 CoordinateFrame::getMatrix() { Ogre::Matrix4 res = Ogre::Matrix4(); - res.makeTransform(m_position, Ogre::Vector3(1.f,1.f,1.f), Ogre::Quaternion(m_rotation)); + res.makeTransform(m_position, m_scale, Ogre::Quaternion(m_rotation)); return res; } diff --git a/Projects/Engine/Source/App/V8/DataModel/BasePart.cpp b/Projects/Engine/Source/App/V8/DataModel/BasePart.cpp index 2897be6..ad3b22d 100644 --- a/Projects/Engine/Source/App/V8/DataModel/BasePart.cpp +++ b/Projects/Engine/Source/App/V8/DataModel/BasePart.cpp @@ -13,10 +13,10 @@ namespace RNR m_nearbyLights = Ogre::LightList(); m_nearbyLights.insert(m_nearbyLights.begin(), world->getOgreSceneManager()->getLight("SunLight")); - m_material = Ogre::MaterialManager::getSingletonPtr()->create("part", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); if(m_partMesh == 0) m_partMesh = Ogre::Root::getSingletonPtr()->getMeshManager()->load("fonts/Cube.mesh", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); + m_material = m_partMesh->getSubMesh(0)->getMaterial(); } void BasePart::updateMatrix() @@ -27,8 +27,7 @@ namespace RNR const Ogre::MaterialPtr& BasePart::getMaterial() const { - Ogre::SubMesh* submesh = m_partMesh->getSubMesh(0); - return submesh->getMaterial(); + return m_material; } void BasePart::getRenderOperation(Ogre::RenderOperation& op) diff --git a/Projects/Engine/Source/App/V8/Tree/Instance.cpp b/Projects/Engine/Source/App/V8/Tree/Instance.cpp index b944a3a..5e3e9dc 100644 --- a/Projects/Engine/Source/App/V8/Tree/Instance.cpp +++ b/Projects/Engine/Source/App/V8/Tree/Instance.cpp @@ -6,6 +6,8 @@ namespace RNR Instance::Instance() { + m_node = 0; + m_object = 0; m_parent = 0; setName("Instance"); } diff --git a/Projects/Engine/Source/App/V8/World/Workspace.cpp b/Projects/Engine/Source/App/V8/World/Workspace.cpp index e002fd4..607c4df 100644 --- a/Projects/Engine/Source/App/V8/World/Workspace.cpp +++ b/Projects/Engine/Source/App/V8/World/Workspace.cpp @@ -1,54 +1,36 @@ #include +#include #include namespace RNR { - Workspace::Workspace() : Instance(), Ogre::MovableObject() + Workspace::Workspace() : Instance() { setName("Workspace"); - m_type = Ogre::String("Entity"); - m_bbox = Ogre::AxisAlignedBox(-1000,-1000,-1000, 1000,1000,1000); + m_instMan = world->getOgreSceneManager()->createInstanceManager("workspacePartInstanceManager", "fonts/Cube.mesh", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::InstanceManager::InstancingTechnique::HWInstancingBasic, 255); + m_worldspawn = world->getOgreSceneManager()->getRootSceneNode()->createChildSceneNode(); } - void Workspace::_updateRenderQueue(Ogre::RenderQueue* queue) + void Workspace::build() { - std::vector* children = getChildren(); - for(auto& child : *children) + for(auto& child : *getChildren()) + buildChild(child); + } + + void Workspace::buildChild(Instance* child) + { + for(auto& child2 : *child->getChildren()) + buildChild(child2); + BasePart* child_part = (BasePart*)child; + Ogre::InstancedEntity* child_ent = (Ogre::InstancedEntity*)child->getObject(); + if(!child_ent) { - renderQueueAddInstance(queue, child); + child_ent = m_instMan->createInstancedEntity("fonts/Material"); + child_ent->setUserAny(child); + child->setObject(child_ent); } - } - - void Workspace::renderQueueAddInstance(Ogre::RenderQueue* queue, Instance* instance) - { - std::vector* children = instance->getChildren(); - BasePart* rend = dynamic_cast(instance); - queue->addRenderable(rend); - - for(auto& child : *children) - { - renderQueueAddInstance(queue, child); - } - } - - const Ogre::String& Workspace::getMovableType(void) const - { - printf("Workspace::getMovableType\n"); - return m_type; - } - - const Ogre::AxisAlignedBox& Workspace::getBoundingBox(void) const - { - return m_bbox; - } - - Ogre::Real Workspace::getBoundingRadius(void) const - { - return 100; - } - - void Workspace::visitRenderables(Ogre::Renderable::Visitor* visitor, bool debugRenderables) - { + child_ent->setPosition(child_part->getCFrame().getPosition()); + child_ent->setOrientation(Ogre::Quaternion(child_part->getCFrame().getRotation())); } } \ No newline at end of file diff --git a/Projects/Engine/Source/App/V8/World/World.cpp b/Projects/Engine/Source/App/V8/World/World.cpp index 9af0ce1..06b091f 100644 --- a/Projects/Engine/Source/App/V8/World/World.cpp +++ b/Projects/Engine/Source/App/V8/World/World.cpp @@ -18,6 +18,8 @@ namespace RNR BasePart* test2 = new BasePart(); test->setParent(m_datamodel); test2->setParent(m_workspace); + + m_workspace->build(); } World::~World()