Play Solo, Player & Players

This commit is contained in:
floralrainfall 2023-07-19 11:03:49 -04:00
parent 611f0e8d0f
commit 21b4368778
18 changed files with 213 additions and 12 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -39,6 +39,7 @@ class MainWindow : public QMainWindow
void selectInstance(QTreeWidgetItem *item, int column);
void run();
void pause();
void playSolo();
void dbg_pointlight();
protected:

View File

@ -114,6 +114,7 @@ void MainWindow::createToolbar()
QAction* run_action = toolbar->addAction(QIcon("content/textures/studio/icons/run.png"), "", this, SLOT(run()));
QAction* pause_action = toolbar->addAction(QIcon("content/textures/studio/icons/pause.png"), "", this, SLOT(pause()));
QAction* playSolo_action = toolbar->addAction(QIcon("content/textures/studio/icons/play.png"), "", this, SLOT(playSolo()));
#ifndef NDEBUG
toolbar->addSeparator();
@ -131,6 +132,17 @@ void MainWindow::pause()
this->ogreWidget->world->getRunService()->pause();
}
void MainWindow::playSolo()
{
this->ogreWidget->world->getRunService()->run();
RNR::Players* players = (RNR::Players*)this->ogreWidget->world->getDatamodel()->getService("Players");
RNR::Player* player = players->createLocalPlayer(0);
player->setName(QInputDialog::getText(this, "Player Name", "Enter your player name").toLocal8Bit().data());
updateTree(ogreWidget->world->getDatamodel());
}
void MainWindow::dbg_pointlight()
{
if(!ogreWidget->selectedInstance)
@ -144,8 +156,8 @@ void MainWindow::dbg_pointlight()
dbg_light->setParent(ogreWidget->selectedInstance);
double r = QInputDialog::getDouble(this, "Red", "Set red component [0.0-1.0]", 1.0, 0.0, 1.0, 2);
double g = QInputDialog::getDouble(this, "Blue", "Set blue component [0.0-1.0]", 1.0, 0.0, 1.0, 2);
double b = QInputDialog::getDouble(this, "Green", "Set green component [0.0-1.0]", 1.0, 0.0, 1.0, 2);
double g = QInputDialog::getDouble(this, "Green", "Set green component [0.0-1.0]", 1.0, 0.0, 1.0, 2);
double b = QInputDialog::getDouble(this, "Blue", "Set blue component [0.0-1.0]", 1.0, 0.0, 1.0, 2);
dbg_light->setColor(Ogre::Vector3(r,g,b));
updateTree(ogreWidget->world->getDatamodel());

View File

@ -4,6 +4,8 @@ add_library(Engine STATIC
Header/Helpers/XML.hpp
Header/Helpers/NormalId.hpp
Header/App/Script/ReflectionProperty.hpp
Header/App/Script/Script.hpp
Header/App/Script/ScriptContext.hpp
Header/App/GUI/GuiBase3d.hpp
Header/App/GUI/InstanceAdornment.hpp
Header/App/GUI/SelectionBox.hpp
@ -26,6 +28,8 @@ add_library(Engine STATIC
Header/App/BrickColor.hpp
Header/App/InputManager.hpp
Header/Network/GUID.hpp
Header/Network/Player.hpp
Header/Network/Players.hpp
Header/Rendering/Adorn.hpp
Source/Helpers/Name.cpp
@ -33,6 +37,7 @@ add_library(Engine STATIC
Source/Helpers/XML.cpp
Source/Helpers/NormalId.cpp
Source/App/Script/ReflectionProperty.cpp
Source/App/Script/Script.cpp
Source/App/GUI/GuiBase3d.cpp
Source/App/GUI/InstanceAdornment.cpp
Source/App/GUI/SelectionBox.cpp
@ -55,6 +60,8 @@ add_library(Engine STATIC
Source/App/InputManager.cpp
Source/App/V8/World/World.cpp
Source/Network/GUID.cpp
Source/Network/Player.cpp
Source/Network/Players.cpp
Source/Rendering/Adorn.cpp
)

View File

@ -14,6 +14,9 @@ namespace RNR
class TopMenuBar
{
Ogre::TextAreaOverlayElement* m_debugText;
Ogre::TextAreaOverlayElement* m_playerList;
Ogre::OverlayContainer* m_playerPanel;
Ogre::OverlayManager* m_overlayManager;
World* m_world;
public:
TopMenuBar(World* world);

View File

@ -0,0 +1,9 @@
#pragma once
namespace RNR
{
class ScriptContext
{
};
}

View File

@ -11,6 +11,8 @@ namespace RNR
{
protected:
int m_brickColor;
float m_transparency;
float m_reflectance;
Ogre::Matrix4 m_matrix;
Ogre::Vector3 m_position;
Ogre::Vector3 m_size;
@ -28,6 +30,11 @@ namespace RNR
Ogre::Vector3 getSize() { return m_size; }
Ogre::Vector4 getColor() { return m_color; }
void setReflectance(float reflectance) { m_reflectance = reflectance; }
float getReflectance() { return m_reflectance; }
void setTransparency(float transparency) { m_transparency = transparency; }
float getTransparency() { return m_transparency; }
Ogre::Vector3 getOgreCenter() { return m_position + (m_size / 2.f); }
void setBrickColor(int brickcolor) { m_brickColor = brickcolor; }

View File

@ -6,6 +6,7 @@
#include <App/V8/DataModel/Camera.hpp>
#include <App/V8/DataModel/RunService.hpp>
#include <App/V8/DataModel/DataModel.hpp>
#include <Network/Players.hpp>
#include <App/GUI/TopMenuBar.hpp>
#include <OGRE/Ogre.h>
#include <pugixml.hpp>
@ -30,6 +31,7 @@ namespace RNR
DataModel* m_datamodel;
Workspace* m_workspace;
RunService* m_runService;
Players* m_players;
Ogre::Root* m_ogreRoot;
Ogre::SceneManager* m_ogreSceneManager;
TopMenuBar* m_tmb;

View File

@ -0,0 +1,19 @@
#pragma once
#include <App/V8/Tree/Instance.hpp>
#include <App/V8/Tree/ModelInstance.hpp>
namespace RNR
{
class Player : public Instance
{
ModelInstance* m_character;
int m_userId;
public:
Player();
ModelInstance* getCharacter() { return m_character; }
void setCharacter(ModelInstance* model) { m_character = model; }
virtual std::string getClassName() { return "Player"; }
virtual void addProperties(std::vector<ReflectionProperty>& properties);
};
}

View File

@ -0,0 +1,21 @@
#pragma once
#include <App/V8/Tree/Instance.hpp>
#include <Network/Player.hpp>
namespace RNR
{
class Players : public Instance
{
private:
Player* m_localPlayer;
public:
Players();
virtual std::string getClassName() { return "Players"; }
Player* getLocalPlayer() { return m_localPlayer; };
Player* createLocalPlayer(int userId);
virtual void addProperties(std::vector<ReflectionProperty>& properties);
};
}

View File

@ -7,7 +7,7 @@ namespace RNR
{
m_world = world;
Ogre::OverlayManager* overlayManager = Ogre::OverlayManager::getSingletonPtr();
m_overlayManager = Ogre::OverlayManager::getSingletonPtr();
Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().create("Background", "General");
material->getTechnique(0)->getPass(0)->createTextureUnitState("textures/placeholder.png");
material->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, Ogre::ColourValue(0.5, 0.5, 0.5));
@ -17,7 +17,7 @@ namespace RNR
material->getTechnique(0)->getPass(0)->setLightingEnabled(false);
material->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SceneBlendType::SBT_TRANSPARENT_COLOUR);
Ogre::OverlayContainer* panel = static_cast<Ogre::OverlayContainer*>(overlayManager->createOverlayElement("Panel", "TopMenuBarPanel"));
Ogre::OverlayContainer* panel = static_cast<Ogre::OverlayContainer*>(m_overlayManager->createOverlayElement("Panel", "TopMenuBarPanel"));
panel->setMetricsMode(Ogre::GMM_PIXELS);
panel->setPosition(0,0);
panel->setDimensions(128 * 5, 20);
@ -25,7 +25,7 @@ namespace RNR
Ogre::ColourValue text_color = Ogre::ColourValue(0.25, 0.25, 0.25);
Ogre::TextAreaOverlayElement* toolsTextArea = static_cast<Ogre::TextAreaOverlayElement*>(overlayManager->createOverlayElement("TextArea", "TopMenuBarTools"));
Ogre::TextAreaOverlayElement* toolsTextArea = static_cast<Ogre::TextAreaOverlayElement*>(m_overlayManager->createOverlayElement("TextArea", "TopMenuBarTools"));
toolsTextArea->setMetricsMode(Ogre::GMM_PIXELS);
toolsTextArea->setPosition(0, 0);
toolsTextArea->setDimensions(128, 24);
@ -34,7 +34,7 @@ namespace RNR
toolsTextArea->setFontName("ComicSans");
toolsTextArea->setColour(text_color);
Ogre::TextAreaOverlayElement* insertTextArea = static_cast<Ogre::TextAreaOverlayElement*>(overlayManager->createOverlayElement("TextArea", "TopMenuBarInsert"));
Ogre::TextAreaOverlayElement* insertTextArea = static_cast<Ogre::TextAreaOverlayElement*>(m_overlayManager->createOverlayElement("TextArea", "TopMenuBarInsert"));
insertTextArea->setMetricsMode(Ogre::GMM_PIXELS);
insertTextArea->setPosition(128, 0);
insertTextArea->setDimensions(128, 24);
@ -43,7 +43,7 @@ namespace RNR
insertTextArea->setFontName("ComicSans");
insertTextArea->setColour(text_color);
Ogre::TextAreaOverlayElement* fullscreenTextArea = static_cast<Ogre::TextAreaOverlayElement*>(overlayManager->createOverlayElement("TextArea", "TopMenuBarFullscreen"));
Ogre::TextAreaOverlayElement* fullscreenTextArea = static_cast<Ogre::TextAreaOverlayElement*>(m_overlayManager->createOverlayElement("TextArea", "TopMenuBarFullscreen"));
fullscreenTextArea->setMetricsMode(Ogre::GMM_PIXELS);
fullscreenTextArea->setPosition(128*2, 0);
fullscreenTextArea->setDimensions(128, 24);
@ -52,7 +52,7 @@ namespace RNR
fullscreenTextArea->setFontName("ComicSans");
fullscreenTextArea->setColour(text_color);
Ogre::TextAreaOverlayElement* helpTextArea = static_cast<Ogre::TextAreaOverlayElement*>(overlayManager->createOverlayElement("TextArea", "TopMenuBarHelp"));
Ogre::TextAreaOverlayElement* helpTextArea = static_cast<Ogre::TextAreaOverlayElement*>(m_overlayManager->createOverlayElement("TextArea", "TopMenuBarHelp"));
helpTextArea->setMetricsMode(Ogre::GMM_PIXELS);
helpTextArea->setPosition(128*3, 0);
helpTextArea->setDimensions(128, 24);
@ -61,7 +61,7 @@ namespace RNR
helpTextArea->setFontName("ComicSans");
helpTextArea->setColour(text_color);
Ogre::TextAreaOverlayElement* exitTextArea = static_cast<Ogre::TextAreaOverlayElement*>(overlayManager->createOverlayElement("TextArea", "TopMenuBarExit"));
Ogre::TextAreaOverlayElement* exitTextArea = static_cast<Ogre::TextAreaOverlayElement*>(m_overlayManager->createOverlayElement("TextArea", "TopMenuBarExit"));
exitTextArea->setMetricsMode(Ogre::GMM_PIXELS);
exitTextArea->setPosition(128*4, 0);
exitTextArea->setDimensions(128, 24);
@ -76,7 +76,7 @@ namespace RNR
panel->addChild(helpTextArea);
panel->addChild(exitTextArea);
m_debugText = static_cast<Ogre::TextAreaOverlayElement*>(overlayManager->createOverlayElement("TextArea", "DebugTextArea"));
m_debugText = static_cast<Ogre::TextAreaOverlayElement*>(m_overlayManager->createOverlayElement("TextArea", "DebugTextArea"));
m_debugText->setMetricsMode(Ogre::GMM_PIXELS);
m_debugText->setPosition(0, 300);
m_debugText->setDimensions(420, 500);
@ -87,8 +87,26 @@ namespace RNR
panel->addChild(m_debugText);
Ogre::Overlay* overlay = overlayManager->create("OverlayName");
m_playerPanel = static_cast<Ogre::OverlayContainer*>(m_overlayManager->createOverlayElement("Panel", "PlayerListPanel"));
m_playerPanel->setMetricsMode(Ogre::GMM_PIXELS);
m_playerPanel->setDimensions(128, 20);
m_playerPanel->setMaterial(material);
m_playerList = static_cast<Ogre::TextAreaOverlayElement*>(m_overlayManager->createOverlayElement("TextArea", "PlayerListTextArea"));
m_playerList->setMetricsMode(Ogre::GMM_PIXELS);
m_playerList->setPosition(0, 0);
m_playerList->setDimensions(1000, 1000);
m_playerList->setCaption("Player List");
m_playerList->setCharHeight(24);
m_playerList->setFontName("ComicSans");
m_playerList->setColour(Ogre::ColourValue(1.0f, 1.0f, 1.0f));
m_playerPanel->addChild(m_playerList);
m_playerPanel->setVisible(false);
Ogre::Overlay* overlay = m_overlayManager->create("TopMenuBarOverlay");
overlay->add2D(panel);
overlay->add2D(m_playerPanel);
overlay->setZOrder(500);
overlay->show();
@ -111,5 +129,24 @@ namespace RNR
}
snprintf(debugtext, 512, "Render\nLast DT = %f\n%s\n",m_world->getLastDelta(),render_debugtext,m_world->getOgreSceneManager());
m_debugText->setCaption(debugtext);
Players* players = (Players*)m_world->getDatamodel()->getService("Players");
auto player_list = players->getChildren();
if(player_list->size() == 0)
{
m_playerPanel->setVisible(false);
}
else
{
m_playerPanel->setVisible(true);
m_playerPanel->setPosition(m_overlayManager->getViewportWidth() - 128 - 5,5);
std::string player_list_text = "Player List\n";
for(auto player : *player_list)
{
player_list_text += player->getName() + "\n";
}
m_playerList->setCaption(player_list_text);
m_playerPanel->setDimensions(128, 20 * (player_list->size() + 1));
}
}
}

View File

@ -9,6 +9,8 @@ namespace RNR
setName("Part");
m_color = Ogre::Vector4(0.63, 0.64, 0.63, 1.0);
m_transparency = 0.0;
m_reflectance = 0.0;
setNode(world->getOgreSceneManager()->getRootSceneNode()->createChildSceneNode());
setObject(world->getOgreSceneManager()->createEntity("fonts/Cube.mesh"));
@ -30,6 +32,7 @@ namespace RNR
for(auto& subentity : entity->getSubEntities())
{
subentity->setMaterial(BrickColor::material(m_brickColor));
subentity->getMaterial()->setShininess(64);
}
}
@ -47,6 +50,14 @@ namespace RNR
printf("PartInstance::deserializeProperty: BrickColor not valid number (%i)\n", getBrickColor());
}
}
else if(prop_name == std::string("Reflectance"))
{
setReflectance(node.text().as_float());
}
else if(prop_name == std::string("Transparency"))
{
setTransparency(node.text().as_float());
}
else
PVInstance::deserializeProperty(prop_name, node);
updateMatrix();
@ -63,6 +74,14 @@ namespace RNR
ACCESS_NONE, OPERATION_READWRITE, PROPERTY_BRICKCOLOR,
REFLECTION_GETTER(PartInstance* instance = (PartInstance*)object; return &instance->m_brickColor; ),
REFLECTION_SETTER(PartInstance* instance = (PartInstance*)object; instance->setBrickColor(*(int*)value); ) },
{ this, std::string("Reflectance"), std::string(""),
ACCESS_NONE, OPERATION_READWRITE, PROPERTY_FLOAT,
REFLECTION_GETTER(PartInstance* instance = (PartInstance*)object; return &instance->m_reflectance; ),
REFLECTION_SETTER(PartInstance* instance = (PartInstance*)object; instance->setReflectance(*(float*)value); ) },
{ this, std::string("Transparency"), std::string(""),
ACCESS_NONE, OPERATION_READWRITE, PROPERTY_FLOAT,
REFLECTION_GETTER(PartInstance* instance = (PartInstance*)object; return &instance->m_transparency; ),
REFLECTION_SETTER(PartInstance* instance = (PartInstance*)object; instance->setTransparency(*(float*)value); ) },
};
PVInstance::addProperties(properties);

