Example scene working

This commit is contained in:
2026-06-06 18:46:08 -05:00
parent 003b647d83
commit 9edb2aa0c1
13 changed files with 342 additions and 81 deletions
+4 -5
View File
@@ -49,15 +49,14 @@ errorret_t engineInit(const int32_t argc, const char_t **argv) {
errorChain(uiInit());
errorChain(uiTextboxInit());
errorChain(cutsceneInit());
errorChain(sceneInit());
entityManagerInit();
backpackInit();
physicsManagerInit();
errorChain(networkInit());
errorChain(scriptInit());
errorChain(sceneInit());
consolePrint("Engine initialized");
errorChain(scriptExecFile("init.js"));
errorOk();
@@ -75,7 +74,7 @@ errorret_t engineUpdate(void) {
physicsManagerUpdate();
errorChain(displayUpdate());
errorChain(cutsceneUpdate());
sceneUpdate();
errorChain(sceneUpdate());
errorChain(assetUpdate());
errorChain(scriptUpdate());
@@ -90,7 +89,8 @@ void engineExit(void) {
errorret_t engineDispose(void) {
uiTextboxDispose();
cutsceneDispose();
sceneDispose();
errorChain(sceneDispose());
errorChain(scriptDispose());
errorChain(networkDispose());
entityManagerDispose();
localeManagerDispose();
@@ -98,7 +98,6 @@ errorret_t engineDispose(void) {
consoleDispose();
errorChain(displayDispose());
// errorChain(saveDispose());
errorChain(scriptDispose());
errorChain(assetDispose());
errorOk();
+5
View File
@@ -3,6 +3,11 @@
# This software is released under the MIT License.
# https://opensource.org/licenses/MIT
include(duskjs2c)
dusk_embed_js(${DUSK_LIBRARY_TARGET_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/scene.js
)
target_sources(${DUSK_LIBRARY_TARGET_NAME}
PUBLIC
scene.c
+17 -1
View File
@@ -18,15 +18,30 @@
#include "asset/loader/assetloader.h"
#include "script/module/modulebase.h"
#include "console/console.h"
#include "script/script.h"
#include "scene_js.h"
scene_t SCENE;
errorret_t sceneInit(void) {
memoryZero(&SCENE, sizeof(scene_t));
errorChain(scriptExecString(SCENE_JS));
errorOk();
}
void sceneUpdate(void) {
errorret_t sceneUpdate(void) {
#ifdef DUSK_TIME_DYNAMIC
if(TIME.dynamicUpdate) {
errorChain(scriptExecString("Scene.dynamicUpdate();"));
} else {
errorChain(scriptExecString("Scene.update();"));
}
#else
errorChain(scriptExecString("Scene.update();"));
errorChain(scriptExecString("Scene.dynamicUpdate();"));
#endif
errorOk();
}
errorret_t sceneRender(void) {
@@ -65,5 +80,6 @@ errorret_t sceneRender(void) {
}
errorret_t sceneDispose(void) {
errorChain(scriptExecString("Scene.dispose();"));
errorOk();
}
+9 -1
View File
@@ -16,21 +16,29 @@ extern scene_t SCENE;
/**
* Initialises the scene manager.
*
* @return An error if the init failed, or errorOk() if it succeeded.
*/
errorret_t sceneInit(void);
/**
* Ticks the scene manager. Processes any pending scene transition, then
* calls scriptSceneUpdate on the active scene.
*
* @return An error if the update failed, or errorOk() if it succeeded.
*/
void sceneUpdate(void);
errorret_t sceneUpdate(void);
/**
* Renders the current scene (entities, render pipeline, UI).
*
* @return An error if the render failed, or errorOk() if it succeeded.
*/
errorret_t sceneRender(void);
/**
* Disposes the active scene immediately.
*
* @return An error if the dispose failed, or errorOk() if it succeeded.
*/
errorret_t sceneDispose(void);
+36
View File
@@ -0,0 +1,36 @@
// Copyright (c) 2026 Dominic Masters
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
var Scene = {
};
Scene.update = () => {
}
Scene.dynamicUpdate = () => {
}
Scene.set = (newScene) => {
// Current scene active?
if(Scene.current && Scene.current.dispose) {
Scene.current.dispose();
}
// Set new scene
Scene.current = newScene;
if(!newScene) return;
// Init
if(newScene.init) {
newScene.init();
}
};
Scene.dispose = () => {
if(Scene.current && Scene.current.dispose) {
Scene.current.dispose();
}
Scene.current = null;
}
+36 -16
View File
@@ -16,6 +16,36 @@
script_t SCRIPT;
static void scriptExceptionInfo(
jerry_value_t exception,
char_t *msgBuf, size_t msgSize,
char_t *stackBuf, size_t stackSize
) {
jerry_value_t errVal = jerry_exception_value(exception, false);
jerry_value_t errStr = jerry_value_to_string(errVal);
jerry_size_t len = jerry_string_to_buffer(
errStr, JERRY_ENCODING_UTF8, (jerry_char_t *)msgBuf, msgSize - 1
);
msgBuf[len] = '\0';
jerry_value_free(errStr);
stackBuf[0] = '\0';
jerry_value_t stackKey = jerry_string_sz("stack");
jerry_value_t stackVal = jerry_object_get(errVal, stackKey);
jerry_value_free(stackKey);
if(!jerry_value_is_exception(stackVal) && !jerry_value_is_undefined(stackVal)) {
jerry_value_t stackStr = jerry_value_to_string(stackVal);
jerry_size_t stackLen = jerry_string_to_buffer(
stackStr, JERRY_ENCODING_UTF8, (jerry_char_t *)stackBuf, stackSize - 1
);
stackBuf[stackLen] = '\0';
jerry_value_free(stackStr);
}
jerry_value_free(stackVal);
jerry_value_free(errVal);
}
errorret_t scriptInit(void) {
memoryZero(&SCRIPT, sizeof(script_t));
@@ -33,15 +63,10 @@ errorret_t scriptUpdate() {
if(jerry_value_is_exception(ret)) {
char_t buf[256];
jerry_value_t errVal = jerry_exception_value(ret, false);
jerry_value_t errStr = jerry_value_to_string(errVal);
jerry_size_t len = jerry_string_to_buffer(
errStr, JERRY_ENCODING_UTF8, (jerry_char_t *)buf, sizeof(buf) - 1
);
buf[len] = '\0';
jerry_value_free(errStr);
jerry_value_free(errVal);
char_t stack[512];
scriptExceptionInfo(ret, buf, sizeof(buf), stack, sizeof(stack));
jerry_value_free(ret);
if(stack[0]) errorThrow("Script error: %s\n%s", buf, stack);
errorThrow("Script error: %s", buf);
}
@@ -61,15 +86,10 @@ errorret_t scriptExecString(const char_t *source) {
if(jerry_value_is_exception(result)) {
char_t buf[256];
jerry_value_t errVal = jerry_exception_value(result, false);
jerry_value_t errStr = jerry_value_to_string(errVal);
jerry_size_t len = jerry_string_to_buffer(
errStr, JERRY_ENCODING_UTF8, (jerry_char_t *)buf, sizeof(buf) - 1
);
buf[len] = '\0';
jerry_value_free(errStr);
jerry_value_free(errVal);
char_t stack[512];
scriptExceptionInfo(result, buf, sizeof(buf), stack, sizeof(stack));
jerry_value_free(result);
if(stack[0]) errorThrow("Script error: %s\n%s", buf, stack);
errorThrow("Script error: %s", buf);
}