From 976f5eeafc62fcb7e44d62da8456eb3e48346e86 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Wed, 19 Jun 2024 18:15:10 +0200 Subject: [PATCH] rotate those boxes --- scene-graph-example.scg | 2 +- src/main.c | 10 ++++++++-- src/sceneGraph.c | 17 +++++++++++++---- src/sceneGraph.h | 3 +++ test-scene-graph.scg | 30 +++++++++++++++++++++--------- 5 files changed, 46 insertions(+), 16 deletions(-) diff --git a/scene-graph-example.scg b/scene-graph-example.scg index 20c01fa..a9b723a 100644 --- a/scene-graph-example.scg +++ b/scene-graph-example.scg @@ -52,7 +52,7 @@ rotateZ 0.0 obj 1 use 0 name myCrate2 -translate 0.0 1.0 0.0 +translate 0.0 3.0 0.0 scale 0.5 0.5 0.5 # Definition des Parent Objekts parent 0 diff --git a/src/main.c b/src/main.c index 55ad673..2fa309c 100644 --- a/src/main.c +++ b/src/main.c @@ -212,7 +212,7 @@ void init(void) { setNodeRenderFunction(&renderNode); // read scene graph - rootNode = loadSceneGraphFromFile("../scene-graph-example.scg"); + rootNode = loadSceneGraphFromFile("../test-scene-graph.scg"); // ENABLE BACKFACE CULLING glFrontFace(GL_CCW); @@ -241,12 +241,14 @@ void draw(void) { timeSinceUpdate += deltaTime; glfwSetTime(0.0f); + if (timeSinceUpdate >= timeBetweenUpdates) { updateStats(); timeSinceUpdate = 0.0f; framesSinceUpdate = 0; } + // camera movement handleInputs(deltaTime); @@ -259,6 +261,10 @@ void draw(void) { if (step > 1.0f) step -= 1.0f; if (step < 0.0f) step += 1.0f; + SceneNode* box3 = findNodeByName("box3", rootNode); + rotateY(&box3->transformation, &box3->transformation, 0.001); + updateSceneNode(rootNode, NULL); + // step multiplied by pi * 2 for use in rotation and trig functions GLfloat stepi = step * pi * 2; @@ -291,7 +297,7 @@ void draw(void) { glUniform4f(glGetUniformLocation(program, "ambientLight"), 0.05f, 0.05f, 0.05f, 1.0f); vec4 lightPosition = {cos(stepi) * 5.0f, 5.0f, sin(stepi) * 5.0f, 1.0f}; - multiplyAny(&lightPosition, &viewingTransformation, &lightPosition, 4, 4, 1); + multiplyAny((GLfloat*)&lightPosition, (GLfloat*)&viewingTransformation, (GLfloat*)&lightPosition, 4, 4, 1); glUniform3f(glGetUniformLocation(program, "lightPosition"), lightPosition.x, lightPosition.y, lightPosition.z); diff --git a/src/sceneGraph.c b/src/sceneGraph.c index 3f695d1..9af49c8 100644 --- a/src/sceneGraph.c +++ b/src/sceneGraph.c @@ -55,7 +55,9 @@ void addChild(SceneNode* parent, SceneNode* child) { } void updateSceneNode(SceneNode* node, mat4* parentTransformation) { - multiply(&node->worldTransformation, parentTransformation, &node->transformation); + if (parentTransformation) { + multiply(&node->worldTransformation, parentTransformation, &node->transformation); + } for (int i = 0; i < node->numChildren; i++) { updateSceneNode(node->children[i], &node->worldTransformation); } @@ -116,6 +118,15 @@ SceneNode* findNode(int id, SceneNode* root) { return NULL; } +SceneNode* findNodeByName(char* name, SceneNode* root) { + if (root->name && strcmp(root->name, name) == 0) return root; + for (int i = 0; i < root->numChildren; i++) { + SceneNode* node = findNodeByName(name, root->children[i]); + if (node) return node; + } + return NULL; +} + void printSceneGraph(SceneNode* node, int level) { for (int i = 0; i < level; i++) { printf(" - "); @@ -324,9 +335,7 @@ SceneNode* loadSceneGraphFromFile(char* path) { addChild(root, currentNode); } - mat4 rootTransform; - identity(&rootTransform); - updateSceneNode(root, &rootTransform); + updateSceneNode(root, NULL); printSceneGraph(root, 0); diff --git a/src/sceneGraph.h b/src/sceneGraph.h index 97ab5ec..8042ed4 100644 --- a/src/sceneGraph.h +++ b/src/sceneGraph.h @@ -26,12 +26,15 @@ struct SceneNode { char* name; }; +extern SceneNode* findNode(int id, SceneNode* root); +extern SceneNode* findNodeByName(char* name, SceneNode* root); extern void setNodeRenderFunction(void (*newRenderFunction)(SceneNode*)); extern SceneNode* createSceneNode(); extern void addChild(SceneNode* parent, SceneNode* child); extern void updateSceneNode(SceneNode* node, mat4* parentTransformation); extern void renderSceneNode(SceneNode* node); extern void freeSceneNode(SceneNode* node); +extern void printSceneGraph(SceneNode* root, int level); extern SceneNode* loadSceneGraphFromFile(char* path); #endif \ No newline at end of file diff --git a/test-scene-graph.scg b/test-scene-graph.scg index 4bbeb39..c882649 100644 --- a/test-scene-graph.scg +++ b/test-scene-graph.scg @@ -4,23 +4,35 @@ texture ../texture/crate/texture.jpg obj 0 use 0 -scale 0.1 1.0 0.1 +scale 1.0 0.3 1.0 name box1 obj 1 parent 0 -scale 0.2 0.8 0.2 -translate 0.5 0.0 0.0 -name box2 +translate 2.0 0.0 0.0 obj 2 +use 0 parent 1 -scale 0.3 0.6 0.3 -translate 0.5 0.0 0.0 -name box3 +scale 0.7 1.5 0.7 +name box2 obj 3 parent 2 -scale 0.4 0.4 0.4 -translate 0.5 0.0 0.0 +translate 2.0 0.0 0.0 + +obj 4 +use 0 +parent 3 +scale 0.7 1.5 0.7 +name box3 + +obj 5 +parent 4 +translate 2.0 0.0 0.0 + +obj 6 +use 0 +parent 5 +scale 0.7 1.5 0.7 name box4 \ No newline at end of file