rotate those boxes
This commit is contained in:
parent
5926b21cd4
commit
976f5eeafc
|
@ -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
|
||||||
|
|
10
src/main.c
10
src/main.c
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,9 @@ void addChild(SceneNode* parent, SceneNode* child) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateSceneNode(SceneNode* node, mat4* parentTransformation) {
|
void updateSceneNode(SceneNode* node, mat4* parentTransformation) {
|
||||||
|
if (parentTransformation) {
|
||||||
multiply(&node->worldTransformation, parentTransformation, &node->transformation);
|
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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue