Builds and works on Gamecube
This commit is contained in:
@@ -17,10 +17,8 @@ const testPos = testEntity.add(Component.POSITION);
|
||||
|
||||
/** @type {RenderableSpritebatch} */
|
||||
const testRenderable = testEntity.add(Component.RENDERABLE);
|
||||
testRenderable.type = Renderable.SPRITEBATCH;
|
||||
testRenderable.setTexture(entry.texture);
|
||||
testRenderable.addSprite(
|
||||
0, 0, 1, 1,
|
||||
0, 0, 1, 1
|
||||
);
|
||||
testRenderable.texture = entry.texture;
|
||||
testRenderable.sprites = [
|
||||
[0, 0, 1, 1, 0, 1, 1, 0]
|
||||
];
|
||||
testPos.localPosition = new Vec3(0, 0, 0);
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
docker build -t dusk-dolphin -f docker/dolphin/Dockerfile .
|
||||
docker run --rm -v $(pwd):/workdir dusk-dolphin /bin/bash -c "./scripts/build-gamecube.sh"
|
||||
docker run --rm -v "$(pwd):/workdir" dusk-dolphin /bin/bash -c "./scripts/build-gamecube.sh"
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
docker build -t dusk-dolphin -f docker/dolphin/Dockerfile .
|
||||
docker run --rm -v $(pwd):/workdir dusk-dolphin /bin/bash -c "./scripts/build-gamecube-iso.sh"
|
||||
docker run --rm -v "$(pwd):/workdir" dusk-dolphin /bin/bash -c "./scripts/build-gamecube-iso.sh"
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
docker build -t dusk-knulli -f docker/knulli/Dockerfile .
|
||||
docker run --rm -v $(pwd):/workdir dusk-knulli /bin/bash -c "./scripts/build-knulli.sh"
|
||||
docker run --rm -v "$(pwd):/workdir" dusk-knulli /bin/bash -c "./scripts/build-knulli.sh"
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
docker build -t dusk-linux -f docker/linux/Dockerfile .
|
||||
docker run --rm -v $(pwd):/workdir dusk-linux /bin/bash -c "./scripts/build-linux.sh"
|
||||
docker run --rm -v "$(pwd):/workdir" dusk-linux /bin/bash -c "./scripts/build-linux.sh"
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
docker build -t dusk-psp -f docker/psp/Dockerfile .
|
||||
docker run --rm -v $(pwd):/workdir dusk-psp /bin/bash -c "./scripts/build-psp.sh"
|
||||
docker run --rm -v "$(pwd):/workdir" dusk-psp /bin/bash -c "./scripts/build-psp.sh"
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
docker build -t dusk-vita -f docker/vita/Dockerfile .
|
||||
docker run --rm -v $(pwd):/workdir dusk-vita /bin/bash -c "./scripts/build-vita.sh"
|
||||
docker run --rm -v "$(pwd):/workdir" dusk-vita /bin/bash -c "./scripts/build-vita.sh"
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
docker build -t dusk-dolphin -f docker/dolphin/Dockerfile .
|
||||
docker run --rm -v $(pwd):/workdir dusk-dolphin /bin/bash -c "./scripts/build-wii.sh"
|
||||
docker run --rm -v "$(pwd):/workdir" dusk-dolphin /bin/bash -c "./scripts/build-wii.sh"
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
docker build -t dusk-dolphin -f docker/dolphin/Dockerfile .
|
||||
docker run --rm -v $(pwd):/workdir dusk-dolphin /bin/bash -c "./scripts/build-wii-iso.sh"
|
||||
docker run --rm -v "$(pwd):/workdir" dusk-dolphin /bin/bash -c "./scripts/build-wii-iso.sh"
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
docker build -t dusk-linux -f docker/linux/Dockerfile .
|
||||
docker run --rm -v $(pwd):/workdir dusk-linux /bin/bash -c "./scripts/test-linux.sh"
|
||||
docker run --rm -v "$(pwd):/workdir" dusk-linux /bin/bash -c "./scripts/test-linux.sh"
|
||||
@@ -34,6 +34,19 @@ static inline entityrenderable_t *moduleRenderableData(const jscomponent_t *c) {
|
||||
);
|
||||
}
|
||||
|
||||
/** Read a float from a JS array at index, returning def if out of range. */
|
||||
static inline float_t moduleRenderableArrayFloat(
|
||||
const jerry_value_t arr,
|
||||
const uint32_t idx,
|
||||
const float_t def
|
||||
) {
|
||||
if(idx >= jerry_array_length(arr)) return def;
|
||||
jerry_value_t v = jerry_object_get_index(arr, idx);
|
||||
float_t f = jerry_value_is_number(v) ? (float_t)jerry_value_as_number(v) : def;
|
||||
jerry_value_free(v);
|
||||
return f;
|
||||
}
|
||||
|
||||
moduleBaseFunction(moduleRenderableGetEntity) {
|
||||
jscomponent_t *c = moduleRenderableSelf(callInfo);
|
||||
if(!c) return jerry_undefined();
|
||||
@@ -104,7 +117,22 @@ moduleBaseFunction(moduleRenderableSetColor) {
|
||||
return jerry_undefined();
|
||||
}
|
||||
|
||||
/* setTexture(tex: Texture) — switches to SPRITEBATCH and stores the texture. */
|
||||
/*
|
||||
* texture getter — returns the pinned Texture instance, or undefined if none.
|
||||
*/
|
||||
moduleBaseFunction(moduleRenderableGetTexture) {
|
||||
jscomponent_t *c = moduleRenderableSelf(callInfo);
|
||||
if(!c) return jerry_undefined();
|
||||
jerry_value_t key = jerry_string_sz("_tex");
|
||||
jerry_value_t val = jerry_object_get(callInfo->this_value, key);
|
||||
jerry_value_free(key);
|
||||
return val;
|
||||
}
|
||||
|
||||
/*
|
||||
* texture setter — switches to SPRITEBATCH, binds the texture, and pins the
|
||||
* Texture JS object so GC won't free the asset while the pointer is live.
|
||||
*/
|
||||
moduleBaseFunction(moduleRenderableSetTexture) {
|
||||
moduleBaseRequireArgs(1);
|
||||
jscomponent_t *c = moduleRenderableSelf(callInfo);
|
||||
@@ -115,11 +143,10 @@ moduleBaseFunction(moduleRenderableSetTexture) {
|
||||
&MODULE_TEXTURE_PROTO, args[0]
|
||||
);
|
||||
if(!tex || !tex->entry) {
|
||||
return moduleBaseThrow("Renderable.setTexture: expected Texture");
|
||||
return moduleBaseThrow("Renderable.texture: expected Texture");
|
||||
}
|
||||
r->type = ENTITY_RENDERABLE_TYPE_SPRITEBATCH;
|
||||
r->data.spritebatch.texture = &tex->entry->data.texture;
|
||||
/* Pin the Texture object so GC won't free the asset while we hold a pointer. */
|
||||
jerry_value_t pinKey = jerry_string_sz("_tex");
|
||||
jerry_object_set(callInfo->this_value, pinKey, args[0]);
|
||||
jerry_value_free(pinKey);
|
||||
@@ -127,55 +154,89 @@ moduleBaseFunction(moduleRenderableSetTexture) {
|
||||
}
|
||||
|
||||
/*
|
||||
* addSprite(x1,y1,z1, x2,y2,z2, u1,v1, u2,v2)
|
||||
* addSprite(x1,y1, x2,y2, u1,v1, u2,v2) — z defaults to 0
|
||||
* sprites getter — returns a JS array of sprite sub-arrays.
|
||||
* Each element is [x1,y1,z1, x2,y2,z2, u1,v1, u2,v2] (10 numbers).
|
||||
*/
|
||||
moduleBaseFunction(moduleRenderableAddSprite) {
|
||||
moduleBaseFunction(moduleRenderableGetSprites) {
|
||||
jscomponent_t *c = moduleRenderableSelf(callInfo);
|
||||
if(!c) return jerry_undefined();
|
||||
entityrenderable_t *r = moduleRenderableData(c);
|
||||
if(!r) return jerry_undefined();
|
||||
entityrenderablespritebatch_t *sb = &r->data.spritebatch;
|
||||
if(sb->spriteCount >= ENTITY_RENDERABLE_SPRITEBATCH_SPRITES_MAX) {
|
||||
return moduleBaseThrow("Renderable.addSprite: sprite capacity reached");
|
||||
const entityrenderablespritebatch_t *sb = &r->data.spritebatch;
|
||||
|
||||
jerry_value_t arr = jerry_array((uint32_t)sb->spriteCount);
|
||||
for(uint32_t i = 0; i < (uint32_t)sb->spriteCount; i++) {
|
||||
const spritebatchsprite_t *s = &sb->sprites[i];
|
||||
float_t vals[10] = {
|
||||
s->min[0], s->min[1], s->min[2],
|
||||
s->max[0], s->max[1], s->max[2],
|
||||
s->uvMin[0], s->uvMin[1],
|
||||
s->uvMax[0], s->uvMax[1],
|
||||
};
|
||||
jerry_value_t sprite = jerry_array(10);
|
||||
for(uint32_t j = 0; j < 10; j++) {
|
||||
jerry_value_t num = jerry_number((double)vals[j]);
|
||||
jerry_object_set_index(sprite, j, num);
|
||||
jerry_value_free(num);
|
||||
}
|
||||
jerry_object_set_index(arr, i, sprite);
|
||||
jerry_value_free(sprite);
|
||||
}
|
||||
spritebatchsprite_t s;
|
||||
if(argc >= 10) {
|
||||
moduleBaseRequireArgs(10);
|
||||
s.min[0] = moduleBaseArgFloat(0);
|
||||
s.min[1] = moduleBaseArgFloat(1);
|
||||
s.min[2] = moduleBaseArgFloat(2);
|
||||
s.max[0] = moduleBaseArgFloat(3);
|
||||
s.max[1] = moduleBaseArgFloat(4);
|
||||
s.max[2] = moduleBaseArgFloat(5);
|
||||
s.uvMin[0] = moduleBaseArgFloat(6);
|
||||
s.uvMin[1] = moduleBaseArgFloat(7);
|
||||
s.uvMax[0] = moduleBaseArgFloat(8);
|
||||
s.uvMax[1] = moduleBaseArgFloat(9);
|
||||
} else {
|
||||
moduleBaseRequireArgs(8);
|
||||
s.min[0] = moduleBaseArgFloat(0);
|
||||
s.min[1] = moduleBaseArgFloat(1);
|
||||
s.min[2] = 0.0f;
|
||||
s.max[0] = moduleBaseArgFloat(2);
|
||||
s.max[1] = moduleBaseArgFloat(3);
|
||||
s.max[2] = 0.0f;
|
||||
s.uvMin[0] = moduleBaseArgFloat(4);
|
||||
s.uvMin[1] = moduleBaseArgFloat(5);
|
||||
s.uvMax[0] = moduleBaseArgFloat(6);
|
||||
s.uvMax[1] = moduleBaseArgFloat(7);
|
||||
}
|
||||
sb->sprites[sb->spriteCount++] = s;
|
||||
return jerry_undefined();
|
||||
return arr;
|
||||
}
|
||||
|
||||
/* clearSprites() — resets the sprite count to 0. */
|
||||
moduleBaseFunction(moduleRenderableClearSprites) {
|
||||
/*
|
||||
* sprites setter — accepts an array of sub-arrays.
|
||||
* Each element: 10 numbers (3D) or 8 numbers (2D, z defaults to 0).
|
||||
*/
|
||||
moduleBaseFunction(moduleRenderableSetSprites) {
|
||||
moduleBaseRequireArgs(1);
|
||||
jscomponent_t *c = moduleRenderableSelf(callInfo);
|
||||
if(!c) return jerry_undefined();
|
||||
entityrenderable_t *r = moduleRenderableData(c);
|
||||
if(!r) return jerry_undefined();
|
||||
r->data.spritebatch.spriteCount = 0;
|
||||
if(!jerry_value_is_array(args[0])) {
|
||||
return moduleBaseThrow("Renderable.sprites: expected Array");
|
||||
}
|
||||
entityrenderablespritebatch_t *sb = &r->data.spritebatch;
|
||||
uint32_t count = jerry_array_length(args[0]);
|
||||
if(count > ENTITY_RENDERABLE_SPRITEBATCH_SPRITES_MAX) {
|
||||
return moduleBaseThrow("Renderable.sprites: exceeds sprite capacity");
|
||||
}
|
||||
sb->spriteCount = 0;
|
||||
for(uint32_t i = 0; i < count; i++) {
|
||||
jerry_value_t elem = jerry_object_get_index(args[0], i);
|
||||
if(!jerry_value_is_array(elem)) {
|
||||
jerry_value_free(elem);
|
||||
return moduleBaseThrow("Renderable.sprites: each element must be an Array");
|
||||
}
|
||||
spritebatchsprite_t s;
|
||||
if(jerry_array_length(elem) >= 10) {
|
||||
s.min[0] = moduleRenderableArrayFloat(elem, 0, 0.0f);
|
||||
s.min[1] = moduleRenderableArrayFloat(elem, 1, 0.0f);
|
||||
s.min[2] = moduleRenderableArrayFloat(elem, 2, 0.0f);
|
||||
s.max[0] = moduleRenderableArrayFloat(elem, 3, 0.0f);
|
||||
s.max[1] = moduleRenderableArrayFloat(elem, 4, 0.0f);
|
||||
s.max[2] = moduleRenderableArrayFloat(elem, 5, 0.0f);
|
||||
s.uvMin[0] = moduleRenderableArrayFloat(elem, 6, 0.0f);
|
||||
s.uvMin[1] = moduleRenderableArrayFloat(elem, 7, 0.0f);
|
||||
s.uvMax[0] = moduleRenderableArrayFloat(elem, 8, 1.0f);
|
||||
s.uvMax[1] = moduleRenderableArrayFloat(elem, 9, 1.0f);
|
||||
} else {
|
||||
s.min[0] = moduleRenderableArrayFloat(elem, 0, 0.0f);
|
||||
s.min[1] = moduleRenderableArrayFloat(elem, 1, 0.0f);
|
||||
s.min[2] = 0.0f;
|
||||
s.max[0] = moduleRenderableArrayFloat(elem, 2, 0.0f);
|
||||
s.max[1] = moduleRenderableArrayFloat(elem, 3, 0.0f);
|
||||
s.max[2] = 0.0f;
|
||||
s.uvMin[0] = moduleRenderableArrayFloat(elem, 4, 0.0f);
|
||||
s.uvMin[1] = moduleRenderableArrayFloat(elem, 5, 0.0f);
|
||||
s.uvMax[0] = moduleRenderableArrayFloat(elem, 6, 1.0f);
|
||||
s.uvMax[1] = moduleRenderableArrayFloat(elem, 7, 1.0f);
|
||||
}
|
||||
jerry_value_free(elem);
|
||||
sb->sprites[sb->spriteCount++] = s;
|
||||
}
|
||||
return jerry_undefined();
|
||||
}
|
||||
|
||||
@@ -211,14 +272,13 @@ static void moduleRenderableInit(void) {
|
||||
&MODULE_RENDERABLE_PROTO, "color",
|
||||
moduleRenderableGetColor, moduleRenderableSetColor
|
||||
);
|
||||
scriptProtoDefineFunc(
|
||||
&MODULE_RENDERABLE_PROTO, "setTexture", moduleRenderableSetTexture
|
||||
scriptProtoDefineProp(
|
||||
&MODULE_RENDERABLE_PROTO, "texture",
|
||||
moduleRenderableGetTexture, moduleRenderableSetTexture
|
||||
);
|
||||
scriptProtoDefineFunc(
|
||||
&MODULE_RENDERABLE_PROTO, "addSprite", moduleRenderableAddSprite
|
||||
);
|
||||
scriptProtoDefineFunc(
|
||||
&MODULE_RENDERABLE_PROTO, "clearSprites", moduleRenderableClearSprites
|
||||
scriptProtoDefineProp(
|
||||
&MODULE_RENDERABLE_PROTO, "sprites",
|
||||
moduleRenderableGetSprites, moduleRenderableSetSprites
|
||||
);
|
||||
scriptProtoDefineToString(&MODULE_RENDERABLE_PROTO, moduleRenderableToString);
|
||||
|
||||
|
||||
+18
-14
@@ -32,27 +32,31 @@ interface RenderableMaterial extends Renderable {
|
||||
|
||||
/**
|
||||
* Renderable in `SPRITEBATCH` mode.
|
||||
* Activated by calling `setTexture`.
|
||||
*
|
||||
* Set `texture` to activate spritebatch rendering (also switches `type`
|
||||
* to `Renderable.SPRITEBATCH` automatically).
|
||||
*/
|
||||
interface RenderableSpritebatch extends Renderable {
|
||||
/**
|
||||
* Assigns a texture and switches to `SPRITEBATCH` mode.
|
||||
* The Texture object is pinned (GC-safe) for the component's lifetime.
|
||||
* The bound texture. Assigning a `Texture` switches the renderable to
|
||||
* `SPRITEBATCH` mode and pins the object against GC. Reading returns the
|
||||
* same `Texture` instance that was assigned, or `undefined` if none.
|
||||
*/
|
||||
setTexture(texture: Texture): void;
|
||||
texture: Texture | undefined;
|
||||
|
||||
/**
|
||||
* Adds a sprite quad to the spritebatch.
|
||||
* Sprite list. Reading returns a JS array of 10-element sub-arrays
|
||||
* `[x1,y1,z1, x2,y2,z2, u1,v1, u2,v2]` — one per sprite.
|
||||
*
|
||||
* 3D form (10 args): `addSprite(x1,y1,z1, x2,y2,z2, u1,v1, u2,v2)`
|
||||
* 2D form (8 args): `addSprite(x1,y1, x2,y2, u1,v1, u2,v2)` — z defaults to 0
|
||||
* Assigning an array replaces all sprites. Each element may be:
|
||||
* - 10 numbers (3D): `[x1,y1,z1, x2,y2,z2, u1,v1, u2,v2]`
|
||||
* - 8 numbers (2D, z defaults to 0): `[x1,y1, x2,y2, u1,v1, u2,v2]`
|
||||
*
|
||||
* @example
|
||||
* r.sprites = [[-0.5, 0, 0.5, 1, 0, 0, 1, 1]];
|
||||
* r.sprites = []; // clear
|
||||
*/
|
||||
addSprite(
|
||||
x1: number, y1: number, z1OrX2: number,
|
||||
x2OrY2: number, y2OrZ2?: number, z2?: number,
|
||||
u1?: number, v1?: number, u2?: number, v2?: number
|
||||
): void;
|
||||
/** Resets the sprite count to zero. */
|
||||
clearSprites(): void;
|
||||
sprites: number[][];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user