From 5926b21cd4dd1c65a80fdf8cff2122e59b866a54 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Wed, 19 Jun 2024 17:34:39 +0200 Subject: [PATCH] change scene graph syntax --- scene-graph-example.scg | 16 +++++----- src/sceneGraph.c | 68 +++++++++++++++++++++++++---------------- test-scene-graph.scg | 6 ++-- 3 files changed, 53 insertions(+), 37 deletions(-) diff --git a/scene-graph-example.scg b/scene-graph-example.scg index 07c356d..20c01fa 100644 --- a/scene-graph-example.scg +++ b/scene-graph-example.scg @@ -35,7 +35,7 @@ name myCrate1 # Position des Objekts # relativ zur Position des Parent Elements -position 0.0 0.0 2.0 +translate 0.0 0.0 2.0 # Skalierung des Objekts # relativ zur Skalierung des Parent Elements @@ -43,16 +43,16 @@ scale 1.0 1.0 1.0 # rotationen -rotationX 0.0 -rotationY 1.5 -rotationZ 0.0 +rotateX 0.0 +rotateY 1.5 +rotateZ 0.0 obj 1 use 0 name myCrate2 -position 0.0 1.0 0.0 +translate 0.0 1.0 0.0 scale 0.5 0.5 0.5 # Definition des Parent Objekts parent 0 @@ -62,7 +62,7 @@ obj 2 use 1 name Sonne #texture ../texture/pb.png -position 0.0 0.0 0.0 +translate 0.0 0.0 0.0 scale 2.0 2.0 2.0 @@ -70,7 +70,7 @@ obj 3 use 1 name Erde #texture ../texture/earth/day.png -position 4.0 0.0 0.0 +translate 4.0 0.0 0.0 scale 1.0 1.0 1.0 parent 2 @@ -79,6 +79,6 @@ obj 4 use 1 name Mond #texture ../texture/checkerboard.png -position 2.0 0.0 0.0 +translate 2.0 0.0 0.0 scale 0.5 0.5 0.5 parent 3 \ No newline at end of file diff --git a/src/sceneGraph.c b/src/sceneGraph.c index d551b51..3f695d1 100644 --- a/src/sceneGraph.c +++ b/src/sceneGraph.c @@ -14,6 +14,22 @@ #define SCG_LINE_BUFFER_SIZE 1024 #define SCG_KEYWORD_BUFFER_SIZE 32 +#define KEYWORD_DEFINE_MODEL "model" +#define KEYWORD_DEFINE_NODE "obj" + +#define KEYWORD_DEFINE_OBJ_FILE "file" +#define KEYWORD_DEFINE_TEXTURE_FILE "texture" + +#define KEYWORD_USE_MODEL "use" +#define KEYWORD_DEFINE_PARENT "parent" +#define KEYWORD_DEFINE_NAME "name" + +#define KEYWORD_SCALE "scale" +#define KEYWORD_TRANSLATE "translate" +#define KEYWORD_ROTATE_X "rotateX" +#define KEYWORD_ROTATE_Y "rotateY" +#define KEYWORD_ROTATE_Z "rotateZ" + void (*renderFunction)(SceneNode*); void setNodeRenderFunction(void (*newRenderFunction)(SceneNode*)) { @@ -141,9 +157,9 @@ SceneNode* loadSceneGraphFromFile(char* path) { sscanf(buf, keywordBufferFormat, keyword); // printf("%s\n", keyword); - if (strcmp(keyword, "model") == 0) { + if (strcmp(keyword, KEYWORD_DEFINE_MODEL) == 0) { int modelId = 0; - sscanf(buf, "model %d", &modelId); + sscanf(buf, KEYWORD_DEFINE_MODEL " %d", &modelId); if (modelId > maxModelId) { maxModelId = modelId; } @@ -167,23 +183,23 @@ SceneNode* loadSceneGraphFromFile(char* path) { if (buf[0] == '\r' || buf[0] == '\n' || buf[0] == '\0') continue; sscanf(buf, keywordBufferFormat, keyword); - if (strcmp(keyword, "model") == 0) { - sscanf(buf, "model %d", ¤tModel); + if (strcmp(keyword, KEYWORD_DEFINE_MODEL) == 0) { + sscanf(buf, KEYWORD_DEFINE_MODEL " %d", ¤tModel); continue; } - if (strcmp(keyword, "file") == 0) { - sscanf(buf, "file %s", filepathBuffer); + if (strcmp(keyword, KEYWORD_DEFINE_OBJ_FILE) == 0) { + sscanf(buf, KEYWORD_DEFINE_OBJ_FILE " %s", filepathBuffer); models[currentModel].objectData = readSingleObjFile(filepathBuffer); continue; } - if (strcmp(keyword, "texture") == 0) { - sscanf(buf, "texture %s", filepathBuffer); + if (strcmp(keyword, KEYWORD_DEFINE_TEXTURE_FILE) == 0) { + sscanf(buf, KEYWORD_DEFINE_TEXTURE_FILE " %s", filepathBuffer); loadTexture(filepathBuffer, &models[currentModel].texture); continue; } - if (strcmp(keyword, "obj") == 0) { + if (strcmp(keyword, KEYWORD_DEFINE_NODE) == 0) { if (currentNode && !currentNodeHasParent) { addChild(root, currentNode); @@ -193,7 +209,7 @@ SceneNode* loadSceneGraphFromFile(char* path) { currentNodeHasParent = false; int nodeId = 0; - sscanf(buf, "obj %d", &nodeId); + sscanf(buf, KEYWORD_DEFINE_NODE " %d", &nodeId); if (findNode(nodeId, root)) { fprintf(stderr, "redeclaration of objet with id %d - line %d\n", nodeId, currentLine); return NULL; @@ -201,19 +217,19 @@ SceneNode* loadSceneGraphFromFile(char* path) { currentNode = createSceneNode(nodeId); continue; } - if (strcmp(keyword, "name") == 0) { + if (strcmp(keyword, KEYWORD_DEFINE_NAME) == 0) { if (!currentNode) { fprintf(stderr, "no node selected, can't assign name - line %d\n", currentLine); return NULL; } - sscanf(buf, "name %s", filepathBuffer); + sscanf(buf, KEYWORD_DEFINE_NAME " %s", filepathBuffer); char* name = (char*)malloc(strlen(filepathBuffer) * sizeof(char) + 1); strcpy(name, filepathBuffer); currentNode->name = name; continue; } - if (strcmp(keyword, "parent") == 0) { + if (strcmp(keyword, KEYWORD_DEFINE_PARENT) == 0) { if (!currentNode) { fprintf(stderr, "no node selected, can't assign parent - line %d\n", currentLine); return NULL; @@ -224,7 +240,7 @@ SceneNode* loadSceneGraphFromFile(char* path) { } int parentId = 0; - sscanf(buf, "parent %d", &parentId); + sscanf(buf, KEYWORD_DEFINE_PARENT " %d", &parentId); SceneNode* parent = findNode(parentId, root); if (!parent) { @@ -238,14 +254,14 @@ SceneNode* loadSceneGraphFromFile(char* path) { continue; } - if (strcmp(keyword, "use") == 0) { + if (strcmp(keyword, KEYWORD_USE_MODEL) == 0) { if (!currentNode) { fprintf(stderr, "no node selected to assign model to - line %d\n", currentLine); return NULL; } int usedModel = 0; - sscanf(buf, "use %d", &usedModel); + sscanf(buf, KEYWORD_USE_MODEL " %d", &usedModel); if (usedModel > maxModelId || usedModel < 0) { fprintf(stderr, "model with id %d not found - line %d\n", usedModel, currentLine); @@ -255,51 +271,51 @@ SceneNode* loadSceneGraphFromFile(char* path) { currentNode->model = &models[usedModel]; } - if (strcmp(keyword, "position") == 0) { + if (strcmp(keyword, KEYWORD_TRANSLATE) == 0) { if (!currentNode) { fprintf(stderr, "no node selected to assign position to - line %d\n", currentLine); return NULL; } vec3 translation; - sscanf(buf, "position %f %f %f", &translation.x, &translation.y, &translation.z); + sscanf(buf, KEYWORD_TRANSLATE " %f %f %f", &translation.x, &translation.y, &translation.z); translate(¤tNode->transformation, ¤tNode->transformation, &translation); } - if (strcmp(keyword, "scale") == 0) { + if (strcmp(keyword, KEYWORD_SCALE) == 0) { if (!currentNode) { fprintf(stderr, "no node selected to assign scale to - line %d\n", currentLine); return NULL; } vec3 translation; - sscanf(buf, "scale %f %f %f", &translation.x, &translation.y, &translation.z); + sscanf(buf, KEYWORD_SCALE " %f %f %f", &translation.x, &translation.y, &translation.z); scale(¤tNode->transformation, ¤tNode->transformation, &translation); } - if (strcmp(keyword, "rotationX") == 0) { + if (strcmp(keyword, KEYWORD_ROTATE_X) == 0) { if (!currentNode) { fprintf(stderr, "no node selected to assign rotationX to - line %d\n", currentLine); return NULL; } GLfloat angle; - sscanf(buf, "rotationX %f", &angle); + sscanf(buf, KEYWORD_ROTATE_X " %f", &angle); rotateX(¤tNode->transformation, ¤tNode->transformation, angle); } - if (strcmp(keyword, "rotationY") == 0) { + if (strcmp(keyword, KEYWORD_ROTATE_Y) == 0) { if (!currentNode) { fprintf(stderr, "no node selected to assign rotationY to - line %d\n", currentLine); return NULL; } GLfloat angle; - sscanf(buf, "rotationY %f", &angle); + sscanf(buf, KEYWORD_ROTATE_Y " %f", &angle); rotateY(¤tNode->transformation, ¤tNode->transformation, angle); } - if (strcmp(keyword, "rotationZ") == 0) { + if (strcmp(keyword, KEYWORD_ROTATE_Z) == 0) { if (!currentNode) { fprintf(stderr, "no node selected to assign rotationZ to - line %d\n", currentLine); return NULL; } GLfloat angle; - sscanf(buf, "rotationZ %f", &angle); + sscanf(buf, KEYWORD_ROTATE_Z " %f", &angle); rotateZ(¤tNode->transformation, ¤tNode->transformation, angle); } } diff --git a/test-scene-graph.scg b/test-scene-graph.scg index c089f07..4bbeb39 100644 --- a/test-scene-graph.scg +++ b/test-scene-graph.scg @@ -10,17 +10,17 @@ name box1 obj 1 parent 0 scale 0.2 0.8 0.2 -position 0.5 0.0 0.0 +translate 0.5 0.0 0.0 name box2 obj 2 parent 1 scale 0.3 0.6 0.3 -position 0.5 0.0 0.0 +translate 0.5 0.0 0.0 name box3 obj 3 parent 2 scale 0.4 0.4 0.4 -position 0.5 0.0 0.0 +translate 0.5 0.0 0.0 name box4 \ No newline at end of file