From 2eb67d9bcae330eddfad43b93135febd02b75e57 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Sat, 15 Oct 2022 00:04:58 +0100 Subject: [PATCH] Updated Toy, added a couple util functions --- Toy | 2 +- assets/scripts/render.toy | 6 ++- assets/sprites/character.png | Bin 166 -> 700 bytes core/engine_node.c | 9 ++++- core/engine_node.h | 10 ++++- core/lib_engine.c | 76 ++++++++++++++++++++++++++++++++++- core/lib_render.c | 2 +- core/render_node.c | 2 + core/render_node.h | 9 +++++ 9 files changed, 107 insertions(+), 9 deletions(-) diff --git a/Toy b/Toy index 168369d..bd348ab 160000 --- a/Toy +++ b/Toy @@ -1 +1 @@ -Subproject commit 168369d8970c6497d3ccd15363dd46f04ea4e7f4 +Subproject commit bd348abf3250cb356a2bb80b5d46392e01435b31 diff --git a/assets/scripts/render.toy b/assets/scripts/render.toy index 9397292..99a7f96 100644 --- a/assets/scripts/render.toy +++ b/assets/scripts/render.toy @@ -1,3 +1,4 @@ +import engine; import render; fn onInit(node: opaque) { @@ -5,7 +6,8 @@ fn onInit(node: opaque) { } fn onStep(node: opaque) { - // + print node.getNodeTag(); + print node.getNodeParent().getNodeTag(); } fn onFree(node: opaque) { @@ -13,5 +15,5 @@ fn onFree(node: opaque) { } fn onDraw(node: opaque) { - node.drawRenderNode(50, 50); + node.drawRenderNode(50, 50, 100, 100); } \ No newline at end of file diff --git a/assets/sprites/character.png b/assets/sprites/character.png index 54077361aa50afefe2ac8811386899ea1d353a19..acf6c8a6aeb26512d824414424af29064429762d 100644 GIT binary patch delta 650 zcmV;50(JeS0lWo}83+ad000Y!x}%XHD1X8L01mwEXMy^G({b6Gxq_uPB#i%hNO&d4AZ{~F^z5PuBU z|8QvrEBm&_r5UXI@2Xsy!AgBTq3hp%@v`@bCO>|2EEXmZg1aAT#!@)P)Km&bU@C=G zOb&BtCWZB4F~Oyo6xROLK{A;_^uS~aAuyT3IYk#!#H+t~)g6uiDYmCC@d}b3Ty=*d z0EP4jS48)AdoyJ{0y#nYds@mfsO(bF@^?EMsVH+Te~bi+-t(1Sj- z2;@E>0g`k>i{Ri&ln&!jQKJVp59*@slokOfCf#kapVV9DX;zlMQm#}HYgK#&TeI%1 z&g`9t-)F1e3D4`(S4U#4im%|)WQ=ODK2cAU8#ME!?%eFYzj{6K6*LASRDY801hxl% zvw2h~a}|!S0Bk0QxFX8FuhQC`QC{f{!?pq>u>b4HqXuoH+~ccrblVEhgY9WIMQ*3! z*(TLDqpbj}-FCMH#}m!BQQf9M0fryOIKZ|XCYl!z;LT7WPyq7tZi>`?^G@gxD!}Q% zlm)mGGAext6`-+&IrnDEsCV=sQ~+LP<6L=B>4TC0TO@yV=%6G3@>hor%7TmEPBvlV zTUh}7QapJbJifIAekpJPgHmV-!1IUW&RbyEamT;r;f^LPiD!o+Ag^ z1820S-V|u=&tO$be`Iv+=1YV4(=vwcX9SCnAXC3{r^I}n&RE~`s-qcb41=eupUXO@ GgeCy;H7cI~ diff --git a/core/engine_node.c b/core/engine_node.c index 574bffc..025c336 100644 --- a/core/engine_node.c +++ b/core/engine_node.c @@ -2,7 +2,7 @@ #include "memory.h" -STATIC_ASSERT(sizeof(EngineNode) == 32); +STATIC_ASSERT(sizeof(EngineNode) == 48); STATIC_ASSERT(sizeof(EngineNodeCallback) == 8); STATIC_ASSERT(sizeof(LiteralDictionary*) == 8); STATIC_ASSERT(sizeof(EngineNode*) == 8); @@ -17,6 +17,8 @@ void initEngineNode(EngineNode* node, Interpreter* interpreter, void* tb, size_t //init node->freeMemory = freeMemory; node->functions = ALLOCATE(LiteralDictionary, 1); + node->parent = NULL; + node->tag = OPAQUE_TAG_ENGINE_NODE; node->children = NULL; node->capacity = 0; node->count = 0; @@ -69,6 +71,9 @@ void pushEngineNode(EngineNode* node, EngineNode* child) { //assign node->children[node->count++] = child; + + //reverse-assign + child->parent = node; } void freeEngineNode(EngineNode* node) { @@ -97,7 +102,7 @@ static void callEngineNodeLiteral(EngineNode* node, Interpreter* interpreter, Li //if this fn exists if (existsLiteralDictionary(node->functions, key)) { Literal fn = getLiteralDictionary(node->functions, key); - Literal n = TO_OPAQUE_LITERAL(node, -1); + Literal n = TO_OPAQUE_LITERAL(node, node->tag); LiteralArray arguments; LiteralArray returns; diff --git a/core/engine_node.h b/core/engine_node.h index 8c526c4..2572c17 100644 --- a/core/engine_node.h +++ b/core/engine_node.h @@ -5,9 +5,10 @@ #include "literal_dictionary.h" #include "interpreter.h" +#define OPAQUE_TAG_ENGINE_NODE 1 + //forward declare typedef struct _engineNode EngineNode; - typedef void (*EngineNodeCallback)(void*); //the node object, which forms a tree @@ -18,6 +19,13 @@ typedef struct _engineNode { //toy functions, stored in a dict for flexibility LiteralDictionary* functions; + //point to the parent + EngineNode* parent; + + //my opaque type tag + int tag; + int _unused; + //use Toy's memory model EngineNode** children; int capacity; diff --git a/core/lib_engine.c b/core/lib_engine.c index 3b351fe..27679ce 100644 --- a/core/lib_engine.c +++ b/core/lib_engine.c @@ -201,7 +201,7 @@ static int nativeLoadNode(Interpreter* interpreter, LiteralArray* arguments) { //NOTE: initNode() must be called manually // return the node - Literal nodeLiteral = TO_OPAQUE_LITERAL(node, -1); + Literal nodeLiteral = TO_OPAQUE_LITERAL(node, node->tag); pushLiteralArray(&interpreter->stack, nodeLiteral); //cleanup @@ -397,7 +397,7 @@ static int nativeGetNode(Interpreter* interpreter, LiteralArray* arguments) { } EngineNode* childNode = parentNode->children[intIndex]; - Literal child = TO_OPAQUE_LITERAL(childNode, -1); + Literal child = TO_OPAQUE_LITERAL(childNode, childNode->tag); pushLiteralArray(&interpreter->stack, child); @@ -409,6 +409,76 @@ static int nativeGetNode(Interpreter* interpreter, LiteralArray* arguments) { return 1; } +static int nativeGetNodeParent(Interpreter* interpreter, LiteralArray* arguments) { + //checks + if (arguments->count != 1) { + interpreter->errorOutput("Incorrect number of arguments passed to getNodeParent\n"); + return -1; + } + + Literal nodeLiteral = popLiteralArray(arguments); + + Literal nodeIdn = nodeLiteral; + if (IS_IDENTIFIER(nodeLiteral) && parseIdentifierToValue(interpreter, &nodeLiteral)) { + freeLiteral(nodeIdn); + } + + if (!IS_OPAQUE(nodeLiteral)) { + interpreter->errorOutput("Incorrect argument type passed to getNodeParent\n"); + freeLiteral(nodeLiteral); + return -1; + } + + //push the node + EngineNode* node = AS_OPAQUE(nodeLiteral); + EngineNode* parent = node->parent; + + Literal parentLiteral = TO_NULL_LITERAL; + if (parent != NULL) { + parentLiteral = TO_OPAQUE_LITERAL(parent, parent->tag); + } + + pushLiteralArray(&interpreter->stack, parentLiteral); + + //cleanup + freeLiteral(parentLiteral); + freeLiteral(nodeLiteral); + + return 1; +} + +static int nativeGetNodeTag(Interpreter* interpreter, LiteralArray* arguments) { + //checks + if (arguments->count != 1) { + interpreter->errorOutput("Incorrect number of arguments passed to getNodeTag\n"); + return -1; + } + + Literal nodeLiteral = popLiteralArray(arguments); + + Literal nodeIdn = nodeLiteral; + if (IS_IDENTIFIER(nodeLiteral) && parseIdentifierToValue(interpreter, &nodeLiteral)) { + freeLiteral(nodeIdn); + } + + if (!IS_OPAQUE(nodeLiteral)) { + interpreter->errorOutput("Incorrect argument type passed to getNodeTag\n"); + freeLiteral(nodeLiteral); + return -1; + } + + //push the tag + Literal tagLiteral = TO_INTEGER_LITERAL( ((EngineNode*)AS_OPAQUE(nodeLiteral))->tag ); + + pushLiteralArray(&interpreter->stack, tagLiteral); + + //cleanup + freeLiteral(nodeLiteral); + freeLiteral(tagLiteral); + + return 1; +} + //call the hook typedef struct Natives { char* name; @@ -426,6 +496,8 @@ int hookEngine(Interpreter* interpreter, Literal identifier, Literal alias) { {"_freeChildNode", nativeFreeChildNode}, {"_pushNode", nativePushNode}, {"_getNode", nativeGetNode}, + {"_getNodeParent", nativeGetNodeParent}, + {"_getNodeTag", nativeGetNodeTag}, {NULL, NULL} }; diff --git a/core/lib_render.c b/core/lib_render.c index a9539e9..7327d39 100644 --- a/core/lib_render.c +++ b/core/lib_render.c @@ -61,7 +61,7 @@ static int nativeLoadRenderNode(Interpreter* interpreter, LiteralArray* argument //NOTE: initNode() must be called manually // return the node - Literal nodeLiteral = TO_OPAQUE_LITERAL(node, -1); + Literal nodeLiteral = TO_OPAQUE_LITERAL(node, node->tag); pushLiteralArray(&interpreter->stack, nodeLiteral); //cleanup diff --git a/core/render_node.c b/core/render_node.c index f33d0d4..b0c306f 100644 --- a/core/render_node.c +++ b/core/render_node.c @@ -19,6 +19,8 @@ void initRenderNode(RenderNode* node, Interpreter* interpreter, void* tb, size_t //init node->freeMemory = freeMemory; node->functions = ALLOCATE(LiteralDictionary, 1); + node->parent = NULL; + node->tag = OPAQUE_TAG_RENDER_NODE; node->children = NULL; node->capacity = 0; node->count = 0; diff --git a/core/render_node.h b/core/render_node.h index 240996e..038a0a4 100644 --- a/core/render_node.h +++ b/core/render_node.h @@ -7,6 +7,8 @@ #include +#define OPAQUE_TAG_RENDER_NODE 2 + typedef struct _renderNode { //function for releasing memory EngineNodeCallback freeMemory; @@ -14,6 +16,13 @@ typedef struct _renderNode { //toy functions, stored in a dict for flexibility LiteralDictionary* functions; + //point to the parent + EngineNode* parent; + + //my opaque type tag + int tag; + int _unused; + //use Toy's memory model EngineNode** children; int capacity;