added basic scripting to the SceneNode

This commit is contained in:
Anselme 2018-01-31 23:40:51 +01:00
parent 0015acb84c
commit 8d5b5f7ac9
7 changed files with 35 additions and 14 deletions

View File

@ -33,7 +33,8 @@ TextInputNode::TextInputNode(glm::vec2 dimension):
mesh->setMaterial(mat); mesh->setMaterial(mat);
mesh->setDepth(30); mesh->setDepth(30);
mesh->initGL(); mesh->initGL();
m_cursor_mesh = new SceneNode(false); m_cursor_mesh = new SceneNode();
m_cursor_mesh->setVisible(false);
m_cursor_mesh->setMesh(mesh); m_cursor_mesh->setMesh(mesh);
addChild(m_cursor_mesh); addChild(m_cursor_mesh);
} }
@ -147,12 +148,11 @@ void TextInputNode::updateTextMesh(){
this->removeChild(m_text_mesh); this->removeChild(m_text_mesh);
m_text_mesh->destroyWhenOrphan(); 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);
if(m_text_mesh){ if(m_text_mesh){
m_text_mesh->setTransform(glm::mat4()); m_text_mesh->setTransform(glm::mat4());
m_text_mesh->setDepth(15); m_text_mesh->setDepth(15);
this->addChild(m_text_mesh); this->addChild(m_text_mesh);
m_text_mesh->setVisible(true);
} }
m_text_updated = false; m_text_updated = false;
} }

View File

@ -20,10 +20,10 @@ void SceneNode::setParent(SceneNode* parent)
m_parent = parent; m_parent = parent;
} }
SceneNode::SceneNode(bool visible) : SceneNode::SceneNode(Script* script) :
m_toDestroy(false), m_toDestroy(false),
m_parentVisible(true), m_parentVisible(true),
m_visible(visible), m_visible(true),
m_enabled(true), m_enabled(true),
m_transformChanged(true), m_transformChanged(true),
m_parent(nullptr), m_parent(nullptr),
@ -31,12 +31,18 @@ SceneNode::SceneNode(bool visible) :
m_geometry(nullptr, glm::mat4()), m_geometry(nullptr, glm::mat4()),
m_light(nullptr), m_light(nullptr),
m_transform(glm::mat4()), m_transform(glm::mat4()),
m_script(script),
m_rigidBody(nullptr), m_rigidBody(nullptr),
m_motionState(this) m_motionState(this)
{} {
if(m_script != nullptr)
m_script->begin(this);
}
SceneNode::~SceneNode() SceneNode::~SceneNode()
{ {
if(m_script != nullptr)
m_script->end(this);
setVisible(false); setVisible(false);
setSceneTree(nullptr); setSceneTree(nullptr);
for(SceneNode* child : m_children) for(SceneNode* child : m_children)
@ -110,7 +116,8 @@ void SceneNode::update()
if(m_light != nullptr) if(m_light != nullptr)
updateLightSource(); updateLightSource();
} }
// TODO : add script execution here if(m_script != nullptr)
m_script->update(this);
for(SceneNode* child : m_children) for(SceneNode* child : m_children)
{ {
if(m_transformChanged) if(m_transformChanged)

View File

@ -29,6 +29,14 @@ public:
virtual void setWorldTransform(const btTransform& worldTrans); virtual void setWorldTransform(const btTransform& worldTrans);
}; };
class Script
{
public:
virtual void begin(SceneNode* node) {}
virtual void update(SceneNode* node) = 0;
virtual void end(SceneNode* node) {}
};
private: private:
bool m_toDestroy; bool m_toDestroy;
@ -56,6 +64,9 @@ private:
// m_parentTransform is the base transform for this element // m_parentTransform is the base transform for this element
glm::mat4 m_parentTransform; glm::mat4 m_parentTransform;
// m_script allows to add some game logic in a generic way
Script* m_script;
// bullet physics rigidbody // bullet physics rigidbody
btRigidBody *m_rigidBody; btRigidBody *m_rigidBody;
@ -71,7 +82,7 @@ private:
public: public:
// constructor/destructor // constructor/destructor
SceneNode(bool visible = true); SceneNode(Script *script = nullptr);
virtual ~SceneNode(); virtual ~SceneNode();
// game logic methods // game logic methods
@ -81,6 +92,8 @@ public:
bool isEnabled() { return m_enabled; } bool isEnabled() { return m_enabled; }
void setEnabled(bool isEnabled) { m_enabled = isEnabled; } void setEnabled(bool isEnabled) { m_enabled = isEnabled; }
Script* getScript();
// methods called to access the graphic propeties of the node // methods called to access the graphic propeties of the node
void setMesh(Mesh* mesh) { m_geometry.mesh = mesh; } void setMesh(Mesh* mesh) { m_geometry.mesh = mesh; }
Mesh* getMesh() { return m_geometry.mesh; } Mesh* getMesh() { return m_geometry.mesh; }