View File

@ -19,7 +19,7 @@ namespace RNR
break;
case BATCH_STATIC_GEOMETRY:
m_geom = world->getOgreSceneManager()->createStaticGeometry("workspaceGeom");
m_geom->setRegionDimensions(Ogre::Vector3(255,255,255));
m_geom->setRegionDimensions(Ogre::Vector3(512,512,512));
m_geom->setCastShadows(true);
break;
}
@ -40,6 +40,7 @@ namespace RNR
replica->setPosition(part->getPosition());
replica->setOrientation(part->getCFrame().getRotation());
replica->setScale(part->getSize());
childAdded->setObject(replica);
}
break;
case BATCH_STATIC_GEOMETRY:

View File

@ -4,6 +4,7 @@
#include <App/GUI/SelectionBox.hpp>
#include <App/Humanoid/Humanoid.hpp>
#include <App/InputManager.hpp>
#include <Network/Player.hpp>
#include <stdexcept>
#include <pugixml.hpp>
@ -24,6 +25,8 @@ namespace RNR
m_instanceFactory->registerInstance("Workspace", InstanceFactory::instanceBuilder<Workspace>);
m_instanceFactory->registerInstance("Humanoid", InstanceFactory::instanceBuilder<Humanoid>);
m_instanceFactory->registerInstance("RunService", InstanceFactory::instanceBuilder<RunService>);
m_instanceFactory->registerInstance("Players", InstanceFactory::instanceBuilder<Players>);
m_instanceFactory->registerInstance("Player", InstanceFactory::instanceBuilder<Player>);
m_ogreRoot = ogre;
m_ogreSceneManager = ogreSceneManager;
@ -31,6 +34,7 @@ namespace RNR
m_datamodel->setName("DataModel");
m_workspace = (Workspace*)m_datamodel->getService("Workspace");
m_runService = (RunService*)m_datamodel->getService("RunService");
m_players = (Players*)m_datamodel->getService("Players");
m_tmb = new TopMenuBar(this);

