From 194a52394dba76e50943d133df45e59affe89726 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Fri, 27 Jan 2023 12:52:37 +0000 Subject: [PATCH] Added mouse events --- assets/scripts/entity.toy | 23 ++++- box/box_engine.c | 203 +++++++++++++++++++++++++++++++------- box/box_engine.h | 3 - box/box_engine_node.c | 16 +-- box/lib_engine.c | 4 + box/lib_node.c | 8 ++ 6 files changed, 206 insertions(+), 51 deletions(-) diff --git a/assets/scripts/entity.toy b/assets/scripts/entity.toy index 332cb61..86d7ae2 100644 --- a/assets/scripts/entity.toy +++ b/assets/scripts/entity.toy @@ -99,4 +99,25 @@ fn onKeyUp(node: opaque, event: string) { xspeed = 0; return; } -} \ No newline at end of file +} + +fn onMouseMotion(node: opaque, x: int, y: int, xrel: int, yrel: int) { + print "entity.toy:onMouseMotion()"; + //TODO: mouse motion +} + +fn onMouseButtonDown(node: opaque, x: int, y: int, button: string) { + print "entity.toy:onMouseButtonDown()"; + //TODO: mouse button down +} + +fn onMouseButtonUp(node: opaque, x: int, y: int, button: string) { + print "entity.toy:onMouseButtonUp()"; + //TODO: mouse button up +} + +fn onMouseWheel(node: opaque, x: int, y: int) { + print "entity.toy:onMouseWheel()"; + //TODO: mouse wheel +} + diff --git a/box/box_engine.c b/box/box_engine.c index 2ff1515..6d5f148 100644 --- a/box/box_engine.c +++ b/box/box_engine.c @@ -45,9 +45,7 @@ void Box_initEngine() { } //init events - Toy_initLiteralArray(&engine.keyDownEvents); Toy_initLiteralDictionary(&engine.symKeyDownEvents); - Toy_initLiteralArray(&engine.keyUpEvents); Toy_initLiteralDictionary(&engine.symKeyUpEvents); //init Toy @@ -80,9 +78,7 @@ void Box_freeEngine() { Toy_freeInterpreter(&engine.interpreter); //free events - Toy_freeLiteralArray(&engine.keyDownEvents); Toy_freeLiteralDictionary(&engine.symKeyDownEvents); - Toy_freeLiteralArray(&engine.keyUpEvents); Toy_freeLiteralDictionary(&engine.symKeyUpEvents); //free SDL @@ -95,19 +91,12 @@ void Box_freeEngine() { } static void execEvents() { - //clear event lists - if (engine.keyDownEvents.count > 0) { - Toy_freeLiteralArray(&engine.keyDownEvents); - //NOTE: this is likely memory intensive - a more bespoke linked list designed for this task would be better - //NOTE: alternatively - manual memory-wipes, skipping the free step could be better - } - - if (engine.keyUpEvents.count > 0) { - Toy_freeLiteralArray(&engine.keyUpEvents); - } + Toy_LiteralArray args; //save some allocation by reusing this + Toy_initLiteralArray(&args); //poll all events SDL_Event event; + while (SDL_PollEvent(&event)) { switch(event.type) { //quit @@ -138,14 +127,21 @@ static void execEvents() { //determine the given keycode Toy_Literal keycodeLiteral = TOY_TO_INTEGER_LITERAL( (int)(event.key.keysym.sym) ); if (!Toy_existsLiteralDictionary(&engine.symKeyDownEvents, keycodeLiteral)) { + Toy_freeLiteral(keycodeLiteral); break; } //get the event name Toy_Literal eventLiteral = Toy_getLiteralDictionary(&engine.symKeyDownEvents, keycodeLiteral); + //call the function + Toy_pushLiteralArray(&args, eventLiteral); + Box_callRecursiveEngineNode(engine.rootNode, &engine.interpreter, "onKeyDown", &args); + Toy_popLiteralArray(&args); + //push to the event list - Toy_pushLiteralArray(&engine.keyDownEvents, eventLiteral); + Toy_freeLiteral(eventLiteral); + Toy_freeLiteral(keycodeLiteral); } break; @@ -158,39 +154,174 @@ static void execEvents() { //determine the given keycode Toy_Literal keycodeLiteral = TOY_TO_INTEGER_LITERAL( (int)(event.key.keysym.sym) ); if (!Toy_existsLiteralDictionary(&engine.symKeyUpEvents, keycodeLiteral)) { + Toy_freeLiteral(keycodeLiteral); break; } //get the event name Toy_Literal eventLiteral = Toy_getLiteralDictionary(&engine.symKeyUpEvents, keycodeLiteral); + //call the function + Toy_pushLiteralArray(&args, eventLiteral); + Box_callRecursiveEngineNode(engine.rootNode, &engine.interpreter, "onKeyUp", &args); + Toy_popLiteralArray(&args); + //push to the event list - Toy_pushLiteralArray(&engine.keyUpEvents, eventLiteral); + Toy_freeLiteral(eventLiteral); + Toy_freeLiteral(keycodeLiteral); + } + break; + + //mouse motion + case SDL_MOUSEMOTION: { + Toy_Literal mouseX = TOY_TO_INTEGER_LITERAL( (int)(event.motion.x) ); + Toy_Literal mouseY = TOY_TO_INTEGER_LITERAL( (int)(event.motion.y) ); + Toy_Literal mouseXRel = TOY_TO_INTEGER_LITERAL( (int)(event.motion.x) ); + Toy_Literal mouseYRel = TOY_TO_INTEGER_LITERAL( (int)(event.motion.y) ); + + Toy_pushLiteralArray(&args, mouseX); + Toy_pushLiteralArray(&args, mouseY); + Toy_pushLiteralArray(&args, mouseXRel); + Toy_pushLiteralArray(&args, mouseYRel); + + Box_callRecursiveEngineNode(engine.rootNode, &engine.interpreter, "onMouseMotion", &args); + + Toy_freeLiteral(mouseX); + Toy_freeLiteral(mouseY); + Toy_freeLiteral(mouseXRel); + Toy_freeLiteral(mouseYRel); + + //hack: manual free + for(int i = 0; i < args.count; i++) { + Toy_freeLiteral(args.literals[i]); + } + args.count = 0; + } + break; + + //mouse button down + case SDL_MOUSEBUTTONDOWN: { + Toy_Literal mouseX = TOY_TO_INTEGER_LITERAL( (int)(event.button.x) ); + Toy_Literal mouseY = TOY_TO_INTEGER_LITERAL( (int)(event.button.y) ); + Toy_Literal mouseButton; + + switch (event.button.button) { + case SDL_BUTTON_LEFT: + mouseButton = TOY_TO_STRING_LITERAL(Toy_createRefString("left")); + break; + + case SDL_BUTTON_MIDDLE: + mouseButton = TOY_TO_STRING_LITERAL(Toy_createRefString("middle")); + break; + + case SDL_BUTTON_RIGHT: + mouseButton = TOY_TO_STRING_LITERAL(Toy_createRefString("right")); + break; + + case SDL_BUTTON_X1: + mouseButton = TOY_TO_STRING_LITERAL(Toy_createRefString("x1")); + break; + + case SDL_BUTTON_X2: + mouseButton = TOY_TO_STRING_LITERAL(Toy_createRefString("x2")); + break; + + default: + mouseButton = TOY_TO_STRING_LITERAL(Toy_createRefString("unknown")); + break; + } + + Toy_pushLiteralArray(&args, mouseX); + Toy_pushLiteralArray(&args, mouseY); + Toy_pushLiteralArray(&args, mouseButton); + + Box_callRecursiveEngineNode(engine.rootNode, &engine.interpreter, "onMouseButtonDown", &args); + + Toy_freeLiteral(mouseX); + Toy_freeLiteral(mouseY); + Toy_freeLiteral(mouseButton); + + //hack: manual free + for(int i = 0; i < args.count; i++) { + Toy_freeLiteral(args.literals[i]); + } + args.count = 0; + } + break; + + //mouse button up + case SDL_MOUSEBUTTONUP: { + Toy_Literal mouseX = TOY_TO_INTEGER_LITERAL( (int)(event.button.x) ); + Toy_Literal mouseY = TOY_TO_INTEGER_LITERAL( (int)(event.button.y) ); + Toy_Literal mouseButton; + + switch (event.button.button) { + case SDL_BUTTON_LEFT: + mouseButton = TOY_TO_STRING_LITERAL(Toy_createRefString("left")); + break; + + case SDL_BUTTON_MIDDLE: + mouseButton = TOY_TO_STRING_LITERAL(Toy_createRefString("middle")); + break; + + case SDL_BUTTON_RIGHT: + mouseButton = TOY_TO_STRING_LITERAL(Toy_createRefString("right")); + break; + + case SDL_BUTTON_X1: + mouseButton = TOY_TO_STRING_LITERAL(Toy_createRefString("x1")); + break; + + case SDL_BUTTON_X2: + mouseButton = TOY_TO_STRING_LITERAL(Toy_createRefString("x2")); + break; + + default: + mouseButton = TOY_TO_STRING_LITERAL(Toy_createRefString("unknown")); + break; + } + + Toy_pushLiteralArray(&args, mouseX); + Toy_pushLiteralArray(&args, mouseY); + Toy_pushLiteralArray(&args, mouseButton); + + Box_callRecursiveEngineNode(engine.rootNode, &engine.interpreter, "onMouseButtonUp", &args); + + Toy_freeLiteral(mouseX); + Toy_freeLiteral(mouseY); + Toy_freeLiteral(mouseButton); + + //hack: manual free + for(int i = 0; i < args.count; i++) { + Toy_freeLiteral(args.literals[i]); + } + args.count = 0; + } + break; //TODO: remove copied code + + //mouse wheel + case SDL_MOUSEWHEEL: { + Toy_Literal mouseX = TOY_TO_INTEGER_LITERAL( (int)(event.wheel.x) ); + Toy_Literal mouseY = TOY_TO_INTEGER_LITERAL( (int)(event.wheel.y) ); + Toy_pushLiteralArray(&args, mouseX); + Toy_pushLiteralArray(&args, mouseY); + + Box_callRecursiveEngineNode(engine.rootNode, &engine.interpreter, "onMouseWheel", &args); + + Toy_freeLiteral(mouseX); + Toy_freeLiteral(mouseY); + + //hack: manual free + for(int i = 0; i < args.count; i++) { + Toy_freeLiteral(args.literals[i]); + } + args.count = 0; } break; } } - //process input events - if (engine.rootNode != NULL) { - //key down events - for (int i = 0; i < engine.keyDownEvents.count; i++) { //TODO: could pass in the whole array? - Toy_LiteralArray args; - Toy_initLiteralArray(&args); - Toy_pushLiteralArray(&args, engine.keyDownEvents.literals[i]); - Box_callRecursiveEngineNode(engine.rootNode, &engine.interpreter, "onKeyDown", &args); - Toy_freeLiteralArray(&args); - } - - //key up events - for (int i = 0; i < engine.keyUpEvents.count; i++) { - Toy_LiteralArray args; - Toy_initLiteralArray(&args); - Toy_pushLiteralArray(&args, engine.keyUpEvents.literals[i]); - Box_callRecursiveEngineNode(engine.rootNode, &engine.interpreter, "onKeyUp", &args); - Toy_freeLiteralArray(&args); - } - } + Toy_freeLiteralArray(&args); } void execStep() { diff --git a/box/box_engine.h b/box/box_engine.h index 49041f2..3db15eb 100644 --- a/box/box_engine.h +++ b/box/box_engine.h @@ -27,10 +27,7 @@ typedef struct Box_private_engine { int screenHeight; //input syms mapped to events - Toy_LiteralArray keyDownEvents; //list of events that occurred this frame Toy_LiteralDictionary symKeyDownEvents; //keysym -> event names - - Toy_LiteralArray keyUpEvents; //list of events that occurred this frame Toy_LiteralDictionary symKeyUpEvents; //keysym -> event names } Box_Engine; diff --git a/box/box_engine_node.c b/box/box_engine_node.c index 7791ef6..dd9c899 100644 --- a/box/box_engine_node.c +++ b/box/box_engine_node.c @@ -3,15 +3,6 @@ #include "toy_memory.h" -static void freeMemory(void* ptr) { - Box_EngineNode* node = (Box_EngineNode*)ptr; - //SDL stuff - SDL_DestroyTexture(node->texture); - - //free this node type's memory - TOY_FREE(Box_EngineNode, ptr); -} - void Box_initEngineNode(Box_EngineNode* node, Toy_Interpreter* interpreter, void* tb, size_t size) { //init // node->freeMemory = freeMemory; @@ -94,9 +85,12 @@ void Box_freeEngineNode(Box_EngineNode* node) { TOY_FREE(Toy_LiteralDictionary, node->functions); } + if (node->texture != NULL) { + Box_freeTextureEngineNode(node); + } + //free this node's memory - // node->freeMemory(node); - freeMemory(node); + TOY_FREE(Box_EngineNode, node); } Toy_Literal Box_callEngineNodeLiteral(Box_EngineNode* node, Toy_Interpreter* interpreter, Toy_Literal key, Toy_LiteralArray* args) { diff --git a/box/lib_engine.c b/box/lib_engine.c index dfb79da..bf7c73e 100644 --- a/box/lib_engine.c +++ b/box/lib_engine.c @@ -151,6 +151,10 @@ static int nativeLoadRootNode(Toy_Interpreter* interpreter, Toy_LiteralArray* ar Box_callEngineNode(engine.rootNode, &engine.interpreter, "onInit", NULL); //cleanup + while(inner.scope) { + inner.scope = Toy_popScope(inner.scope); + } + Toy_freeLiteralArray(&inner.stack); Toy_freeLiteralArray(&inner.literalCache); Toy_freeLiteral(filePathLiteral); diff --git a/box/lib_node.c b/box/lib_node.c index 8587580..f9ec1e5 100644 --- a/box/lib_node.c +++ b/box/lib_node.c @@ -75,6 +75,10 @@ static int nativeLoadNode(Toy_Interpreter* interpreter, Toy_LiteralArray* argume Toy_pushLiteralArray(&interpreter->stack, nodeLiteral); //cleanup + while (inner.scope) { + inner.scope = Toy_popScope(inner.scope); + } + Toy_freeLiteralArray(&inner.stack); Toy_freeLiteralArray(&inner.literalCache); Toy_freeLiteral(filePathLiteral); @@ -375,6 +379,7 @@ static int nativeFreeTexture(Toy_Interpreter* interpreter, Toy_LiteralArray* arg //cleanup Toy_freeLiteral(nodeLiteral); + return 0; } @@ -439,6 +444,7 @@ static int nativeSetRect(Toy_Interpreter* interpreter, Toy_LiteralArray* argumen Toy_freeLiteral(y); Toy_freeLiteral(w); Toy_freeLiteral(h); + return 0; } @@ -518,6 +524,7 @@ static int nativeDrawNode(Toy_Interpreter* interpreter, Toy_LiteralArray* argume Toy_freeLiteral(y); Toy_freeLiteral(w); Toy_freeLiteral(h); + return 0; } @@ -619,6 +626,7 @@ static int nativeCallNode(Toy_Interpreter* interpreter, Toy_LiteralArray* argume //cleanup Toy_freeLiteralArray(&extraArgs); + Toy_freeLiteral(fnNameIdentifier); Toy_freeLiteral(nodeLiteral); Toy_freeLiteral(fnName); Toy_freeLiteral(result);