View File

@ -17,8 +17,8 @@ private:
friend class LabelNode; friend class LabelNode;
public: public:
TextNode(Mesh* mesh,std::wstring s,float fontSize,bool visible = true) : SceneNode(visible),m_string(s),m_fontSize(fontSize) { setMesh(mesh); } TextNode(Mesh* mesh,std::wstring s,float fontSize) : SceneNode(),m_string(s),m_fontSize(fontSize) { setMesh(mesh); }
TextNode(Mesh* mesh,std::string s,float fontSize,bool visible = true) : SceneNode(visible),m_fontSize(fontSize) { TextNode(Mesh* mesh,std::string s,float fontSize) : SceneNode(),m_fontSize(fontSize) {
setMesh(mesh); setMesh(mesh);
m_string.assign(s.begin(),s.end()); m_string.assign(s.begin(),s.end());
} }

View File

@ -117,11 +117,12 @@ void SparrowShell::out(std::string str,glm::vec3 color)
{ {
if(!str.empty()){ if(!str.empty()){
Font *shellfont = RESOURCE_GET(Font,"shellfont"); Font *shellfont = RESOURCE_GET(Font,"shellfont");
TextNode* tnode = shellfont->getTextNode(str,color,m_buffer->getFontSize(),false); TextNode* tnode = shellfont->getTextNode(str,color,m_buffer->getFontSize());
std::string name = "shellTextLine"; std::string name = "shellTextLine";
name += m_buffer->size(); name += m_buffer->size();
tnode->getMesh()->setName(name); tnode->getMesh()->setName(name);
tnode->setDepth(SHELL_DEPTH+1); tnode->setDepth(SHELL_DEPTH+1);
tnode->setVisible(false);
m_buffer->push(tnode); m_buffer->push(tnode);
scrollDown(); scrollDown();
if (m_buffer->size() > SparrowShell::BUFFER_DISPLAYED_LINES) if (m_buffer->size() > SparrowShell::BUFFER_DISPLAYED_LINES)

View File

@ -8,7 +8,7 @@ Font::Font()
} }
TextNode* Font::getTextNode(std::string s, glm::vec3 color, float font_size,bool visible) TextNode* Font::getTextNode(std::string s, glm::vec3 color, float font_size)
{ {
if(s.empty()) return nullptr; if(s.empty()) return nullptr;
@ -44,7 +44,7 @@ TextNode* Font::getTextNode(std::string s, glm::vec3 color, float font_size,bool
mat->albedo = color; mat->albedo = color;
textmesh->setMaterial((Material*)mat); textmesh->setMaterial((Material*)mat);
textmesh->initGL(); textmesh->initGL();
TextNode *text = new TextNode(textmesh,ws,font_size,visible); TextNode *text = new TextNode(textmesh, ws, font_size);
if (dimension.x < current_pos.x) if (dimension.x < current_pos.x)
dimension.x = current_pos.x; dimension.x = current_pos.x;
text->setDimension(dimension * sizeRatio); text->setDimension(dimension * sizeRatio);

View File

@ -32,7 +32,7 @@ public:
void setScale(glm::vec2 scale){m_scale = scale;} void setScale(glm::vec2 scale){m_scale = scale;}
void setTexture(Texture *tex){m_tex = tex;} void setTexture(Texture *tex){m_tex = tex;}
TextNode* getTextNode(std::string s, glm::vec3 color = glm::vec3(1), float font_size = 64.f, bool visible = true); TextNode* getTextNode(std::string s, glm::vec3 color = glm::vec3(1), float font_size = 64.f);
private: private:
std::string m_name; std::string m_name;
Texture *m_tex; Texture *m_tex;