From c37a4fbfcf26bf79ed6a7f9357ff69ede9ed8ace Mon Sep 17 00:00:00 2001 From: floralrainfall Date: Mon, 10 Jul 2023 19:33:38 -0400 Subject: [PATCH] shading, proto-lighting --- Projects/Client/Common/Source/OgreWidget.cpp | 12 +++++-- Projects/Client/Studio/Source/main.cpp | 4 +-- .../Engine/Header/App/V8/Tree/Instance.hpp | 8 +++++ .../Engine/Header/App/V8/World/Workspace.hpp | 3 ++ Projects/Engine/Header/App/V8/World/World.hpp | 7 +++- .../Source/App/V8/DataModel/BasePart.cpp | 34 ++++++++++++------- .../Engine/Source/App/V8/Tree/Instance.cpp | 2 ++ .../Engine/Source/App/V8/World/Workspace.cpp | 13 ++++--- Projects/Engine/Source/App/V8/World/World.cpp | 6 +++- 9 files changed, 65 insertions(+), 24 deletions(-) diff --git a/Projects/Client/Common/Source/OgreWidget.cpp b/Projects/Client/Common/Source/OgreWidget.cpp index 8a8d6e3..7fd2cff 100644 --- a/Projects/Client/Common/Source/OgreWidget.cpp +++ b/Projects/Client/Common/Source/OgreWidget.cpp @@ -46,7 +46,7 @@ namespace RNR ogreSceneManager = ogreRoot->createSceneManager(); ogreSceneManager->setSkyBox(true, "sky/null_plainsky512", 5.f); - ogreSceneManager->setAmbientLight(Ogre::ColourValue::White); + ogreSceneManager->setAmbientLight(Ogre::ColourValue(0.5f,0.5f,0.5f)); if(Ogre::RTShader::ShaderGenerator::initialize()) { @@ -58,11 +58,16 @@ namespace RNR else printf("OgreWidget::initializeOgre: unable to initialize ShaderGenerator\n"); - Ogre::Light* light = ogreSceneManager->createLight("MainLight"); + Ogre::Light* light = ogreSceneManager->createLight("SunLight"); Ogre::SceneNode* lightNode = ogreSceneManager->getRootSceneNode()->createChildSceneNode(); lightNode->setPosition(0, 10, 15); + lightNode->setDirection(-0.25, -0.5, -0.5); lightNode->attachObject(light); + light->setDiffuseColour(0.9, 0.9, 1.0); + light->setSpecularColour(1.0, 1.0, 1.0); + light->setType(Ogre::Light::LT_DIRECTIONAL); + Ogre::SceneNode* camNode = ogreSceneManager->getRootSceneNode()->createChildSceneNode(); camNode->setPosition(0, 0, 5); camNode->lookAt(Ogre::Vector3(0, sinf(render_time), cosf(render_time)), Ogre::Node::TS_PARENT); @@ -83,7 +88,8 @@ namespace RNR this->render_time += ogreRoot->getTimer()->getMilliseconds() / 1000.0; ogreRoot->getTimer()->reset(); - ogreCamera->getParentSceneNode()->lookAt(Ogre::Vector3(sinf(this->render_time)*10.f,0,cosf(this->render_time)*10.f), Ogre::Node::TS_PARENT); + ogreCamera->getParentSceneNode()->setPosition(Ogre::Vector3(sinf(this->render_time)*10,5.f,cosf(this->render_time)*10)); + ogreCamera->getParentSceneNode()->lookAt(Ogre::Vector3(0,0,0), Ogre::Node::TS_PARENT); ogreRoot->renderOneFrame(this->delta); } diff --git a/Projects/Client/Studio/Source/main.cpp b/Projects/Client/Studio/Source/main.cpp index 20092b2..cae0f93 100644 --- a/Projects/Client/Studio/Source/main.cpp +++ b/Projects/Client/Studio/Source/main.cpp @@ -20,8 +20,8 @@ int main(int argc, char** argv) window.show(); window.ogreWidget->initializeOgre(); - RNR::World* world = new RNR::World(); - Ogre::SceneNode* workspace_node = window.ogreWidget->ogreSceneManager->createSceneNode("Workspace"); + 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()); diff --git a/Projects/Engine/Header/App/V8/Tree/Instance.hpp b/Projects/Engine/Header/App/V8/Tree/Instance.hpp index 79716f7..962f854 100644 --- a/Projects/Engine/Header/App/V8/Tree/Instance.hpp +++ b/Projects/Engine/Header/App/V8/Tree/Instance.hpp @@ -9,9 +9,15 @@ namespace RNR { + class World; + class Instance { + protected: + static World* world; + private: + std::string m_name; RNR::Instance* m_parent; std::vector m_children; @@ -24,6 +30,8 @@ namespace RNR bool contains(RNR::Instance* child); bool isAncestorOf(RNR::Instance* instance); + static void setWorld(World* world) { Instance::world = world; } + virtual bool askSetParent(RNR::Instance* instance); // derive this bool canSetParent(RNR::Instance* instance); virtual bool askAddChild(RNR::Instance* instance); // derive this diff --git a/Projects/Engine/Header/App/V8/World/Workspace.hpp b/Projects/Engine/Header/App/V8/World/Workspace.hpp index 33df1ff..622f09d 100644 --- a/Projects/Engine/Header/App/V8/World/Workspace.hpp +++ b/Projects/Engine/Header/App/V8/World/Workspace.hpp @@ -18,6 +18,9 @@ namespace RNR virtual Ogre::Real getBoundingRadius(void) const; virtual void visitRenderables(Ogre::Renderable::Visitor* visitor, bool debugRenderables); private: + Ogre::AxisAlignedBox m_bbox; + Ogre::String m_type; + void renderQueueAddInstance(Ogre::RenderQueue* queue, Instance* instance); }; } diff --git a/Projects/Engine/Header/App/V8/World/World.hpp b/Projects/Engine/Header/App/V8/World/World.hpp index 1dd9f62..177c79d 100644 --- a/Projects/Engine/Header/App/V8/World/World.hpp +++ b/Projects/Engine/Header/App/V8/World/World.hpp @@ -2,6 +2,7 @@ #include #include +#include namespace RNR { @@ -10,9 +11,11 @@ namespace RNR private: Instance* m_datamodel; Workspace* m_workspace; + Ogre::Root* m_ogreRoot; + Ogre::SceneManager* m_ogreSceneManager; public: - World(); + World(Ogre::Root* ogre, Ogre::SceneManager* ogreScene); ~World(); void preStep(); @@ -23,5 +26,7 @@ namespace RNR void setDatamodel(Instance* instance) { m_datamodel = instance; } Workspace* getWorkspace() { return m_workspace; } void setWorkspace(Workspace* workspace) { m_workspace = workspace; } + Ogre::Root* getOgreRoot() { return m_ogreRoot; } + Ogre::SceneManager* getOgreSceneManager() { return m_ogreSceneManager; } }; } \ No newline at end of file diff --git a/Projects/Engine/Source/App/V8/DataModel/BasePart.cpp b/Projects/Engine/Source/App/V8/DataModel/BasePart.cpp index d51de13..2897be6 100644 --- a/Projects/Engine/Source/App/V8/DataModel/BasePart.cpp +++ b/Projects/Engine/Source/App/V8/DataModel/BasePart.cpp @@ -1,14 +1,17 @@ #include +#include namespace RNR { Ogre::MeshPtr BasePart::m_partMesh = 0; - BasePart::BasePart() : m_matrix(), PVInstance() + BasePart::BasePart() : m_matrix(), PVInstance(), Ogre::Renderable() { setName("Part"); - + updateMatrix(); + 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); @@ -20,24 +23,31 @@ namespace RNR { m_matrix = m_cframe.getMatrix(); m_position = m_cframe.getPosition(); - m_nearbyLights = Ogre::LightList(); - } const Ogre::MaterialPtr& BasePart::getMaterial() const { - return m_material; + Ogre::SubMesh* submesh = m_partMesh->getSubMesh(0); + return submesh->getMaterial(); } void BasePart::getRenderOperation(Ogre::RenderOperation& op) { Ogre::SubMesh* submesh = m_partMesh->getSubMesh(0); - op.operationType = op.OT_TRIANGLE_LIST; - op.vertexData = submesh->vertexData; - op.indexData = submesh->indexData; - op.numberOfInstances = 1; - op.srcRenderable = this; - op.useIndexes = true; + if(submesh) + { + op.operationType = op.OT_TRIANGLE_LIST; + if(submesh->useSharedVertices == false) + op.vertexData = submesh->vertexData; + else + op.vertexData = m_partMesh->sharedVertexData; + op.indexData = submesh->indexData; + op.numberOfInstances = 1; + op.srcRenderable = this; + op.useIndexes = true; + } + else + printf("BasePart::getRenderOperation: couldnt get submesh\n"); } Ogre::Real BasePart::getSquaredViewDepth(const Ogre::Camera* cam) const @@ -53,6 +63,6 @@ namespace RNR void BasePart::getWorldTransforms(Ogre::Matrix4* xform) const { - xform[0] = m_matrix; + *xform = m_matrix; } } \ No newline at end of file diff --git a/Projects/Engine/Source/App/V8/Tree/Instance.cpp b/Projects/Engine/Source/App/V8/Tree/Instance.cpp index 827e2f3..b944a3a 100644 --- a/Projects/Engine/Source/App/V8/Tree/Instance.cpp +++ b/Projects/Engine/Source/App/V8/Tree/Instance.cpp @@ -2,6 +2,8 @@ namespace RNR { + World* Instance::world = 0; + Instance::Instance() { m_parent = 0; diff --git a/Projects/Engine/Source/App/V8/World/Workspace.cpp b/Projects/Engine/Source/App/V8/World/Workspace.cpp index aad767a..e002fd4 100644 --- a/Projects/Engine/Source/App/V8/World/Workspace.cpp +++ b/Projects/Engine/Source/App/V8/World/Workspace.cpp @@ -6,11 +6,12 @@ namespace RNR Workspace::Workspace() : Instance(), Ogre::MovableObject() { setName("Workspace"); + m_type = Ogre::String("Entity"); + m_bbox = Ogre::AxisAlignedBox(-1000,-1000,-1000, 1000,1000,1000); } void Workspace::_updateRenderQueue(Ogre::RenderQueue* queue) { - printf("!!!!!!!!!!!!!!!!!!!!1 _updateRenderQueue\n"); std::vector* children = getChildren(); for(auto& child : *children) { @@ -21,22 +22,24 @@ namespace RNR 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); } - BasePart* rend = dynamic_cast(instance); - queue->addRenderable(rend); } const Ogre::String& Workspace::getMovableType(void) const { - return Ogre::String("Entity"); + printf("Workspace::getMovableType\n"); + return m_type; } const Ogre::AxisAlignedBox& Workspace::getBoundingBox(void) const { - return Ogre::AxisAlignedBox(Ogre::Vector3(-1000,-1000,-1000),Ogre::Vector3(1000,1000,1000)); + return m_bbox; } Ogre::Real Workspace::getBoundingRadius(void) const diff --git a/Projects/Engine/Source/App/V8/World/World.cpp b/Projects/Engine/Source/App/V8/World/World.cpp index 7b6a69d..9af0ce1 100644 --- a/Projects/Engine/Source/App/V8/World/World.cpp +++ b/Projects/Engine/Source/App/V8/World/World.cpp @@ -3,8 +3,12 @@ namespace RNR { - World::World() + World::World(Ogre::Root* ogre, Ogre::SceneManager* ogreSceneManager) { + Instance::setWorld(this); + + m_ogreRoot = ogre; + m_ogreSceneManager = ogreSceneManager; m_datamodel = new Instance(); m_datamodel->setName("DataModel"); m_workspace = new Workspace();