mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
replace get_texture_average_color with texture_to_lua_table
This commit is contained in:
parent
17c311ae7d
commit
b7edf71499
6 changed files with 51 additions and 42 deletions
|
|
@ -11099,10 +11099,8 @@ function geo_get_current_held_object()
|
||||||
end
|
end
|
||||||
|
|
||||||
--- @param tex Pointer_integer
|
--- @param tex Pointer_integer
|
||||||
--- @param out Color
|
--- Converts a texture's pixels to a Lua table. Returns nil if failed. Otherwise, returns a table as a pure memory buffer. Supports rgba16 and rgba32 textures.
|
||||||
--- @return boolean
|
function texture_to_lua_table(tex)
|
||||||
--- Calculates the average color of a given texture. Returns true if success
|
|
||||||
function get_texture_average_color(tex, out)
|
|
||||||
-- ...
|
-- ...
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5105,25 +5105,24 @@ Gets the current GraphNodeHeldObject
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
## [get_texture_average_color](#get_texture_average_color)
|
## [texture_to_lua_table](#texture_to_lua_table)
|
||||||
|
|
||||||
### Description
|
### Description
|
||||||
Calculates the average color of a given texture. Returns true if success
|
Converts a texture's pixels to a Lua table. Returns nil if failed. Otherwise, returns a table as a pure memory buffer. Supports rgba16 and rgba32 textures.
|
||||||
|
|
||||||
### Lua Example
|
### Lua Example
|
||||||
`local booleanValue = get_texture_average_color(tex, out)`
|
`texture_to_lua_table(tex)`
|
||||||
|
|
||||||
### Parameters
|
### Parameters
|
||||||
| Field | Type |
|
| Field | Type |
|
||||||
| ----- | ---- |
|
| ----- | ---- |
|
||||||
| tex | `Pointer` <`integer`> |
|
| tex | `Pointer` <`integer`> |
|
||||||
| out | [Color](structs.md#Color) |
|
|
||||||
|
|
||||||
### Returns
|
### Returns
|
||||||
- `boolean`
|
- None
|
||||||
|
|
||||||
### C Prototype
|
### C Prototype
|
||||||
`bool get_texture_average_color(const u8 *tex, OUT Color out);`
|
`void texture_to_lua_table(const u8 *tex);`
|
||||||
|
|
||||||
[:arrow_up_small:](#)
|
[:arrow_up_small:](#)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1990,7 +1990,7 @@
|
||||||
- [geo_get_current_perspective](functions-6.md#geo_get_current_perspective)
|
- [geo_get_current_perspective](functions-6.md#geo_get_current_perspective)
|
||||||
- [geo_get_current_camera](functions-6.md#geo_get_current_camera)
|
- [geo_get_current_camera](functions-6.md#geo_get_current_camera)
|
||||||
- [geo_get_current_held_object](functions-6.md#geo_get_current_held_object)
|
- [geo_get_current_held_object](functions-6.md#geo_get_current_held_object)
|
||||||
- [get_texture_average_color](functions-6.md#get_texture_average_color)
|
- [texture_to_lua_table](functions-6.md#texture_to_lua_table)
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33279,25 +33279,19 @@ int smlua_func_geo_get_current_held_object(UNUSED lua_State* L) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int smlua_func_get_texture_average_color(lua_State* L) {
|
int smlua_func_texture_to_lua_table(lua_State* L) {
|
||||||
if (L == NULL) { return 0; }
|
if (L == NULL) { return 0; }
|
||||||
|
|
||||||
int top = lua_gettop(L);
|
int top = lua_gettop(L);
|
||||||
if (top != 2) {
|
if (top != 1) {
|
||||||
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "get_texture_average_color", 2, top);
|
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "texture_to_lua_table", 1, top);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 * tex = (u8 *)smlua_to_cpointer(L, 1, LVT_U8_P);
|
u8 * tex = (u8 *)smlua_to_cpointer(L, 1, LVT_U8_P);
|
||||||
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "get_texture_average_color"); return 0; }
|
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "texture_to_lua_table"); return 0; }
|
||||||
|
|
||||||
Color out;
|
texture_to_lua_table(tex);
|
||||||
smlua_get_color(out, 2);
|
|
||||||
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "get_texture_average_color"); return 0; }
|
|
||||||
|
|
||||||
lua_pushboolean(L, get_texture_average_color(tex, out));
|
|
||||||
|
|
||||||
smlua_push_color(out, 2);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -37184,7 +37178,7 @@ void smlua_bind_functions_autogen(void) {
|
||||||
smlua_bind_function(L, "geo_get_current_perspective", smlua_func_geo_get_current_perspective);
|
smlua_bind_function(L, "geo_get_current_perspective", smlua_func_geo_get_current_perspective);
|
||||||
smlua_bind_function(L, "geo_get_current_camera", smlua_func_geo_get_current_camera);
|
smlua_bind_function(L, "geo_get_current_camera", smlua_func_geo_get_current_camera);
|
||||||
smlua_bind_function(L, "geo_get_current_held_object", smlua_func_geo_get_current_held_object);
|
smlua_bind_function(L, "geo_get_current_held_object", smlua_func_geo_get_current_held_object);
|
||||||
smlua_bind_function(L, "get_texture_average_color", smlua_func_get_texture_average_color);
|
smlua_bind_function(L, "texture_to_lua_table", smlua_func_texture_to_lua_table);
|
||||||
|
|
||||||
// smlua_model_utils.h
|
// smlua_model_utils.h
|
||||||
smlua_bind_function(L, "smlua_model_util_get_id", smlua_func_smlua_model_util_get_id);
|
smlua_bind_function(L, "smlua_model_util_get_id", smlua_func_smlua_model_util_get_id);
|
||||||
|
|
|
||||||
|
|
@ -586,24 +586,42 @@ struct GraphNodeHeldObject* geo_get_current_held_object(void) {
|
||||||
return gCurGraphNodeHeldObject;
|
return gCurGraphNodeHeldObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get_texture_average_color(const u8 *tex, OUT Color out) {
|
void texture_to_lua_table(const u8 *tex) {
|
||||||
|
lua_State *L = gLuaState;
|
||||||
|
if (!L || !tex) { return; }
|
||||||
|
|
||||||
struct TextureInfo texInfo;
|
struct TextureInfo texInfo;
|
||||||
if (!tex) { return false; }
|
if (!dynos_texture_get_from_data(tex, &texInfo)) { return; }
|
||||||
if (!dynos_texture_get_from_data(tex, &texInfo)) { return false; }
|
|
||||||
u32 w = texInfo.width;
|
u32 bpp = texInfo.bitSize;
|
||||||
u32 h = texInfo.height;
|
if (bpp != 16 && bpp != 32) { return; }
|
||||||
u32 texSize = w * h;
|
|
||||||
|
u32 bytesPerPixel = bpp / 8;
|
||||||
const u8 *data = texInfo.texture;
|
const u8 *data = texInfo.texture;
|
||||||
u32 r = 0;
|
u32 texSize = texInfo.width * texInfo.height * bytesPerPixel;
|
||||||
u32 g = 0;
|
|
||||||
u32 b = 0;
|
lua_newtable(L);
|
||||||
for (u32 i = 0; i < texSize; i++) {
|
for (u32 i = 0; i < texSize; i += bytesPerPixel) {
|
||||||
r += data[4 * i + 0];
|
lua_newtable(L);
|
||||||
g += data[4 * i + 1];
|
|
||||||
b += data[4 * i + 2];
|
if (bpp == 16) {
|
||||||
|
u16 col = (data[i] << 8) | data[i + 1];
|
||||||
|
u8 r = SCALE_5_8((col >> 11) & 0x1F);
|
||||||
|
u8 g = SCALE_5_8((col >> 6) & 0x1F);
|
||||||
|
u8 b = SCALE_5_8((col >> 1) & 0x1F);
|
||||||
|
u8 a = 0xFF * (col & 0x1);
|
||||||
|
|
||||||
|
smlua_push_integer_field(-2, "r", r);
|
||||||
|
smlua_push_integer_field(-2, "g", g);
|
||||||
|
smlua_push_integer_field(-2, "b", b);
|
||||||
|
smlua_push_integer_field(-2, "a", a);
|
||||||
|
} else if (bpp == 32) {
|
||||||
|
smlua_push_integer_field(-2, "r", data[i]);
|
||||||
|
smlua_push_integer_field(-2, "g", data[i + 1]);
|
||||||
|
smlua_push_integer_field(-2, "b", data[i + 2]);
|
||||||
|
smlua_push_integer_field(-2, "a", data[i + 3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_rawseti(L, -2, i / bytesPerPixel + 1);
|
||||||
}
|
}
|
||||||
out[0] = r / texSize;
|
|
||||||
out[1] = g / texSize;
|
|
||||||
out[2] = b / texSize;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -231,7 +231,7 @@ struct GraphNodeCamera* geo_get_current_camera(void);
|
||||||
/* |description|Gets the current GraphNodeHeldObject|descriptionEnd|*/
|
/* |description|Gets the current GraphNodeHeldObject|descriptionEnd|*/
|
||||||
struct GraphNodeHeldObject* geo_get_current_held_object(void);
|
struct GraphNodeHeldObject* geo_get_current_held_object(void);
|
||||||
|
|
||||||
/* |description|Calculates the average color of a given texture. Returns true if success|descriptionEnd|*/
|
/* |description|Converts a texture's pixels to a Lua table. Returns nil if failed. Otherwise, returns a table as a pure memory buffer. Supports rgba16 and rgba32 textures.|descriptionEnd|*/
|
||||||
bool get_texture_average_color(const u8 *tex, OUT Color out);
|
void texture_to_lua_table(const u8 *tex);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue