Moved a few things around, definitely not clean but better.
Some checks failed
Build Dusk / run-tests (push) Failing after 2m3s
Build Dusk / build-linux (push) Successful in 2m13s
Build Dusk / build-psp (push) Successful in 1m56s

This commit is contained in:
2026-01-28 15:00:59 -06:00
parent c190271565
commit 794e0574ad
27 changed files with 558 additions and 66 deletions

View File

@@ -0,0 +1,300 @@
/**
* Copyright (c) 2026 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "modulecamera.h"
#include "assert/assert.h"
#include "display/camera/camera.h"
#include "util/memory.h"
#include "script/struct/scriptstruct.h"
#include "util/string.h"
void moduleCamera(scriptcontext_t *context) {
assertNotNull(context, "Context cannot be NULL.");
// Structure
scriptStructRegister(
context,
"camera_mt",
moduleCameraGetter,
moduleCameraSetter
);
// Definitions
#define MODULE_CAMERA_SCRIPT_LEN 64
char_t buffer[MODULE_CAMERA_SCRIPT_LEN];
#define MODULE_CAMERA_DEF(str, val) \
snprintf( \
buffer, \
MODULE_CAMERA_SCRIPT_LEN, \
"%s = %d", \
str, \
val \
); \
scriptContextExec(context, buffer);
MODULE_CAMERA_DEF(
"CAMERA_PROJECTION_TYPE_PERSPECTIVE",
CAMERA_PROJECTION_TYPE_PERSPECTIVE
);
MODULE_CAMERA_DEF(
"CAMERA_PROJECTION_TYPE_PERSPECTIVE_FLIPPED",
CAMERA_PROJECTION_TYPE_PERSPECTIVE_FLIPPED
);
MODULE_CAMERA_DEF(
"CAMERA_PROJECTION_TYPE_ORTHOGRAPHIC",
CAMERA_PROJECTION_TYPE_ORTHOGRAPHIC
);
MODULE_CAMERA_DEF(
"CAMERA_VIEW_TYPE_MATRIX",
CAMERA_VIEW_TYPE_MATRIX
);
MODULE_CAMERA_DEF(
"CAMERA_VIEW_TYPE_LOOKAT",
CAMERA_VIEW_TYPE_LOOKAT
);
MODULE_CAMERA_DEF(
"CAMERA_VIEW_TYPE_2D",
CAMERA_VIEW_TYPE_2D
);
MODULE_CAMERA_DEF(
"CAMERA_VIEW_TYPE_LOOKAT_PIXEL_PERFECT",
CAMERA_VIEW_TYPE_LOOKAT_PIXEL_PERFECT
);
// Methods
scriptContextRegFunc(context, "cameraCreate", moduleCameraCreate);
scriptContextRegFunc(context, "cameraPushMatrix", moduleCameraPushMatrix);
scriptContextRegFunc(context, "cameraPopMatrix", moduleCameraPopMatrix);
}
int moduleCameraCreate(lua_State *L) {
assertNotNull(L, "Lua state cannot be NULL.");
scriptcontext_t *context = *(scriptcontext_t **)lua_getextraspace(L);
assertNotNull(context, "Script context cannot be NULL.");
// If we are provided a projection type, use it.
cameraprojectiontype_t projType = CAMERA_PROJECTION_TYPE_PERSPECTIVE;
if(lua_gettop(L) >= 1) {
projType = (cameraprojectiontype_t)luaL_checkinteger(L, 1);
}
// Create camera.
camera_t *cam = (camera_t *)lua_newuserdata(L, sizeof(camera_t));
memoryZero(cam, sizeof(camera_t));
// Push metatable.
scriptStructPushMetatable(context, "camera_mt", cam);
// Init camera
switch(projType) {
case CAMERA_PROJECTION_TYPE_PERSPECTIVE:
case CAMERA_PROJECTION_TYPE_PERSPECTIVE_FLIPPED:
cameraInitPerspective(cam);
cam->projType = projType;
break;
case CAMERA_PROJECTION_TYPE_ORTHOGRAPHIC:
cameraInitOrthographic(cam);
cam->projType = projType;
break;
default:
luaL_error(L, "Invalid camera projection type specified.");
break;
}
return 1;
}
int moduleCameraPushMatrix(lua_State *L) {
assertNotNull(L, "Lua state cannot be NULL.");
// Camera should be provided (pointer to camera_t).
camera_t *cam = *(camera_t **)lua_touserdata(L, 1);
assertNotNull(cam, "Camera pointer cannot be NULL.");
cameraPushMatrix(cam);
return 0;
}
int moduleCameraPopMatrix(lua_State *L) {
assertNotNull(L, "Lua state cannot be NULL.");
cameraPopMatrix();
return 0;
}
void moduleCameraGetter(
const scriptcontext_t *context,
const char_t *key,
const void *structPtr,
scriptvalue_t *outValue
) {
assertNotNull(context, "Script context cannot be NULL.");
assertNotNull(key, "Key cannot be NULL.");
assertNotNull(structPtr, "Structure pointer cannot be NULL.");
assertNotNull(outValue, "Output value cannot be NULL.");
camera_t *cam = (camera_t *)structPtr;
if(stringCompare(key, "near") == 0) {
outValue->type = SCRIPT_VALUE_TYPE_FLOAT;
outValue->value.floatValue = cam->nearClip;
return;
} else if(stringCompare(key, "far") == 0) {
outValue->type = SCRIPT_VALUE_TYPE_FLOAT;
outValue->value.floatValue = cam->farClip;
return;
} else if(stringCompare(key, "nearClip") == 0) {
outValue->type = SCRIPT_VALUE_TYPE_FLOAT;
outValue->value.floatValue = cam->nearClip;
return;
} else if(stringCompare(key, "farClip") == 0) {
outValue->type = SCRIPT_VALUE_TYPE_FLOAT;
outValue->value.floatValue = cam->farClip;
return;
}
// Perspective relative values
if(cam->projType == CAMERA_PROJECTION_TYPE_ORTHOGRAPHIC) {
if(stringCompare(key, "left") == 0) {
outValue->type = SCRIPT_VALUE_TYPE_FLOAT;
outValue->value.floatValue = cam->orthographic.left;
return;
} else if(stringCompare(key, "right") == 0) {
outValue->type = SCRIPT_VALUE_TYPE_FLOAT;
outValue->value.floatValue = cam->orthographic.right;
return;
} else if(stringCompare(key, "top") == 0) {
outValue->type = SCRIPT_VALUE_TYPE_FLOAT;
outValue->value.floatValue = cam->orthographic.top;
return;
} else if(stringCompare(key, "bottom") == 0) {
outValue->type = SCRIPT_VALUE_TYPE_FLOAT;
outValue->value.floatValue = cam->orthographic.bottom;
return;
}
} else if(
cam->projType == CAMERA_PROJECTION_TYPE_PERSPECTIVE ||
cam->projType == CAMERA_PROJECTION_TYPE_PERSPECTIVE_FLIPPED
) {
if(stringCompare(key, "fov") == 0) {
outValue->type = SCRIPT_VALUE_TYPE_FLOAT;
outValue->value.floatValue = cam->perspective.fov;
return;
}
}
// View type relative values.
if(cam->viewType == CAMERA_VIEW_TYPE_MATRIX) {
} else if(cam->viewType == CAMERA_VIEW_TYPE_LOOKAT) {
if(stringCompare(key, "position") == 0) {
scriptStructPushMetatable(
context,
"vec3_mt",
(void*)&cam->lookat.position
);
outValue->type = SCRIPT_VALUE_TYPE_USERDATA;
return;
}
} else if(cam->viewType == CAMERA_VIEW_TYPE_LOOKAT_PIXEL_PERFECT) {
} else if(cam->viewType == CAMERA_VIEW_TYPE_2D) {
}
}
void moduleCameraSetter(
const scriptcontext_t *context,
const char_t *key,
void *structPtr,
const scriptvalue_t *inValue
) {
assertNotNull(context, "Script context cannot be NULL.");
assertNotNull(key, "Key cannot be NULL.");
assertNotNull(structPtr, "Structure pointer cannot be NULL.");
assertNotNull(inValue, "Input value cannot be NULL.");
camera_t *cam = (camera_t *)structPtr;
if(stringCompare(key, "near") == 0) {
if(inValue->type == SCRIPT_VALUE_TYPE_FLOAT) {
cam->nearClip = inValue->value.floatValue;
} else if(inValue->type == SCRIPT_VALUE_TYPE_INT) {
cam->nearClip = (float_t)inValue->value.intValue;
}
return;
} else if(stringCompare(key, "far") == 0) {
if(inValue->type == SCRIPT_VALUE_TYPE_FLOAT) {
cam->farClip = inValue->value.floatValue;
} else if(inValue->type == SCRIPT_VALUE_TYPE_INT) {
cam->farClip = (float_t)inValue->value.intValue;
}
return;
} else if(stringCompare(key, "nearClip") == 0) {
if(inValue->type == SCRIPT_VALUE_TYPE_FLOAT) {
cam->nearClip = inValue->value.floatValue;
} else if(inValue->type == SCRIPT_VALUE_TYPE_INT) {
cam->nearClip = (float_t)inValue->value.intValue;
}
return;
} else if(stringCompare(key, "farClip") == 0) {
if(inValue->type == SCRIPT_VALUE_TYPE_FLOAT) {
cam->farClip = inValue->value.floatValue;
} else if(inValue->type == SCRIPT_VALUE_TYPE_INT) {
cam->farClip = (float_t)inValue->value.intValue;
}
return;
}
// Perspective relative values
if(cam->projType == CAMERA_PROJECTION_TYPE_ORTHOGRAPHIC) {
if(stringCompare(key, "left") == 0) {
if(inValue->type == SCRIPT_VALUE_TYPE_FLOAT) {
cam->orthographic.left = inValue->value.floatValue;
} else if(inValue->type == SCRIPT_VALUE_TYPE_INT) {
cam->orthographic.left = (float_t)inValue->value.intValue;
}
return;
} else if(stringCompare(key, "right") == 0) {
if(inValue->type == SCRIPT_VALUE_TYPE_FLOAT) {
cam->orthographic.right = inValue->value.floatValue;
} else if(inValue->type == SCRIPT_VALUE_TYPE_INT) {
cam->orthographic.right = (float_t)inValue->value.intValue;
}
return;
} else if(stringCompare(key, "top") == 0) {
if(inValue->type == SCRIPT_VALUE_TYPE_FLOAT) {
cam->orthographic.top = inValue->value.floatValue;
} else if(inValue->type == SCRIPT_VALUE_TYPE_INT) {
cam->orthographic.top = (float_t)inValue->value.intValue;
}
return;
} else if(stringCompare(key, "bottom") == 0) {
if(inValue->type == SCRIPT_VALUE_TYPE_FLOAT) {
cam->orthographic.bottom = inValue->value.floatValue;
} else if(inValue->type == SCRIPT_VALUE_TYPE_INT) {
cam->orthographic.bottom = (float_t)inValue->value.intValue;
}
return;
}
} else if(
cam->projType == CAMERA_PROJECTION_TYPE_PERSPECTIVE ||
cam->projType == CAMERA_PROJECTION_TYPE_PERSPECTIVE_FLIPPED
) {
if(stringCompare(key, "fov") == 0) {
if(inValue->type == SCRIPT_VALUE_TYPE_FLOAT) {
cam->perspective.fov = inValue->value.floatValue;
} else if(inValue->type == SCRIPT_VALUE_TYPE_INT) {
cam->perspective.fov = (float_t)inValue->value.intValue;
}
return;
}
}
}