rotate those boxes

This commit is contained in:
Luca Conte 2024-06-19 18:15:10 +02:00
parent 5926b21cd4
commit 976f5eeafc
5 changed files with 46 additions and 16 deletions

View File

@ -52,7 +52,7 @@ rotateZ 0.0
obj 1 obj 1
use 0 use 0
name myCrate2 name myCrate2
translate 0.0 1.0 0.0 translate 0.0 3.0 0.0
scale 0.5 0.5 0.5 scale 0.5 0.5 0.5
# Definition des Parent Objekts # Definition des Parent Objekts
parent 0 parent 0

View File

@ -212,7 +212,7 @@ void init(void) {
setNodeRenderFunction(&renderNode); setNodeRenderFunction(&renderNode);
// read scene graph // read scene graph
rootNode = loadSceneGraphFromFile("../scene-graph-example.scg"); rootNode = loadSceneGraphFromFile("../test-scene-graph.scg");
// ENABLE BACKFACE CULLING // ENABLE BACKFACE CULLING
glFrontFace(GL_CCW); glFrontFace(GL_CCW);
@ -241,12 +241,14 @@ void draw(void) {
timeSinceUpdate += deltaTime; timeSinceUpdate += deltaTime;
glfwSetTime(0.0f); glfwSetTime(0.0f);
if (timeSinceUpdate >= timeBetweenUpdates) { if (timeSinceUpdate >= timeBetweenUpdates) {
updateStats(); updateStats();
timeSinceUpdate = 0.0f; timeSinceUpdate = 0.0f;
framesSinceUpdate = 0; framesSinceUpdate = 0;
} }
// camera movement // camera movement
handleInputs(deltaTime); handleInputs(deltaTime);
@ -259,6 +261,10 @@ void draw(void) {
if (step > 1.0f) step -= 1.0f; if (step > 1.0f) step -= 1.0f;
if (step < 0.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 // step multiplied by pi * 2 for use in rotation and trig functions
GLfloat stepi = step * pi * 2; GLfloat stepi = step * pi * 2;
@ -291,7 +297,7 @@ void draw(void) {
glUniform4f(glGetUniformLocation(program, "ambientLight"), 0.05f, 0.05f, 0.05f, 1.0f); 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}; 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); glUniform3f(glGetUniformLocation(program, "lightPosition"), lightPosition.x, lightPosition.y, lightPosition.z);

View File

@ -55,7 +55,9 @@ void addChild(SceneNode* parent, SceneNode* child) {
} }
void updateSceneNode(SceneNode* node, mat4* parentTransformation) { 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++) { for (int i = 0; i < node->numChildren; i++) {
updateSceneNode(node->children[i], &node->worldTransformation); updateSceneNode(node->children[i], &node->worldTransformation);
} }
@ -116,6 +118,15 @@ SceneNode* findNode(int id, SceneNode* root) {
return NULL; 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) { void printSceneGraph(SceneNode* node, int level) {
for (int i = 0; i < level; i++) { for (int i = 0; i < level; i++) {
printf(" - "); printf(" - ");
@ -324,9 +335,7 @@ SceneNode* loadSceneGraphFromFile(char* path) {
addChild(root, currentNode); addChild(root, currentNode);
} }
mat4 rootTransform; updateSceneNode(root, NULL);
identity(&rootTransform);
updateSceneNode(root, &rootTransform);
printSceneGraph(root, 0); printSceneGraph(root, 0);

View File

@ -26,12 +26,15 @@ struct SceneNode {
char* name; char* name;
}; };
extern SceneNode* findNode(int id, SceneNode* root);
extern SceneNode* findNodeByName(char* name, SceneNode* root);
extern void setNodeRenderFunction(void (*newRenderFunction)(SceneNode*)); extern void setNodeRenderFunction(void (*newRenderFunction)(SceneNode*));
extern SceneNode* createSceneNode(); extern SceneNode* createSceneNode();
extern void addChild(SceneNode* parent, SceneNode* child); extern void addChild(SceneNode* parent, SceneNode* child);
extern void updateSceneNode(SceneNode* node, mat4* parentTransformation); extern void updateSceneNode(SceneNode* node, mat4* parentTransformation);
extern void renderSceneNode(SceneNode* node); extern void renderSceneNode(SceneNode* node);
extern void freeSceneNode(SceneNode* node); extern void freeSceneNode(SceneNode* node);
extern void printSceneGraph(SceneNode* root, int level);
extern SceneNode* loadSceneGraphFromFile(char* path); extern SceneNode* loadSceneGraphFromFile(char* path);
#endif #endif

View File

@ -4,23 +4,35 @@ texture ../texture/crate/texture.jpg
obj 0 obj 0
use 0 use 0
scale 0.1 1.0 0.1 scale 1.0 0.3 1.0
name box1 name box1
obj 1 obj 1
parent 0 parent 0
scale 0.2 0.8 0.2 translate 2.0 0.0 0.0
translate 0.5 0.0 0.0
name box2
obj 2 obj 2
use 0
parent 1 parent 1
scale 0.3 0.6 0.3 scale 0.7 1.5 0.7
translate 0.5 0.0 0.0 name box2
name box3
obj 3 obj 3
parent 2 parent 2
scale 0.4 0.4 0.4 translate 2.0 0.0 0.0
translate 0.5 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 name box4