more stability in container nodes, editor now has a trackball camera
This commit is contained in:
parent
a91efd7354
commit
c40c2bc79e
@ -4,12 +4,17 @@
|
|||||||
#include "tools/scenepicker.h"
|
#include "tools/scenepicker.h"
|
||||||
#include "scene/scenetree.h"
|
#include "scene/scenetree.h"
|
||||||
#include "tools/resourcepack.h"
|
#include "tools/resourcepack.h"
|
||||||
|
#include "editor/objecteditor.h"
|
||||||
|
#include "sparrowshell/sparrowshell.h"
|
||||||
|
|
||||||
#include <imgui/imgui.h>
|
#include <imgui/imgui.h>
|
||||||
|
|
||||||
#include <SparrowRenderer/mesh.h>
|
#include <SparrowRenderer/mesh.h>
|
||||||
#include <SparrowRenderer/pbrmaterial.h>
|
#include <SparrowRenderer/pbrmaterial.h>
|
||||||
#include <SparrowRenderer/deferredpipeline.h>
|
#include <SparrowRenderer/deferredpipeline.h>
|
||||||
|
#include <SparrowRenderer/trackballcamera.h>
|
||||||
|
|
||||||
|
#include <SparrowInput/input.h>
|
||||||
|
|
||||||
#include <glm/ext.hpp>
|
#include <glm/ext.hpp>
|
||||||
|
|
||||||
@ -17,10 +22,12 @@ Editor::Editor() :
|
|||||||
m_pickerNode(new ScenePicker()),
|
m_pickerNode(new ScenePicker()),
|
||||||
m_selectedMesh(nullptr),
|
m_selectedMesh(nullptr),
|
||||||
m_editedResourcePack(nullptr),
|
m_editedResourcePack(nullptr),
|
||||||
|
m_objectEditor(nullptr),
|
||||||
m_pickerEnabled(false),
|
m_pickerEnabled(false),
|
||||||
m_materialEditorEnabled(false),
|
m_materialEditorEnabled(false),
|
||||||
m_editorEnabled(false)
|
m_editorEnabled(false)
|
||||||
{
|
{
|
||||||
|
m_objectEditor = new ObjectEditor();
|
||||||
addChild(m_pickerNode);
|
addChild(m_pickerNode);
|
||||||
m_pickerNode->setVisible(false);
|
m_pickerNode->setVisible(false);
|
||||||
}
|
}
|
||||||
@ -125,7 +132,40 @@ void Editor::materialGui()
|
|||||||
|
|
||||||
void Editor::toggleEditor()
|
void Editor::toggleEditor()
|
||||||
{
|
{
|
||||||
|
static Camera* backupCamera = nullptr;
|
||||||
|
static bool backupMouseGrabbedState = false;
|
||||||
|
static std::string backupInputContext = "";
|
||||||
|
|
||||||
m_editorEnabled = !m_editorEnabled;
|
m_editorEnabled = !m_editorEnabled;
|
||||||
|
if(m_editorEnabled)
|
||||||
|
{
|
||||||
|
// input context
|
||||||
|
if(getEngine().getShell()->isEnabled())
|
||||||
|
getEngine().getShell()->toggleShell();
|
||||||
|
backupInputContext = getEngine().getInput()->getCurrentContext();
|
||||||
|
getEngine().getInput()->setCurrentContext("editor");
|
||||||
|
|
||||||
|
// mouse grab
|
||||||
|
backupMouseGrabbedState = getEngine().isMouseGrabbed();
|
||||||
|
if(getEngine().isMouseGrabbed())
|
||||||
|
getEngine().toggleMouseVisibility();
|
||||||
|
|
||||||
|
// camera controller
|
||||||
|
backupCamera = getEngine().getScene()->getCamera();
|
||||||
|
getEngine().getScene()->setMainCamera(m_objectEditor->getCamera());
|
||||||
|
getEngine().getScene()->getRootObject()->addChild(m_objectEditor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// restore all previous states
|
||||||
|
if(getEngine().isMouseGrabbed() != backupMouseGrabbedState)
|
||||||
|
getEngine().toggleMouseVisibility();
|
||||||
|
getEngine().getScene()->setMainCamera(backupCamera);
|
||||||
|
getEngine().getScene()->getRootObject()->removeChild(m_objectEditor);
|
||||||
|
if(getEngine().getShell()->isEnabled())
|
||||||
|
getEngine().getShell()->toggleShell();
|
||||||
|
getEngine().getInput()->setCurrentContext(backupInputContext);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::togglePicker()
|
void Editor::togglePicker()
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
class Engine;
|
class Engine;
|
||||||
class ScenePicker;
|
class ScenePicker;
|
||||||
class ResourcePack;
|
class ResourcePack;
|
||||||
|
class ObjectEditor;
|
||||||
class Mesh;
|
class Mesh;
|
||||||
|
|
||||||
class Editor : public ContainerNode
|
class Editor : public ContainerNode
|
||||||
@ -13,6 +14,7 @@ class Editor : public ContainerNode
|
|||||||
ScenePicker* m_pickerNode;
|
ScenePicker* m_pickerNode;
|
||||||
Mesh* m_selectedMesh;
|
Mesh* m_selectedMesh;
|
||||||
ResourcePack* m_editedResourcePack;
|
ResourcePack* m_editedResourcePack;
|
||||||
|
ObjectEditor* m_objectEditor;
|
||||||
bool m_pickerEnabled;
|
bool m_pickerEnabled;
|
||||||
bool m_materialEditorEnabled;
|
bool m_materialEditorEnabled;
|
||||||
bool m_editorEnabled;
|
bool m_editorEnabled;
|
||||||
|
@ -20,9 +20,9 @@ void ObjectEditor::update()
|
|||||||
for(Action action : input->getActions())
|
for(Action action : input->getActions())
|
||||||
{
|
{
|
||||||
if(action.action == DefaultKeysMap::MAIN_ACTION_HOLD)
|
if(action.action == DefaultKeysMap::MAIN_ACTION_HOLD)
|
||||||
m_camera->moveCamera(diff.x, diff.y);
|
|
||||||
else if(action.action == DefaultKeysMap::SECONDARY_ACTION_HOLD)
|
|
||||||
m_camera->rotateCamera(diff.x, diff.y);
|
m_camera->rotateCamera(diff.x, diff.y);
|
||||||
|
else if(action.action == DefaultKeysMap::SECONDARY_ACTION_HOLD)
|
||||||
|
m_camera->moveCamera(diff.x, diff.y);
|
||||||
}
|
}
|
||||||
m_camera->zoom(input->getDeltaVerticalScroll()*120.f);
|
m_camera->zoom(input->getDeltaVerticalScroll()*120.f);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
#include "containernode.h"
|
#include "containernode.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
ContainerNode::ContainerNode()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
ContainerNode::~ContainerNode()
|
ContainerNode::~ContainerNode()
|
||||||
{
|
{
|
||||||
for(SceneNode *child : m_children)
|
for(SceneNode *child : m_children)
|
||||||
@ -10,6 +14,28 @@ ContainerNode::~ContainerNode()
|
|||||||
// Container Node
|
// Container Node
|
||||||
void ContainerNode::update()
|
void ContainerNode::update()
|
||||||
{
|
{
|
||||||
|
for(SceneNode* node : m_nodesToRemove)
|
||||||
|
{
|
||||||
|
for(auto it = m_children.begin(); it != m_children.end();)
|
||||||
|
{
|
||||||
|
if(*it == node)
|
||||||
|
it = m_children.erase(it);
|
||||||
|
else
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
node->setSceneTree(nullptr);
|
||||||
|
node->setParent(nullptr);
|
||||||
|
}
|
||||||
|
m_nodesToRemove.clear();
|
||||||
|
|
||||||
|
for(SceneNode* node : m_nodesToAdd)
|
||||||
|
{
|
||||||
|
m_children.push_back(node);
|
||||||
|
node->setSceneTree(m_scene);
|
||||||
|
node->setParent(this);
|
||||||
|
}
|
||||||
|
m_nodesToAdd.clear();
|
||||||
|
|
||||||
for(SceneNode* sn : m_children)
|
for(SceneNode* sn : m_children)
|
||||||
sn->update();
|
sn->update();
|
||||||
}
|
}
|
||||||
@ -17,29 +43,13 @@ void ContainerNode::update()
|
|||||||
void ContainerNode::addChild(SceneNode* node)
|
void ContainerNode::addChild(SceneNode* node)
|
||||||
{
|
{
|
||||||
if(node != nullptr)
|
if(node != nullptr)
|
||||||
{
|
m_nodesToAdd.push_back(node);
|
||||||
node->setSceneTree(m_scene);
|
|
||||||
m_children.push_back(node);
|
|
||||||
node->m_parent = this;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContainerNode::removeChild(SceneNode* node)
|
void ContainerNode::removeChild(SceneNode* node)
|
||||||
{
|
{
|
||||||
if(node != nullptr)
|
if(node != nullptr)
|
||||||
{
|
m_nodesToRemove.push_back(node);
|
||||||
for(auto it = m_children.begin(); it != m_children.end();)
|
|
||||||
{
|
|
||||||
if(*it == node)
|
|
||||||
{
|
|
||||||
it = m_children.erase(it);
|
|
||||||
node->m_parent = nullptr;
|
|
||||||
node->setSceneTree(nullptr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContainerNode::setSceneTree(SceneTree *tree)
|
void ContainerNode::setSceneTree(SceneTree *tree)
|
||||||
|
@ -9,7 +9,11 @@
|
|||||||
*/
|
*/
|
||||||
class ContainerNode : public SceneNode
|
class ContainerNode : public SceneNode
|
||||||
{
|
{
|
||||||
|
std::vector<SceneNode*> m_nodesToRemove;
|
||||||
|
std::vector<SceneNode*> m_nodesToAdd;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
ContainerNode();
|
||||||
virtual ~ContainerNode();
|
virtual ~ContainerNode();
|
||||||
|
|
||||||
virtual void update();
|
virtual void update();
|
||||||
|
@ -47,7 +47,5 @@ void GibGeneratorNode::update()
|
|||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
|
|
||||||
// use ContainerNode::update() here instead?
|
ContainerNode::update();
|
||||||
for(SceneNode* child : m_children)
|
|
||||||
child->update();
|
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,33 @@ GraphicalContainerNode::~GraphicalContainerNode()
|
|||||||
|
|
||||||
void GraphicalContainerNode::update()
|
void GraphicalContainerNode::update()
|
||||||
{
|
{
|
||||||
|
for(GraphicalNode* node : m_nodesToRemove)
|
||||||
|
{
|
||||||
|
for(auto it = m_children.begin(); it != m_children.end();)
|
||||||
|
{
|
||||||
|
if(*it == node)
|
||||||
|
{
|
||||||
|
it = m_children.erase(it);
|
||||||
|
node->setSceneTree(nullptr);
|
||||||
|
node->setParent(nullptr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_nodesToRemove.clear();
|
||||||
|
|
||||||
|
for(GraphicalNode* node : m_nodesToAdd)
|
||||||
|
{
|
||||||
|
if(m_scene != nullptr)
|
||||||
|
node->setSceneTree(m_scene);
|
||||||
|
m_children.push_back(node);
|
||||||
|
node->setParent(this);
|
||||||
|
node->setParentTransform(m_transform);
|
||||||
|
node->setParentVisible(isVisible());
|
||||||
|
}
|
||||||
|
m_nodesToAdd.clear();
|
||||||
|
|
||||||
if(m_transformChanged)
|
if(m_transformChanged)
|
||||||
m_combinedTransform = m_transform * m_parentTransform;
|
m_combinedTransform = m_transform * m_parentTransform;
|
||||||
for(GraphicalNode* child : m_children)
|
for(GraphicalNode* child : m_children)
|
||||||
@ -30,32 +57,13 @@ void GraphicalContainerNode::setSceneTree(SceneTree* tree)
|
|||||||
void GraphicalContainerNode::addChild(GraphicalNode *node)
|
void GraphicalContainerNode::addChild(GraphicalNode *node)
|
||||||
{
|
{
|
||||||
if(node != nullptr)
|
if(node != nullptr)
|
||||||
{
|
m_nodesToAdd.push_back(node);
|
||||||
if(m_scene != nullptr)
|
|
||||||
node->setSceneTree(m_scene);
|
|
||||||
m_children.push_back(node);
|
|
||||||
node->m_parent = this;
|
|
||||||
node->setParentTransform(m_transform);
|
|
||||||
node->setParentVisible(isVisible());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicalContainerNode::removeChild(GraphicalNode *node)
|
void GraphicalContainerNode::removeChild(GraphicalNode *node)
|
||||||
{
|
{
|
||||||
if(node != nullptr)
|
if(node != nullptr)
|
||||||
{
|
m_nodesToRemove.push_back(node);
|
||||||
for(auto it = m_children.begin(); it != m_children.end();)
|
|
||||||
{
|
|
||||||
if(*it == node)
|
|
||||||
{
|
|
||||||
it = m_children.erase(it);
|
|
||||||
node->m_parent = nullptr;
|
|
||||||
node->setSceneTree(nullptr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicalContainerNode::updateVisibility(bool visible)
|
void GraphicalContainerNode::updateVisibility(bool visible)
|
||||||
|
@ -8,6 +8,9 @@
|
|||||||
|
|
||||||
class GraphicalContainerNode : public GraphicalNode
|
class GraphicalContainerNode : public GraphicalNode
|
||||||
{
|
{
|
||||||
|
std::vector<GraphicalNode*> m_nodesToRemove;
|
||||||
|
std::vector<GraphicalNode*> m_nodesToAdd;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::vector<GraphicalNode*> m_children;
|
std::vector<GraphicalNode*> m_children;
|
||||||
glm::mat4 m_combinedTransform;
|
glm::mat4 m_combinedTransform;
|
||||||
|
@ -144,7 +144,7 @@ void TextInputNode::updateTextMesh(){
|
|||||||
Font *shellfont = RESOURCE_GET(Font,"shellfont");
|
Font *shellfont = RESOURCE_GET(Font,"shellfont");
|
||||||
if(m_text_mesh){
|
if(m_text_mesh){
|
||||||
this->removeChild(m_text_mesh);
|
this->removeChild(m_text_mesh);
|
||||||
delete(m_text_mesh);
|
m_text_mesh->destroyWhenOrphan();
|
||||||
}
|
}
|
||||||
m_text_mesh = shellfont->getTextNode(m_text,m_text_color,m_font_size,false);
|
m_text_mesh = shellfont->getTextNode(m_text,m_text_color,m_font_size,false);
|
||||||
if(m_text_mesh){
|
if(m_text_mesh){
|
||||||
|
@ -72,9 +72,9 @@ PlayerCharacterNode::PlayerCharacterNode(bool noClip) :
|
|||||||
m_noclipMode(noClip),
|
m_noclipMode(noClip),
|
||||||
m_inputActions({NO_ACTION, NO_ACTION, NO_ACTION, NO_ACTION, NO_ACTION, NO_ACTION, NO_ACTION})
|
m_inputActions({NO_ACTION, NO_ACTION, NO_ACTION, NO_ACTION, NO_ACTION, NO_ACTION, NO_ACTION})
|
||||||
{
|
{
|
||||||
m_playerLight = new PointLight(glm::vec3(150, 10, 30), 10, glm::vec3(0.18f, 0.16f, 0.096f)*2.f);
|
// m_playerLight = new PointLight(glm::vec3(150, 10, 30), 10, glm::vec3(0.18f, 0.16f, 0.096f)*2.f);
|
||||||
m_playerLightNode = new LightNode(m_playerLight);
|
// m_playerLightNode = new LightNode(m_playerLight);
|
||||||
m_playerLightNode->m_parent = this;
|
// m_playerLightNode->setParent(this);
|
||||||
|
|
||||||
// Create the shape
|
// Create the shape
|
||||||
btCollisionShape *shape = new btCapsuleShape(TORSO_RADIUS, TORSO_HEIGHT);
|
btCollisionShape *shape = new btCapsuleShape(TORSO_RADIUS, TORSO_HEIGHT);
|
||||||
@ -93,9 +93,9 @@ PlayerCharacterNode::PlayerCharacterNode(bool noClip) :
|
|||||||
|
|
||||||
PlayerCharacterNode::~PlayerCharacterNode()
|
PlayerCharacterNode::~PlayerCharacterNode()
|
||||||
{
|
{
|
||||||
m_playerLightNode->setSceneTree(nullptr);
|
// m_playerLightNode->setSceneTree(nullptr);
|
||||||
delete m_playerLightNode;
|
// delete m_playerLightNode;
|
||||||
delete m_playerLight;
|
// delete m_playerLight;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerCharacterNode::setInputs(int forward, int backward, int strafeLeft, int strafeRight, int jump, int run, int toggleNoClip)
|
void PlayerCharacterNode::setInputs(int forward, int backward, int strafeLeft, int strafeRight, int jump, int run, int toggleNoClip)
|
||||||
@ -173,7 +173,7 @@ void PlayerCharacterNode::update()
|
|||||||
|
|
||||||
// update camera position
|
// update camera position
|
||||||
btVector3 pos = m_rigidBody->getCenterOfMassPosition();
|
btVector3 pos = m_rigidBody->getCenterOfMassPosition();
|
||||||
m_playerLight->setPos(glm::vec3(pos.x(), pos.y()+TORSO_HEIGHT/2.f, pos.z()));
|
// m_playerLight->setPos(glm::vec3(pos.x(), pos.y()+TORSO_HEIGHT/2.f, pos.z()));
|
||||||
m_fpsCamera.moveTo(glm::vec3(pos.x(), pos.y()+EYES_OFFSET, pos.z()));
|
m_fpsCamera.moveTo(glm::vec3(pos.x(), pos.y()+EYES_OFFSET, pos.z()));
|
||||||
|
|
||||||
// update body movement
|
// update body movement
|
||||||
@ -297,7 +297,7 @@ void PlayerCharacterNode::update()
|
|||||||
}
|
}
|
||||||
m_rigidBody->setLinearVelocity(newVelocity);
|
m_rigidBody->setLinearVelocity(newVelocity);
|
||||||
}
|
}
|
||||||
m_playerLightNode->update();
|
// m_playerLightNode->update();
|
||||||
glm::vec3 p = this->getEyePosition();
|
glm::vec3 p = this->getEyePosition();
|
||||||
sf::Listener::setPosition(p.x,p.y,p.z);
|
sf::Listener::setPosition(p.x,p.y,p.z);
|
||||||
glm::vec3 d = getDirection();
|
glm::vec3 d = getDirection();
|
||||||
@ -313,5 +313,5 @@ void PlayerCharacterNode::toggleNoClip()
|
|||||||
void PlayerCharacterNode::setSceneTree(SceneTree* tree)
|
void PlayerCharacterNode::setSceneTree(SceneTree* tree)
|
||||||
{
|
{
|
||||||
m_scene = tree;
|
m_scene = tree;
|
||||||
m_playerLightNode->setSceneTree(tree);
|
// m_playerLightNode->setSceneTree(tree);
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,15 @@
|
|||||||
#include "scenenode.h"
|
#include "scenenode.h"
|
||||||
#include "scenetree.h"
|
#include "scenetree.h"
|
||||||
|
|
||||||
const Engine& SceneNode::getEngine()
|
Engine &SceneNode::getEngine()
|
||||||
{
|
{
|
||||||
return m_scene->getEngine();
|
return m_scene->getEngine();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SceneNode::setParent(SceneNode* parent)
|
||||||
|
{
|
||||||
|
if(m_toDestroy && parent == nullptr)
|
||||||
|
delete this;
|
||||||
|
else
|
||||||
|
m_parent = parent;
|
||||||
|
}
|
||||||
|
@ -8,19 +8,29 @@ class Engine;
|
|||||||
|
|
||||||
class SceneNode
|
class SceneNode
|
||||||
{
|
{
|
||||||
protected:
|
bool m_toDestroy;
|
||||||
const Engine& getEngine();
|
|
||||||
public:
|
|
||||||
SceneNode() : m_parent(nullptr), m_scene(nullptr) {}
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Engine& getEngine();
|
||||||
SceneNode* m_parent;
|
SceneNode* m_parent;
|
||||||
SceneTree* m_scene;
|
SceneTree* m_scene;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SceneNode() : m_toDestroy(false), m_parent(nullptr), m_scene(nullptr) {}
|
||||||
|
|
||||||
// bool m_enabled;
|
// bool m_enabled;
|
||||||
virtual void update() = 0;
|
virtual void update() = 0;
|
||||||
virtual Light* getLight() {return nullptr;}
|
virtual Light* getLight() {return nullptr;}
|
||||||
virtual GeometryNode* getGeometryNode() {return nullptr;}
|
virtual GeometryNode* getGeometryNode() {return nullptr;}
|
||||||
virtual void setSceneTree(SceneTree* tree) {m_scene = tree;}
|
virtual void setSceneTree(SceneTree* tree) {m_scene = tree;}
|
||||||
|
virtual void setParent(SceneNode* parent);
|
||||||
|
virtual SceneNode* getParent() { return m_parent; }
|
||||||
// virtual void toggleNode(){m_enabled = !m_enabled;}
|
// virtual void toggleNode(){m_enabled = !m_enabled;}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief killWhenOrphan this method can be called if you wish to delete this object as soon as it has no parent.
|
||||||
|
*/
|
||||||
|
virtual void destroyWhenOrphan() { m_toDestroy = true; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SCENENODE_H
|
#endif // SCENENODE_H
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
#include <btBulletDynamicsCommon.h>
|
#include <btBulletDynamicsCommon.h>
|
||||||
|
|
||||||
SceneTree::SceneTree(const Engine &engine) :
|
SceneTree::SceneTree(Engine &engine) :
|
||||||
Scene(),
|
Scene(),
|
||||||
m_engine(engine),
|
m_engine(engine),
|
||||||
m_shaderRefreshRequired(false),
|
m_shaderRefreshRequired(false),
|
||||||
@ -30,12 +30,13 @@ SceneTree::~SceneTree()
|
|||||||
delete m_world;
|
delete m_world;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneTree::setMainCamera(CameraNode *camNode)
|
void SceneTree::setMainCamera(Camera *camera)
|
||||||
{
|
{
|
||||||
m_camera = camNode->getCamera();
|
m_camera = camera;
|
||||||
((DeferredPipeline*)m_pipeline)->setCamera(m_camera);
|
((DeferredPipeline*)m_pipeline)->setCamera(m_camera);
|
||||||
sf::Vector2u size = getEngine().getWindow()->getSize();
|
sf::Vector2u size = getEngine().getWindow()->getSize();
|
||||||
m_camera->resize(size.x, size.y);
|
if(m_camera != nullptr)
|
||||||
|
m_camera->resize(size.x, size.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
SceneIterator<Light*>* SceneTree::getLights()
|
SceneIterator<Light*>* SceneTree::getLights()
|
||||||
|
@ -29,7 +29,7 @@ public:
|
|||||||
|
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
void setMainCamera(CameraNode *camNode);
|
void setMainCamera(Camera *camera);
|
||||||
Camera* getCamera() const { return m_camera; }
|
Camera* getCamera() const { return m_camera; }
|
||||||
|
|
||||||
ContainerNode* getRootObject(){return &m_root;}
|
ContainerNode* getRootObject(){return &m_root;}
|
||||||
@ -41,15 +41,15 @@ public:
|
|||||||
void removeFromIndex(SceneNode *node);
|
void removeFromIndex(SceneNode *node);
|
||||||
void updateShaders();
|
void updateShaders();
|
||||||
|
|
||||||
const Engine& getEngine() { return m_engine; }
|
Engine& getEngine() { return m_engine; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// A SceneTree can only be constructed by the engine by using Engine::createScene()
|
// A SceneTree can only be constructed by the engine by using Engine::createScene()
|
||||||
//friend SceneTree* Engine::createScene();
|
//friend SceneTree* Engine::createScene();
|
||||||
friend void Engine::createScene(std::string scene_name);
|
friend void Engine::createScene(std::string scene_name);
|
||||||
SceneTree(const Engine &engine);
|
SceneTree(Engine &engine);
|
||||||
|
|
||||||
const Engine &m_engine;
|
Engine &m_engine;
|
||||||
ContainerNode m_root;
|
ContainerNode m_root;
|
||||||
btDiscreteDynamicsWorld* m_world;
|
btDiscreteDynamicsWorld* m_world;
|
||||||
std::vector<Light*> m_lights;
|
std::vector<Light*> m_lights;
|
||||||
|
@ -42,7 +42,7 @@ void ShellBuffer::push(TextNode* tnode){
|
|||||||
m_zero_offset %= m_max_size;
|
m_zero_offset %= m_max_size;
|
||||||
}else
|
}else
|
||||||
m_children.push_back(tnode);
|
m_children.push_back(tnode);
|
||||||
tnode->m_parent = this;
|
tnode->setParent(this);
|
||||||
tnode->setParentTransform(m_transform);
|
tnode->setParentTransform(m_transform);
|
||||||
tnode->setParentVisible(isVisible());
|
tnode->setParentVisible(isVisible());
|
||||||
m_buffer_modified = true;
|
m_buffer_modified = true;
|
||||||
|
@ -196,7 +196,7 @@ public:
|
|||||||
m_player->setInputs(DefaultKeysMap::MOVE_FORWARD, DefaultKeysMap::MOVE_BACKWARD, DefaultKeysMap::STRAFE_LEFT, DefaultKeysMap::STRAFE_RIGHT, DefaultKeysMap::JUMP, DefaultKeysMap::RUN, DefaultKeysMap::TOGGLE_NOCLIP);
|
m_player->setInputs(DefaultKeysMap::MOVE_FORWARD, DefaultKeysMap::MOVE_BACKWARD, DefaultKeysMap::STRAFE_LEFT, DefaultKeysMap::STRAFE_RIGHT, DefaultKeysMap::JUMP, DefaultKeysMap::RUN, DefaultKeysMap::TOGGLE_NOCLIP);
|
||||||
SceneTree* scene = RESOURCE_GET(SceneTree, m_demo_scene);
|
SceneTree* scene = RESOURCE_GET(SceneTree, m_demo_scene);
|
||||||
scene->getRootObject()->addChild(m_player);
|
scene->getRootObject()->addChild(m_player);
|
||||||
scene->setMainCamera(m_player);
|
scene->setMainCamera(m_player->getCamera());
|
||||||
|
|
||||||
//potator
|
//potator
|
||||||
Potator *potator = new Potator(m_player, DefaultKeysMap::MAIN_ACTION, DefaultKeysMap::SECONDARY_ACTION, DefaultKeysMap::TERTIARY_ACTION);
|
Potator *potator = new Potator(m_player, DefaultKeysMap::MAIN_ACTION, DefaultKeysMap::SECONDARY_ACTION, DefaultKeysMap::TERTIARY_ACTION);
|
||||||
@ -268,7 +268,6 @@ public:
|
|||||||
m_demo->initScene();
|
m_demo->initScene();
|
||||||
m_engine->setScene(m_demo->getScene());
|
m_engine->setScene(m_demo->getScene());
|
||||||
m_engine->getInput()->setCurrentContext("default");
|
m_engine->getInput()->setCurrentContext("default");
|
||||||
m_engine->getInput()->setMouseGrabbed(true);
|
|
||||||
m_engine->getScene()->getPhysics()->addRigidBody(m_demo->getPlayer()->getRigidbody());
|
m_engine->getScene()->getPhysics()->addRigidBody(m_demo->getPlayer()->getRigidbody());
|
||||||
m_engine->toggleMouseVisibility();
|
m_engine->toggleMouseVisibility();
|
||||||
}
|
}
|
||||||
@ -363,24 +362,26 @@ int main(){
|
|||||||
// SceneTree *scene = engine.createScene();
|
// SceneTree *scene = engine.createScene();
|
||||||
// engine.setScene(scene);
|
// engine.setScene(scene);
|
||||||
|
|
||||||
// settin gup SparrowInput
|
// setting up SparrowInput
|
||||||
Input* input = engine.getInput();
|
Input* input = engine.getInput();
|
||||||
input->setKeysMap(DefaultKeysMap());
|
input->setKeysMap(DefaultKeysMap());
|
||||||
input->addContext(Context("default", DefaultKeysMap::getDefaultContext()));
|
input->addContext(Context("default", DefaultKeysMap::getDefaultContext()));
|
||||||
input->setCurrentContext("default");
|
|
||||||
input->updateKeyBindings();
|
input->updateKeyBindings();
|
||||||
engine.setTogglePhysicsDebugAction(DefaultKeysMap::TOGGLE_PHYSICS_DEBUG);
|
engine.setTogglePhysicsDebugAction(DefaultKeysMap::TOGGLE_PHYSICS_DEBUG);
|
||||||
engine.setToggleShellAction(DefaultKeysMap::TOGGLE_CONSOLE);
|
engine.setToggleShellAction(DefaultKeysMap::TOGGLE_CONSOLE);
|
||||||
engine.setExitGameAction(DefaultKeysMap::EXIT_GAME);
|
engine.setExitGameAction(DefaultKeysMap::EXIT_GAME);
|
||||||
engine.setShowMouseAction(DefaultKeysMap::TOGGLE_MOUSE_CURSOR);
|
engine.setShowMouseAction(DefaultKeysMap::TOGGLE_MOUSE_CURSOR);
|
||||||
|
|
||||||
//c'est un goup SparrowShell
|
// setting up SparrowShell
|
||||||
SparrowShell* shell = engine.getShell();
|
SparrowShell* shell = engine.getShell();
|
||||||
shell->setInputs(DefaultKeysMap::MOVE_CURSOR_LEFT,DefaultKeysMap::MOVE_CURSOR_RIGHT,DefaultKeysMap::HISTORY_UP,DefaultKeysMap::HISTORY_DOWN);
|
shell->setInputs(DefaultKeysMap::MOVE_CURSOR_LEFT,DefaultKeysMap::MOVE_CURSOR_RIGHT,DefaultKeysMap::HISTORY_UP,DefaultKeysMap::HISTORY_DOWN);
|
||||||
input->addContext(Context("shell",DefaultKeysMap::getShellContext()));
|
input->addContext(Context("shell",DefaultKeysMap::getShellContext()));
|
||||||
input->updateKeyBindings();
|
input->updateKeyBindings();
|
||||||
|
|
||||||
//setup menu
|
// setup editor
|
||||||
|
input->addContext(Context("editor",DefaultKeysMap::getObjectEditorContext()));
|
||||||
|
|
||||||
|
// setup menu
|
||||||
Menu* menu = new Menu(&engine,config);
|
Menu* menu = new Menu(&engine,config);
|
||||||
Demo* demo = new Demo(&engine,config);
|
Demo* demo = new Demo(&engine,config);
|
||||||
menu->setLeftClickAction(DefaultKeysMap::LEFT_CLICK);
|
menu->setLeftClickAction(DefaultKeysMap::LEFT_CLICK);
|
||||||
@ -393,90 +394,5 @@ int main(){
|
|||||||
engine.setScene(menu->getScene());
|
engine.setScene(menu->getScene());
|
||||||
engine.getInput()->setMouseGrabbed(false);
|
engine.getInput()->setMouseGrabbed(false);
|
||||||
|
|
||||||
/*
|
|
||||||
// trackball camera
|
|
||||||
TrackBallCameraNode *trackBallCam = new TrackBallCameraNode(engine.getInput());
|
|
||||||
trackBallCam->setInputs(myKeysMap::SECONDARY_HOLD, myKeysMap::MAIN_HOLD);
|
|
||||||
scene.getRootObject()->addChild(trackBallCam);
|
|
||||||
scene.setMainCamera(trackBallCam);
|
|
||||||
|
|
||||||
// first person player controller
|
|
||||||
PlayerCharacterNode *player = new PlayerCharacterNode(false);
|
|
||||||
player->setInputs(DefaultKeysMap::MOVE_FORWARD, DefaultKeysMap::MOVE_BACKWARD, DefaultKeysMap::STRAFE_LEFT, DefaultKeysMap::STRAFE_RIGHT, DefaultKeysMap::JUMP, DefaultKeysMap::TOGGLE_NOCLIP);
|
|
||||||
scene->getRootObject()->addChild(player);
|
|
||||||
scene->setMainCamera(player);
|
|
||||||
engine.getPhysics()->addRigidBody(player->getRigidbody());
|
|
||||||
|
|
||||||
// throw cubes and spheres with mouse clicks
|
|
||||||
Potator *potator = new Potator(player, DefaultKeysMap::MAIN_ACTION, DefaultKeysMap::SECONDARY_ACTION, DefaultKeysMap::TERTIARY_ACTION);
|
|
||||||
scene->getRootObject()->addChild(potator);
|
|
||||||
|
|
||||||
// lighting
|
|
||||||
LightNode *ambientLight = new LightNode(new AmbientLight(glm::vec3(0.05f)));
|
|
||||||
|
|
||||||
DirectionnalLight* sun = new DirectionnalLight(glm::vec3(5, 8, -2), glm::vec3(0.9f));
|
|
||||||
LightNode *sunLight = new LightNode(sun);
|
|
||||||
|
|
||||||
scene->getRootObject()->addChild(ambientLight);
|
|
||||||
scene->getRootObject()->addChild(sunLight);
|
|
||||||
*/
|
|
||||||
// scene
|
|
||||||
|
|
||||||
/* if(config.scene == "sponza")
|
|
||||||
{
|
|
||||||
sun->initShadowMap(4096);
|
|
||||||
generateSponza(scene, engine.getPhysics());
|
|
||||||
scene->getRootObject()->addChild(new LightNode(new PointLight(glm::vec3(-3.5, 2, 1.8), 15, glm::vec3(0.35f))));
|
|
||||||
scene->getRootObject()->addChild(new LightNode(new PointLight(glm::vec3(-5, 6, 2), 15, glm::vec3(0.35f))));
|
|
||||||
player->setPosition(0.f, 2.f, 0.f);
|
|
||||||
sun->setShadowView(glm::vec3(30, 30, 50));
|
|
||||||
}
|
|
||||||
else if(config->scene == "terrain")
|
|
||||||
{
|
|
||||||
sun->initShadowMap(4096);
|
|
||||||
generateTerrain(scene, engine.getPhysics());
|
|
||||||
player->setPosition(0.f, 15.f, 0.f);
|
|
||||||
sun->setShadowView(glm::vec3(130, 130, 70));
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// shell output tests
|
|
||||||
// engine.getShell()->out("Hello World!");
|
|
||||||
// engine.getShell()->out("Starting test :");
|
|
||||||
|
|
||||||
// preparing shaders and launching the engine
|
|
||||||
engine.start();
|
engine.start();
|
||||||
|
|
||||||
// pathfinding tests
|
|
||||||
/* GraphNode n1 = GraphNode();
|
|
||||||
n1.setValue(1);
|
|
||||||
GraphNode n2 = GraphNode();
|
|
||||||
n2.setValue(2);
|
|
||||||
GraphNode n3 = GraphNode();
|
|
||||||
n3.setValue(3);
|
|
||||||
GraphNode n4 = GraphNode();
|
|
||||||
n4.setValue(4);
|
|
||||||
GraphNode n5 = GraphNode();
|
|
||||||
n5.setValue(5);
|
|
||||||
|
|
||||||
n1.addNeighbours(&n2);
|
|
||||||
n1.addNeighbours(&n3);
|
|
||||||
n2.addNeighbours(&n4);
|
|
||||||
n3.addNeighbours(&n4);
|
|
||||||
n3.addNeighbours(&n2);
|
|
||||||
n3.addNeighbours(&n5);
|
|
||||||
|
|
||||||
std::vector<GraphNode*> path = PathFinder::a_star(&n1,&n4,true);
|
|
||||||
std::cout << "Path Size: " << path.size() << std::endl;
|
|
||||||
for(GraphNode* gn: path){
|
|
||||||
std::cout << gn->getValue() << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// loaders tests
|
|
||||||
Loader::setObjDirectory("data/");
|
|
||||||
Loader::setMtlDirectory("data/");
|
|
||||||
Loader::setTexDirectory("data/");
|
|
||||||
std::vector<Mesh*> meshes = Loader::loadMesh("sword.obj");
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user