View File

@ -0,0 +1,25 @@
#include <Network/Player.hpp>
#include <App/V8/World/World.hpp>
namespace RNR
{
Player::Player()
{
setName("Player");
setParent(world->getDatamodel()->getService("Players"));
m_character = NULL;
}
void Player::addProperties(std::vector<ReflectionProperty>& properties)
{
ReflectionProperty _properties[] = {
{ this, std::string("Character"), std::string(""),
ACCESS_NONE, OPERATION_READWRITE, PROPERTY_INSTANCE,
REFLECTION_GETTER(Player* instance = (Player*)object; return instance->m_character; ),
REFLECTION_SETTER(Player* instance = (Player*)object; instance->setCharacter((ModelInstance*)value); ) },
};
properties.insert(properties.end(), _properties, _properties+(sizeof(_properties)/sizeof(ReflectionProperty)));
}
}

View File

@ -0,0 +1,34 @@
#include <Network/Players.hpp>
namespace RNR
{
Players::Players()
{
setName("Players");
m_localPlayer = 0;
}
Player* Players::createLocalPlayer(int userId)
{
if(m_localPlayer)
{
printf("Players::createLocalPlayer: attempt to create another local player\n", userId);
return m_localPlayer;
}
printf("Players::createLocalPlayer: created player %i\n", userId);
m_localPlayer = new Player();
return m_localPlayer;
}
void Players::addProperties(std::vector<ReflectionProperty>& properties)
{
ReflectionProperty _properties[] = {
{ this, std::string("LocalPlayer"), std::string(""),
ACCESS_NONE, OPERATION_READ, PROPERTY_INSTANCE,
REFLECTION_GETTER(Players* instance = (Players*)object; return instance->m_localPlayer; ),
REFLECTION_SETTER( ) },
};
properties.insert(properties.end(), _properties, _properties+(sizeof(_properties)/sizeof(ReflectionProperty)));
}
}