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
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

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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