From bcd5bd34c95fcbe29aef5dd9fc09a2829d1a20a3 Mon Sep 17 00:00:00 2001 From: floralrainfall Date: Sun, 16 Jul 2023 16:11:11 -0400 Subject: [PATCH] basic camera movement & reflection wip --- Projects/Client/Common/Source/OgreWidget.cpp | 13 ++++-- Projects/Client/Studio/Header/MainWindow.hpp | 1 + Projects/Client/Studio/Source/MainWindow.cpp | 13 +++++- Projects/Engine/CMakeLists.txt | 2 + Projects/Engine/Header/App/BrickColor.hpp | 2 + Projects/Engine/Header/App/Script/.gitkeep | 0 .../Header/App/Script/ReflectionProperty.hpp | 43 +++++++++++++++++++ .../Engine/Header/App/V8/Tree/Instance.hpp | 1 + Projects/Engine/Source/App/BrickColor.cpp | 29 ++++++------- Projects/Engine/Source/App/Script/.gitkeep | 0 .../Source/App/Script/ReflectionProperty.cpp | 6 +++ Projects/Engine/Source/App/V8/World/World.cpp | 6 ++- 12 files changed, 94 insertions(+), 22 deletions(-) delete mode 100644 Projects/Engine/Header/App/Script/.gitkeep create mode 100644 Projects/Engine/Header/App/Script/ReflectionProperty.hpp delete mode 100644 Projects/Engine/Source/App/Script/.gitkeep create mode 100644 Projects/Engine/Source/App/Script/ReflectionProperty.cpp diff --git a/Projects/Client/Common/Source/OgreWidget.cpp b/Projects/Client/Common/Source/OgreWidget.cpp index 8a5b3e4..4cc9472 100644 --- a/Projects/Client/Common/Source/OgreWidget.cpp +++ b/Projects/Client/Common/Source/OgreWidget.cpp @@ -23,6 +23,7 @@ namespace RNR this->setMouseTracking(true); this->setCursor(QCursor(Qt::BlankCursor)); this->setFocusPolicy(Qt::StrongFocus); + this->selectedInstance = 0; } void OgreWidget::initializeOgre() @@ -103,11 +104,15 @@ namespace RNR this->render_time += ogreRoot->getTimer()->getMilliseconds() / 1000.0; ogreRoot->getTimer()->reset(); - Ogre::AxisAlignedBox boundingBox = world->getWorkspace()->getBoundingBox(); - if(!boundingBox.isNull() && !boundingBox.isInfinite()) + RNR::ModelInstance* sel_model = dynamic_cast(selectedInstance); + if(sel_model) { - ogreCamera->getParentSceneNode()->setPosition(boundingBox.getCorner(Ogre::AxisAlignedBox::CornerEnum::NEAR_LEFT_TOP)); - ogreCamera->getParentSceneNode()->lookAt(boundingBox.getCenter(), Ogre::Node::TS_WORLD); + Ogre::AxisAlignedBox boundingBox = sel_model->getBoundingBox(); + if(!boundingBox.isNull() && !boundingBox.isInfinite()) + { + ogreCamera->getParentSceneNode()->setPosition(boundingBox.getCorner(Ogre::AxisAlignedBox::CornerEnum::NEAR_LEFT_TOP) * 1.1); + ogreCamera->getParentSceneNode()->lookAt(boundingBox.getCenter(), Ogre::Node::TS_WORLD); + } } ogreRoot->renderOneFrame(this->delta); diff --git a/Projects/Client/Studio/Header/MainWindow.hpp b/Projects/Client/Studio/Header/MainWindow.hpp index 455e03c..0f16fe6 100644 --- a/Projects/Client/Studio/Header/MainWindow.hpp +++ b/Projects/Client/Studio/Header/MainWindow.hpp @@ -34,6 +34,7 @@ class MainWindow : public QMainWindow public slots: void loadDatamodel(); + void selectInstance(QTreeWidgetItem *item, int column); protected: void widgetItemPrepare(QTreeWidgetItem* item, RNR::Instance* instance); void recurseTreeAddInstance(QTreeWidgetItem* parent, RNR::Instance* instance); diff --git a/Projects/Client/Studio/Source/MainWindow.cpp b/Projects/Client/Studio/Source/MainWindow.cpp index ae57b2e..86d1e2b 100644 --- a/Projects/Client/Studio/Source/MainWindow.cpp +++ b/Projects/Client/Studio/Source/MainWindow.cpp @@ -1,6 +1,7 @@ #include #include #include +#include MainWindow::MainWindow() { @@ -28,13 +29,13 @@ MainWindow::MainWindow() grid->addWidget(this->ogreWidget, 2, 0, 1, 2); explorer = new QTreeWidget(); + connect(explorer, SIGNAL(itemActivated(QTreeWidgetItem*, int)), this, SLOT(selectInstance(QTreeWidgetItem*, int))); grid->addWidget(explorer, 2, 2, 1, 1); content_widget->setLayout(grid); grid->setContentsMargins(0, 0, 0, 0); grid->setSpacing(0); - setWindowTitle(QString("RNR Studio")); setWindowIcon(QIcon(pixmap)); setCentralWidget(content_widget); @@ -54,6 +55,15 @@ void MainWindow::widgetItemPrepare(QTreeWidgetItem* item, RNR::Instance* instanc item->setIcon(0, icon); } +void MainWindow::selectInstance(QTreeWidgetItem *item, int column) +{ + RNR::Instance* instance = item->data(0, Qt::UserRole).value(); + if(dynamic_cast(instance)) + { + ogreWidget->selectedInstance = instance; + } +} + void MainWindow::recurseTreeAddInstance(QTreeWidgetItem* parent, RNR::Instance* instance) { for(auto& child : *instance->getChildren()) @@ -62,6 +72,7 @@ void MainWindow::recurseTreeAddInstance(QTreeWidgetItem* parent, RNR::Instance* widgetItemPrepare(instance_w, child); instance_w->setText(0, QString(child->getName().c_str())); instance_w->setData(0, Qt::UserRole, QVariant::fromValue(child)); + recurseTreeAddInstance(instance_w, child); parent->addChild(instance_w); } diff --git a/Projects/Engine/CMakeLists.txt b/Projects/Engine/CMakeLists.txt index 07615cd..b59614f 100644 --- a/Projects/Engine/CMakeLists.txt +++ b/Projects/Engine/CMakeLists.txt @@ -2,6 +2,7 @@ add_library(Engine STATIC Header/Helpers/Name.hpp Header/Helpers/Strings.hpp Header/Helpers/XML.hpp + Header/App/Script/ReflectionProperty.hpp Header/App/GUI/GuiBase3d.hpp Header/App/GUI/InstanceAdornment.hpp Header/App/GUI/SelectionBox.hpp @@ -22,6 +23,7 @@ add_library(Engine STATIC Source/Helpers/Name.cpp Source/Helpers/Strings.cpp Source/Helpers/XML.cpp + Source/App/Script/ReflectionProperty.cpp Source/App/GUI/GuiBase3d.cpp Source/App/GUI/InstanceAdornment.cpp Source/App/GUI/SelectionBox.cpp diff --git a/Projects/Engine/Header/App/BrickColor.hpp b/Projects/Engine/Header/App/BrickColor.hpp index ba4525a..2dfe81e 100644 --- a/Projects/Engine/Header/App/BrickColor.hpp +++ b/Projects/Engine/Header/App/BrickColor.hpp @@ -12,6 +12,8 @@ namespace RNR Ogre::Vector3 color_val; Ogre::MaterialPtr color_material; + + void buildMaterial(); public: BrickColor(int color_id, std::string name, Ogre::Vector3 color); static Ogre::Vector3 color(int brickcolor); diff --git a/Projects/Engine/Header/App/Script/.gitkeep b/Projects/Engine/Header/App/Script/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/Projects/Engine/Header/App/Script/ReflectionProperty.hpp b/Projects/Engine/Header/App/Script/ReflectionProperty.hpp new file mode 100644 index 0000000..d79cff6 --- /dev/null +++ b/Projects/Engine/Header/App/Script/ReflectionProperty.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include +#include + +namespace RNR +{ + enum ReflectionPropertyAccess + { + ACCESS_SCRIPT, + ACCESS_CONSOLE, + ACCESS_RNR, + }; + + template + class ReflectionProperty + { + private: + std::string m_name; + ReflectionPropertyAccess m_access; + public: + ReflectionProperty(std::string name, ReflectionPropertyAccess access, T(*getter), T(*setter)) + { + this->m_name = name; + this->m_access = access; + this->getter = getter; + this->setter = setter; + } + + bool access(ReflectionPropertyAccess accessor) + { + return this->m_access <= accessor; + } + + char* class_name() + { + return boost::typeindex::type_id().pretty_name(); + } + + T (*getter)(); + void (*setter)(T val); + }; +} \ No newline at end of file diff --git a/Projects/Engine/Header/App/V8/Tree/Instance.hpp b/Projects/Engine/Header/App/V8/Tree/Instance.hpp index 5d909e9..8c53f1e 100644 --- a/Projects/Engine/Header/App/V8/Tree/Instance.hpp +++ b/Projects/Engine/Header/App/V8/Tree/Instance.hpp @@ -37,6 +37,7 @@ namespace RNR bool contains(RNR::Instance* child); bool isAncestorOf(RNR::Instance* instance); + static World* getWorld() { return Instance::world; } static void setWorld(World* world) { Instance::world = world; } virtual bool askSetParent(RNR::Instance* instance); // derive this diff --git a/Projects/Engine/Source/App/BrickColor.cpp b/Projects/Engine/Source/App/BrickColor.cpp index 20862b0..516a0da 100644 --- a/Projects/Engine/Source/App/BrickColor.cpp +++ b/Projects/Engine/Source/App/BrickColor.cpp @@ -90,6 +90,17 @@ namespace RNR this->color_val = color; } + void BrickColor::buildMaterial() + { + color_material = Ogre::MaterialManager::getSingletonPtr()->getByName("materials/partinstanced"); + color_material = color_material->clone(Ogre::String("tmp_part/") + Ogre::StringConverter::toString(color_id)); + Ogre::Technique* mat_tech = color_material->getTechnique(0); + Ogre::Pass* mat_pass = mat_tech->getPass(0); + Ogre::TextureUnitState* part_texunit = mat_pass->getTextureUnitState(0); + part_texunit->setColourOperationEx(Ogre::LayerBlendOperationEx::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, Ogre::ColourValue(color_val.x, color_val.y, color_val.z)); + Ogre::RTShader::ShaderGenerator::getSingletonPtr()->validateScheme(mat_tech->getSchemeName()); + } + Ogre::Vector3 BrickColor::color(int brickcolor) { for(int i = 0; i < sizeof(brickcolors) / sizeof(BrickColor); i++) @@ -109,26 +120,12 @@ namespace RNR if(brickcolors[i].color_id == brickcolor) { if(!brickcolors[i].color_material) - { - brickcolors[i].color_material = Ogre::MaterialManager::getSingletonPtr()->getByName("materials/partinstanced"); - brickcolors[i].color_material = brickcolors[i].color_material->clone(Ogre::String("tmp_part/") + Ogre::StringConverter::toString(brickcolor)); - Ogre::Technique* mat_tech = brickcolors[i].color_material->getTechnique(0); - Ogre::Pass* mat_pass = mat_tech->getPass(0); - Ogre::TextureUnitState* part_texunit = mat_pass->getTextureUnitState(0); - part_texunit->setColourOperationEx(Ogre::LayerBlendOperationEx::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, Ogre::ColourValue(brickcolors[i].color_val.x, brickcolors[i].color_val.y, brickcolors[i].color_val.z)); - } + brickcolors[i].buildMaterial(); return brickcolors[i].color_material; } } if(!brickcolors[0].color_material) - { - brickcolors[0].color_material = Ogre::MaterialManager::getSingletonPtr()->getByName("materials/partinstanced"); - brickcolors[0].color_material = brickcolors[0].color_material->clone(Ogre::String("tmp_part/") + Ogre::StringConverter::toString(brickcolor)); - Ogre::Technique* mat_tech = brickcolors[0].color_material->getTechnique(0); - Ogre::Pass* mat_pass = mat_tech->getPass(0); - Ogre::TextureUnitState* part_texunit = mat_pass->getTextureUnitState(0); - part_texunit->setColourOperationEx(Ogre::LayerBlendOperationEx::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, Ogre::ColourValue(brickcolors[0].color_val.x, brickcolors[0].color_val.y, brickcolors[0].color_val.z)); - } + brickcolors[0].buildMaterial(); return brickcolors[0].color_material; } diff --git a/Projects/Engine/Source/App/Script/.gitkeep b/Projects/Engine/Source/App/Script/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/Projects/Engine/Source/App/Script/ReflectionProperty.cpp b/Projects/Engine/Source/App/Script/ReflectionProperty.cpp new file mode 100644 index 0000000..351fac5 --- /dev/null +++ b/Projects/Engine/Source/App/Script/ReflectionProperty.cpp @@ -0,0 +1,6 @@ +#include + +namespace RNR +{ + +} \ 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 8321e55..35fec24 100644 --- a/Projects/Engine/Source/App/V8/World/World.cpp +++ b/Projects/Engine/Source/App/V8/World/World.cpp @@ -29,7 +29,6 @@ namespace RNR bool skip = false; Instance* instance; pugi::xml_attribute class_attr = node.attribute("class"); - printf("World::xmlAddItem: adding class %s\n", class_attr.as_string()); if(class_attr.as_string() == std::string("Part")) { @@ -61,6 +60,11 @@ namespace RNR { xmlAddItem(item, instance); } + + if(class_attr.as_string() == std::string("Model")) + { + ((ModelInstance*)instance)->build(); + } } void World::load(char* path)