Scene tree
This commit is contained in:
parent
35f43e9520
commit
a3e4a0d512
@ -1,12 +1,11 @@
|
||||
#ifndef CAMERA_H
|
||||
#define CAMERA_H
|
||||
|
||||
#include "Transform.h"
|
||||
#include "Spatial.h"
|
||||
|
||||
class Camera {
|
||||
class Camera : public Spatial {
|
||||
public:
|
||||
Camera();
|
||||
Transform transform;
|
||||
void MakeCurrent();
|
||||
static Camera *GetCurrentCamera();
|
||||
private:
|
||||
|
12
core/Drawable.h
Normal file
12
core/Drawable.h
Normal file
@ -0,0 +1,12 @@
|
||||
#ifndef DRAWABLE_H
|
||||
#define DRAWABLE_H
|
||||
|
||||
#include "Node.h"
|
||||
|
||||
class Drawable : virtual public Node {
|
||||
public:
|
||||
virtual bool IsDrawable() const {return true;}
|
||||
virtual void Draw() = 0;
|
||||
};
|
||||
|
||||
#endif /* DRAWABLE_H */
|
@ -4,18 +4,18 @@
|
||||
#include <list>
|
||||
|
||||
#include "types.h"
|
||||
#include "Spatial.h"
|
||||
#include "Drawable.h"
|
||||
#include "Vertex.h"
|
||||
#include "Index.h"
|
||||
#include "Transform.h"
|
||||
|
||||
class Mesh {
|
||||
class Mesh : public Spatial, public Drawable {
|
||||
public:
|
||||
VertexList vertices;
|
||||
IndexList indices;
|
||||
Transform transform;
|
||||
Mesh();
|
||||
Mesh(VertexList vertices, IndexList indices);
|
||||
void Draw();
|
||||
virtual void Draw();
|
||||
virtual void SetupMesh();
|
||||
private:
|
||||
Id VAO, VBO, EBO;
|
||||
|
16
core/Node.cpp
Normal file
16
core/Node.cpp
Normal file
@ -0,0 +1,16 @@
|
||||
#include "Node.h"
|
||||
|
||||
Node *Node::root = {new Node()};
|
||||
Node *Node::GetRoot() {
|
||||
return root;
|
||||
}
|
||||
bool Node::IsDrawable() const {
|
||||
return false;
|
||||
}
|
||||
bool Node::IsTransformable() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
void NodeList::Append(Node *node) {
|
||||
push_back(node);
|
||||
}
|
22
core/Node.h
Normal file
22
core/Node.h
Normal file
@ -0,0 +1,22 @@
|
||||
#ifndef NODE_H
|
||||
#define NODE_H
|
||||
|
||||
#include <vector>
|
||||
|
||||
class Node; // Forwards declare
|
||||
class NodeList : public std::vector<Node*> {
|
||||
public:
|
||||
void Append(Node *node);
|
||||
};
|
||||
|
||||
class Node {
|
||||
public:
|
||||
NodeList children;
|
||||
static Node *GetRoot();
|
||||
virtual bool IsDrawable() const;
|
||||
virtual bool IsTransformable() const;
|
||||
private:
|
||||
static Node *root;
|
||||
};
|
||||
|
||||
#endif /* NODE_H */
|
10
core/ScriptingLanguage.h
Normal file
10
core/ScriptingLanguage.h
Normal file
@ -0,0 +1,10 @@
|
||||
#ifndef SCRIPTINGLANGUAGE_H
|
||||
#define SCRIPTINGLANGUAGE_H
|
||||
|
||||
class ScriptingLangauge {
|
||||
void Initialize();
|
||||
void Update();
|
||||
void Close();
|
||||
}
|
||||
|
||||
#endif /* SCRIPTINGLANGUAGE_H */
|
13
core/Spatial.h
Normal file
13
core/Spatial.h
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef SPATIAL_H
|
||||
#define SPATIAL_H
|
||||
|
||||
#include "Node.h"
|
||||
#include "Transform.h"
|
||||
|
||||
class Spatial : virtual public Node {
|
||||
public:
|
||||
Transform transform;
|
||||
virtual bool IsTransformable() const { return true;}
|
||||
};
|
||||
|
||||
#endif /* SPATIAL_H */
|
@ -2,6 +2,7 @@
|
||||
|
||||
Transform::Transform() {
|
||||
position = Vector3(0.0f);
|
||||
rotation = Vector3(0.0f);
|
||||
}
|
||||
|
||||
Transform::Transform(Vector3 position, Vector3 rotation) {
|
||||
|
@ -21,23 +21,39 @@ extern "C" {
|
||||
#include "Ball.h"
|
||||
#include "Camera.h"
|
||||
#include "Input.h"
|
||||
#include "Node.h"
|
||||
|
||||
Window *window;
|
||||
|
||||
const int width = 800;
|
||||
const int height = 600;
|
||||
|
||||
MeshList meshes;
|
||||
Node *root;
|
||||
|
||||
void AddMeshToList(Mesh &mesh) {
|
||||
meshes.push_front(&mesh);
|
||||
}
|
||||
#ifdef LUA_SCRIPTING
|
||||
|
||||
extern "C" int luaopen_couch(lua_State* L);
|
||||
|
||||
#endif // LUA_SCRIPTING
|
||||
|
||||
void render(Node *curr, Shader shader, Matrix model) {
|
||||
if (curr->IsDrawable()) {
|
||||
if (curr->IsTransformable()) {
|
||||
Spatial *spatial = dynamic_cast<Spatial*>(curr);
|
||||
model = glm::rotate(model, spatial->transform.rotation.x, Vector3(1.0f, 0.0f, 0.0f));
|
||||
model = glm::rotate(model, spatial->transform.rotation.y, Vector3(0.0f, 1.0f, 0.0f));
|
||||
model = glm::rotate(model, spatial->transform.rotation.z, Vector3(0.0f, 0.0f, 1.0f));
|
||||
model = glm::translate(model, spatial->transform.position);
|
||||
shader.UpdateModel(model);
|
||||
}
|
||||
Drawable *drawable = dynamic_cast<Drawable*>(curr);
|
||||
drawable->Draw();
|
||||
}
|
||||
for (Node *child : curr->children) {
|
||||
render(child, shader, model);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
|
||||
@ -63,6 +79,8 @@ int main() {
|
||||
|
||||
glViewport(0, 0, width, height);
|
||||
|
||||
root = Node::GetRoot();
|
||||
|
||||
#ifdef LUA_SCRIPTING
|
||||
lua_State *L;
|
||||
L = luaL_newstate();
|
||||
@ -113,15 +131,8 @@ int main() {
|
||||
lua_call(L, 1, 0);
|
||||
#endif // LUA_SCRIPTING
|
||||
|
||||
for (Mesh *mesh : meshes) {
|
||||
Matrix model(1.0f);
|
||||
model = glm::rotate(model, mesh->transform.rotation.x, Vector3(1.0f, 0.0f, 0.0f));
|
||||
model = glm::rotate(model, mesh->transform.rotation.y, Vector3(0.0f, 1.0f, 0.0f));
|
||||
model = glm::rotate(model, mesh->transform.rotation.z, Vector3(0.0f, 0.0f, 1.0f));
|
||||
model = glm::translate(model, mesh->transform.position);
|
||||
shader.UpdateModel(model);
|
||||
mesh->Draw();
|
||||
}
|
||||
// Render the scene tree
|
||||
render(root, shader, Matrix(1.0f));
|
||||
|
||||
|
||||
glfwSwapBuffers(window);
|
||||
|
5
main.lua
5
main.lua
@ -1,4 +1,5 @@
|
||||
local ball
|
||||
local ball1
|
||||
local camera
|
||||
|
||||
local LEFT = 263
|
||||
@ -21,10 +22,10 @@ function init()
|
||||
camera.transform:Translate(0.0, 0.0, 10.0)
|
||||
ball = couch.Ball()
|
||||
ball:SetupMesh()
|
||||
couch.AddMeshToList(ball)
|
||||
couch.Node.GetRoot().children:Append(ball)
|
||||
ball1 = couch.Ball()
|
||||
ball1:SetupMesh()
|
||||
couch.AddMeshToList(ball1)
|
||||
couch.Node.GetRoot().children:Append(ball1)
|
||||
|
||||
ball1.transform:Translate(0.0, 3.0, 0.0)
|
||||
end
|
||||
|
@ -5,7 +5,8 @@
|
||||
- GLEW to wrangle extensions
|
||||
- GLFW3 for handling windows and whatnot
|
||||
- Targets Windows, Linux
|
||||
- ~~Guile with GOOPS as scripting language~~ Lua is the scripting language with Guile as a strech goal
|
||||
- ~~Guile with GOOPS as scripting language~~ ~~Lua is the scripting language with Guile as a stretch goal~~
|
||||
- Python?
|
||||
- No editor planned
|
||||
|
||||
## Roadmap
|
||||
@ -15,3 +16,8 @@ I want my balls to be programmable, I need to create a few key classes
|
||||
2. Transforms, which represent position (of my balls)
|
||||
3. Camera, to look at my balls
|
||||
4. Shaders, to render my balls
|
||||
### Programmable Balls Postmortem
|
||||
Everything seems to work, but we need a system of what goes in the scene
|
||||
I think a scene tree like the one in Godot would be cool
|
||||
|
||||
I keep switching scripting languages, can I make it so it's programmable in many languages, switchable via command line?
|
||||
|
@ -4,18 +4,22 @@
|
||||
$1 = (cfloat) lua_tonumber(L, $input);
|
||||
}
|
||||
%{
|
||||
#include "Node.h"
|
||||
#include "Transform.h"
|
||||
#include "Spatial.h"
|
||||
#include "Drawable.h"
|
||||
#include "Mesh.h"
|
||||
#include "Ball.h"
|
||||
#include "Camera.h"
|
||||
extern void AddMeshToList(Mesh &mesh);
|
||||
%}
|
||||
typedef float cfloat;
|
||||
struct Vector3 {
|
||||
double x, y, z;
|
||||
cfloat x, y, z;
|
||||
};
|
||||
%include "Node.h"
|
||||
%include "Spatial.h"
|
||||
%include "Transform.h"
|
||||
%include "Drawable.h"
|
||||
%include "Mesh.h"
|
||||
%include "Ball.h"
|
||||
%include "Camera.h"
|
||||
|
||||
extern void AddMeshToList(Mesh &mesh);
|
||||
|
Loading…
Reference in New Issue
Block a user