sprites, rtrees, and transforms made with constructor functions
This commit is contained in:
@@ -1,14 +1,5 @@
|
||||
/* main.js – runs the demo with your prototype-based grid */
|
||||
|
||||
var rtree = use('rtree')
|
||||
|
||||
var mytree = new rtree
|
||||
|
||||
mytree.add()
|
||||
mytree.kill()
|
||||
|
||||
for (var i in mytree) console.log(i)
|
||||
|
||||
var moth = use('moth')
|
||||
var json = use('json')
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
var cam = {}
|
||||
|
||||
var os = use('os')
|
||||
var transform = use('transform')
|
||||
|
||||
var basecam = {}
|
||||
basecam.draw_rect = function(size)
|
||||
@@ -88,7 +89,7 @@ function mode_rect(src,dst,mode = "stretch")
|
||||
cam.make = function()
|
||||
{
|
||||
var c = Object.create(basecam)
|
||||
c.transform = os.make_transform()
|
||||
c.transform = new transform
|
||||
c.transform.unit()
|
||||
c.zoom = 1
|
||||
c.size = [640,360]
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
var Color = use('color')
|
||||
var os = use('os')
|
||||
var graphics = use('graphics')
|
||||
var transform = use('transform')
|
||||
|
||||
var ex = {}
|
||||
|
||||
@@ -76,7 +77,7 @@ ex.spawn = function(t)
|
||||
}
|
||||
|
||||
par = {
|
||||
transform: os.make_transform(),
|
||||
transform: new transform,
|
||||
life: this.life,
|
||||
time: 0,
|
||||
color: this.color,
|
||||
|
||||
@@ -224,15 +224,15 @@ return sprite;
|
||||
---
|
||||
|
||||
var Color = use('color')
|
||||
var os = use('os')
|
||||
var graphics = use('graphics')
|
||||
var transform = use('transform')
|
||||
var sprite = use('sprite')
|
||||
|
||||
this.transform = os.make_transform();
|
||||
this.transform = new transform;
|
||||
if (this.overling.transform)
|
||||
this.transform.parent = this.overling.transform;
|
||||
|
||||
this.transform.change_hook = $.t_hook;
|
||||
var msp = graphics.make_sprite();
|
||||
var msp = new sprite
|
||||
this._sprite = msp;
|
||||
msp.color = Color.white;
|
||||
this.transform.sprite = this
|
||||
|
||||
@@ -420,11 +420,6 @@ graphics.make_font[prosperon.DOC] = `
|
||||
Load a font from TTF/OTF data at the given size.
|
||||
`
|
||||
|
||||
graphics.make_sprite[prosperon.DOC] = `
|
||||
:return: A new sprite object, which typically has .rect, .color, .layer, .image, etc.
|
||||
Create a new sprite object, storing default properties.
|
||||
`
|
||||
|
||||
graphics.make_line_prim[prosperon.DOC] = `
|
||||
:param points: An array of [x,y] points forming the line.
|
||||
:param thickness: The thickness (width) of the polyline.
|
||||
|
||||
@@ -3,6 +3,7 @@ var sprite = {}
|
||||
var graphics = use('graphics')
|
||||
var render = use('render')
|
||||
var draw2d = use('draw2d')
|
||||
var sprite = use('sprite')
|
||||
|
||||
var SPRITE = Symbol() /* raw C sprite */
|
||||
var POS = Symbol() /* cached JS copies of simple data */
|
||||
@@ -83,7 +84,7 @@ var def_sprite = Object.freeze({
|
||||
sprite.create = function(image, info) {
|
||||
info.__proto__ = def_sprite
|
||||
var sp = Object.create(ursprite)
|
||||
sp[SPRITE] = graphics.make_sprite(info)
|
||||
sp[SPRITE] = new sprite(info)
|
||||
sp.image = graphics.texture(image)
|
||||
|
||||
_sprites.push(sp)
|
||||
|
||||
@@ -7,6 +7,7 @@ var os = use('os');
|
||||
var io = use('io');
|
||||
var render = use('render');
|
||||
var actor = use('actor');
|
||||
var transform = use('transform');
|
||||
var gameConfig = {};
|
||||
var gameDir = "";
|
||||
|
||||
@@ -35,7 +36,7 @@ function initialize() {
|
||||
// Set up default camera
|
||||
gameConfig.camera = gameConfig.camera || {
|
||||
size: [gameConfig.internal_resolution.width, gameConfig.internal_resolution.height],
|
||||
transform: os.make_transform(),
|
||||
transform: new transform,
|
||||
fov: 50,
|
||||
near_z: 0,
|
||||
far_z: 1000,
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
var os = this
|
||||
|
||||
os.make_transform[prosperon.DOC] = "Create a new transform object that can be used for 2D/3D positioning, scaling, and rotation."
|
||||
os.clean_transforms[prosperon.DOC] = "Force an update on all transforms to remove dangling references or perform house-keeping."
|
||||
|
||||
os.platform[prosperon.DOC] = "Return a string with the underlying platform name, like 'Windows', 'Linux', or 'macOS'."
|
||||
os.arch[prosperon.DOC] = "Return the CPU architecture string for this system (e.g. 'x64', 'arm64')."
|
||||
os.totalmem[prosperon.DOC] = "Return the total system RAM in bytes."
|
||||
|
||||
@@ -6,6 +6,7 @@ var controller = use('controller')
|
||||
var tracy = use('tracy')
|
||||
var graphics = use('graphics')
|
||||
var imgui = use('imgui')
|
||||
var transform = use('transform')
|
||||
|
||||
var base_pipeline = {
|
||||
vertex: "sprite.vert",
|
||||
@@ -94,7 +95,7 @@ switch(os.platform()) {
|
||||
break
|
||||
}
|
||||
|
||||
var unit_transform = os.make_transform();
|
||||
var unit_transform = new transform;
|
||||
|
||||
var cur = {};
|
||||
cur.images = [];
|
||||
@@ -659,7 +660,7 @@ function mask(image, pos, scale, rotation = 0, ref = 1) {
|
||||
|
||||
var pipe = stencil_writer(ref);
|
||||
render.use_shader('sprite.cg', pipe);
|
||||
var t = os.make_transform();
|
||||
var t = new transform;
|
||||
t.trs(pos, undefined, scale);
|
||||
set_model(t);
|
||||
render.use_mat({
|
||||
|
||||
@@ -2162,25 +2162,6 @@ JSC_CCALL(os_make_font,
|
||||
JS_SetPropertyStr(js, ret, "surface", SDL_Surface2js(js,f->surface));
|
||||
)
|
||||
|
||||
JSC_CCALL(os_make_transform,
|
||||
transform *t = make_transform();
|
||||
ret = transform2js(js,t);
|
||||
// t->self = JS_DupValue(js,ret);
|
||||
t->self = ret;
|
||||
)
|
||||
JSC_CCALL(os_make_sprite,
|
||||
/*sprite *sp = make_sprite();
|
||||
JS_GETATOM(js, sp->pos, argv[0], pos, vec2)
|
||||
JS_GETATOM(js, sp->center, argv[0], center, vec2)
|
||||
JS_GETATOM(js, sp->skew, argv[0], skew, vec2)
|
||||
JS_GETATOM(js, sp->scale, argv[0], scale, vec2)
|
||||
JS_GETATOM(js, sp->rotation, argv[0], rotation, angle)
|
||||
JS_GETATOM(js, sp->layer, argv[0], layer, number)
|
||||
JS_GETATOM(js, sp->color, argv[0], color, color)
|
||||
sprite_apply(sp);
|
||||
return sprite2js(js,sp);*/
|
||||
)
|
||||
|
||||
JSC_SCALL(os_system, ret = number2js(js,system(str)); )
|
||||
|
||||
JSValue make_color_buffer(JSContext *js, colorf c, int verts)
|
||||
@@ -2771,7 +2752,6 @@ static const JSCFunctionListEntry js_graphics_funcs[] = {
|
||||
MIST_FUNC_DEF(os, make_surface, 1),
|
||||
MIST_FUNC_DEF(os, make_cursor, 1),
|
||||
MIST_FUNC_DEF(os, make_font, 2),
|
||||
MIST_FUNC_DEF(os, make_sprite, 1),
|
||||
MIST_FUNC_DEF(os, make_line_prim, 5),
|
||||
MIST_FUNC_DEF(graphics, hsl_to_rgb, 3),
|
||||
MIST_FUNC_DEF(graphics, save_png, 4),
|
||||
@@ -2897,6 +2877,8 @@ void ffi_load(JSContext *js)
|
||||
arrput(rt->module_registry, ((ModuleEntry){"sdl_audio", js_sdl_audio_use}));
|
||||
arrput(rt->module_registry, MISTLINE(console));
|
||||
arrput(rt->module_registry, MISTLINE(rtree));
|
||||
arrput(rt->module_registry, MISTLINE(sprite));
|
||||
arrput(rt->module_registry, MISTLINE(transform));
|
||||
|
||||
#ifdef TRACY_ENABLE
|
||||
arrput(rt->module_registry, MISTLINE(tracy));
|
||||
|
||||
@@ -113,16 +113,6 @@ JSC_CCALL(os_hostname,
|
||||
#endif
|
||||
)
|
||||
|
||||
JSC_CCALL(os_make_transform,
|
||||
transform *t = make_transform();
|
||||
ret = transform2js(js,t);
|
||||
// t->self = JS_DupValue(js,ret);
|
||||
t->self = ret;
|
||||
)
|
||||
|
||||
JSC_CCALL(os_clean_transforms,
|
||||
clean_all(js);
|
||||
)
|
||||
|
||||
JSC_CCALL(os_arch,
|
||||
#if defined(__x86_64__) || defined(_M_X64)
|
||||
@@ -380,8 +370,6 @@ JSC_CCALL(os_destroy,
|
||||
)
|
||||
|
||||
static const JSCFunctionListEntry js_os_funcs[] = {
|
||||
MIST_FUNC_DEF(os, make_transform, 0),
|
||||
MIST_FUNC_DEF(os, clean_transforms, 0),
|
||||
|
||||
MIST_FUNC_DEF(os, platform, 0),
|
||||
MIST_FUNC_DEF(os, arch, 0),
|
||||
|
||||
@@ -192,7 +192,7 @@ JSValue js_rtree_use(JSContext *js) {
|
||||
QJSCLASSPREP_FUNCS(rtree);
|
||||
|
||||
// Create the constructor function
|
||||
JSValue ctor = JS_NewCFunction2(js, js_rtree_constructor, "RTree", 0, JS_CFUNC_constructor, 0);
|
||||
JSValue ctor = JS_NewCFunction2(js, js_rtree_constructor, "rtree", 0, JS_CFUNC_constructor, 0);
|
||||
|
||||
// Set the prototype on the constructor
|
||||
JSValue proto = JS_GetClassProto(js, js_rtree_id);
|
||||
|
||||
@@ -59,6 +59,49 @@ static const JSCFunctionListEntry js_sprite_funcs[] = {
|
||||
JS_CGETSET_DEF("rotation", js_sprite_get_rotation, js_sprite_set_rotation),
|
||||
};
|
||||
|
||||
// Note: Like transform, sprite doesn't use MISTUSE because sprite is a C type created via os.make_sprite()
|
||||
// The sprite functions are registered as methods on the sprite class prototype
|
||||
// This would be handled in the main FFI loading where QJSCLASSPREP_FUNCS(sprite) is called
|
||||
// Constructor function for sprite
|
||||
static JSValue js_sprite_constructor(JSContext *js, JSValueConst new_target, int argc, JSValueConst *argv) {
|
||||
sprite *sp = make_sprite();
|
||||
if (!sp) return JS_ThrowOutOfMemory(js);
|
||||
|
||||
// If an options object is provided, initialize the sprite with it
|
||||
if (argc > 0 && JS_IsObject(argv[0])) {
|
||||
JS_GETATOM(js, sp->pos, argv[0], pos, vec2)
|
||||
JS_GETATOM(js, sp->center, argv[0], center, vec2)
|
||||
JS_GETATOM(js, sp->skew, argv[0], skew, vec2)
|
||||
JS_GETATOM(js, sp->scale, argv[0], scale, vec2)
|
||||
JS_GETATOM(js, sp->rotation, argv[0], rotation, number)
|
||||
JS_GETATOM(js, sp->layer, argv[0], layer, number)
|
||||
JS_GETATOM(js, sp->color, argv[0], color, color)
|
||||
|
||||
JSValue image = JS_GetProperty(js, argv[0], JS_NewAtom(js, "image"));
|
||||
if (!JS_IsUndefined(image)) {
|
||||
sp->image = image; // Transfer ownership, no need to dup
|
||||
}
|
||||
}
|
||||
|
||||
// Default values if not provided
|
||||
if (sp->scale.x == 0 && sp->scale.y == 0) {
|
||||
sp->scale.x = 1;
|
||||
sp->scale.y = 1;
|
||||
}
|
||||
if (sp->color.w == 0) sp->color.w = 1; // Default alpha to 1
|
||||
|
||||
sprite_apply(sp);
|
||||
return sprite2js(js, sp);
|
||||
}
|
||||
|
||||
JSValue js_sprite_use(JSContext *js) {
|
||||
// Register the sprite class
|
||||
QJSCLASSPREP_FUNCS(sprite);
|
||||
|
||||
// Create the constructor function
|
||||
JSValue ctor = JS_NewCFunction2(js, js_sprite_constructor, "sprite", 1, JS_CFUNC_constructor, 0);
|
||||
|
||||
// Set the prototype on the constructor
|
||||
JSValue proto = JS_GetClassProto(js, js_sprite_id);
|
||||
JS_SetConstructor(js, ctor, proto);
|
||||
JS_FreeValue(js, proto);
|
||||
|
||||
return ctor;
|
||||
}
|
||||
@@ -207,6 +207,39 @@ static const JSCFunctionListEntry js_transform_funcs[] = {
|
||||
MIST_FUNC_DEF(transform, children, 0),
|
||||
};
|
||||
|
||||
// Note: Transform module doesn't use MISTUSE because transform is a C type that's created via os.make_transform()
|
||||
// The transform functions are registered as methods on the transform class prototype
|
||||
// This would be handled in the main FFI loading where QJSCLASSPREP_FUNCS(transform) is called
|
||||
// Constructor function for transform
|
||||
static JSValue js_transform_constructor(JSContext *js, JSValueConst new_target, int argc, JSValueConst *argv) {
|
||||
transform *t = make_transform();
|
||||
if (!t) return JS_ThrowOutOfMemory(js);
|
||||
|
||||
JSValue ret = transform2js(js, t);
|
||||
t->self = ret;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
JSC_CCALL(transform_clean,
|
||||
clean_all(js);
|
||||
)
|
||||
|
||||
static const JSCFunctionListEntry js_transform_ctor_funcs[] = {
|
||||
MIST_FUNC_DEF(transform, clean, 0),
|
||||
};
|
||||
|
||||
JSValue js_transform_use(JSContext *js) {
|
||||
// Register the transform class
|
||||
QJSCLASSPREP_FUNCS(transform);
|
||||
|
||||
// Create the constructor function
|
||||
JSValue ctor = JS_NewCFunction2(js, js_transform_constructor, "transform", 0, JS_CFUNC_constructor, 0);
|
||||
|
||||
// Set the prototype on the constructor
|
||||
JSValue proto = JS_GetClassProto(js, js_transform_id);
|
||||
JS_SetConstructor(js, ctor, proto);
|
||||
JS_FreeValue(js, proto);
|
||||
|
||||
// Add static methods to the constructor
|
||||
JS_SetPropertyFunctionList(js, ctor, js_transform_ctor_funcs, countof(js_transform_ctor_funcs));
|
||||
|
||||
return ctor;
|
||||
}
|
||||
|
||||
@@ -45,10 +45,11 @@ render.initialize({width:500, height:500, resolution_x:500, resolution_y:500,
|
||||
var os = use('os');
|
||||
var draw2d = use('draw2d');
|
||||
var gfx = use('graphics');
|
||||
var transform = use('transform');
|
||||
|
||||
var camera = {
|
||||
size: [500,500],
|
||||
transform: os.make_transform(),
|
||||
transform: new transform,
|
||||
fov:50,
|
||||
near_z: 0,
|
||||
far_z: 1000,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// bunnymark
|
||||
var render = use('render')
|
||||
var os = use('os')
|
||||
var transform = use('transform')
|
||||
var dim = [500,500]
|
||||
render.initialize({
|
||||
width:dim.x,
|
||||
@@ -13,7 +14,7 @@ render.initialize({
|
||||
|
||||
var camera = {
|
||||
size: [500,500],
|
||||
transform: os.make_transform(),
|
||||
transform: new transform,
|
||||
fov:50,
|
||||
near_z: 0,
|
||||
far_z: 1000,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
var render = use('render')
|
||||
var os = use('os')
|
||||
var transform = use('transform')
|
||||
|
||||
render.initialize({
|
||||
width:500,
|
||||
@@ -13,7 +14,7 @@ var draw = use('draw2d')
|
||||
|
||||
var camera = {
|
||||
size: [500,500],
|
||||
transform: os.make_transform(),
|
||||
transform: new transform,
|
||||
fov:50,
|
||||
near_z: 0,
|
||||
far_z: 1000,
|
||||
@@ -25,7 +26,7 @@ var camera = {
|
||||
|
||||
var hudcam = {
|
||||
size: [500,500],
|
||||
transform: os.make_transform(),
|
||||
transform: new transform,
|
||||
fov:50,
|
||||
near_z: 0,
|
||||
far_z: 1000,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// bunnymark
|
||||
var render = use('render')
|
||||
var os = use('os')
|
||||
var transform = use('transform')
|
||||
var dim = [500,500]
|
||||
render.initialize({
|
||||
width:dim.x,
|
||||
@@ -13,7 +14,7 @@ render.initialize({
|
||||
|
||||
var camera = {
|
||||
size: [500,500],
|
||||
transform: os.make_transform(),
|
||||
transform: new transform,
|
||||
fov:50,
|
||||
near_z: 0,
|
||||
far_z: 1000,
|
||||
|
||||
Reference in New Issue
Block a user