mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	get_texture_average_color
	
		
			
	
		
	
	
		
	
		
			Some checks are pending
		
		
	
	
		
			
				
	
				Build coop / build-linux (push) Waiting to run
				
			
		
			
				
	
				Build coop / build-steamos (push) Waiting to run
				
			
		
			
				
	
				Build coop / build-windows-opengl (push) Waiting to run
				
			
		
			
				
	
				Build coop / build-windows-directx (push) Waiting to run
				
			
		
			
				
	
				Build coop / build-macos-arm (push) Waiting to run
				
			
		
			
				
	
				Build coop / build-macos-intel (push) Waiting to run
				
			
		
		
	
	
				
					
				
			
		
			Some checks are pending
		
		
	
	Build coop / build-linux (push) Waiting to run
				
			Build coop / build-steamos (push) Waiting to run
				
			Build coop / build-windows-opengl (push) Waiting to run
				
			Build coop / build-windows-directx (push) Waiting to run
				
			Build coop / build-macos-arm (push) Waiting to run
				
			Build coop / build-macos-intel (push) Waiting to run
				
			pass in a texture, it returns the average color of the texture
This commit is contained in:
		
							parent
							
								
									378b619fd6
								
							
						
					
					
						commit
						98ff007818
					
				
					 11 changed files with 145 additions and 22 deletions
				
			
		|  | @ -11098,6 +11098,14 @@ function geo_get_current_held_object() | |||
|     -- ... | ||||
| end | ||||
| 
 | ||||
| --- @param tex Pointer_integer | ||||
| --- @param out Color | ||||
| --- @return boolean | ||||
| --- Calculates the average color of a given texture. Returns true if success | ||||
| function get_texture_average_color(tex, out) | ||||
|     -- ... | ||||
| end | ||||
| 
 | ||||
| --- @param name string | ||||
| --- @return ModelExtendedId | ||||
| --- Gets the extended model ID for the `name` of a `GeoLayout` | ||||
|  |  | |||
|  | @ -48,6 +48,7 @@ Collision* dynos_collision_get(const char* collisionName); | |||
| // -- textures -- //
 | ||||
| void dynos_add_texture(const char *filePath, const char* textureName); | ||||
| bool dynos_texture_get(const char* textureName, struct TextureInfo* outTextureInfo); | ||||
| bool dynos_texture_get_from_data(const Texture *tex, struct TextureInfo* outTextureInfo); | ||||
| void dynos_texture_override_set(const char* textureName, struct TextureInfo* overrideTextureInfo); | ||||
| void dynos_texture_override_reset(const char* textureName); | ||||
| 
 | ||||
|  |  | |||
|  | @ -862,6 +862,7 @@ const Texture*   DynOS_Builtin_Tex_GetFromName(const char* aDataName); | |||
| const char*      DynOS_Builtin_Tex_GetFromData(const Texture* aData); | ||||
| const char*      DynOS_Builtin_Tex_GetNameFromFileName(const char* aDataName); | ||||
| const struct BuiltinTexInfo* DynOS_Builtin_Tex_GetInfoFromName(const char* aDataName); | ||||
| const struct BuiltinTexInfo* DynOS_Builtin_Tex_GetInfoFromData(const Texture* aData); | ||||
| const void*      DynOS_Builtin_Func_GetFromName(const char* aDataName); | ||||
| const void*      DynOS_Builtin_Func_GetFromIndex(s32 aIndex); | ||||
| const char *     DynOS_Builtin_Func_GetNameFromIndex(s64 aIndex); | ||||
|  | @ -918,6 +919,7 @@ void DynOS_Tex_Activate(DataNode<TexData>* aNode, bool aCustomTexture); | |||
| void DynOS_Tex_Deactivate(DataNode<TexData>* aNode); | ||||
| void DynOS_Tex_AddCustom(const SysPath &aFilename, const char *aTexName); | ||||
| bool DynOS_Tex_Get(const char* aTexName, struct TextureInfo* aOutTexInfo); | ||||
| bool DynOS_Tex_GetFromData(const Texture *aTex, struct TextureInfo* aOutTexInfo); | ||||
| void DynOS_Tex_Override_Set(const char* textureName, struct TextureInfo* aOverrideTexInfo); | ||||
| void DynOS_Tex_Override_Reset(const char* textureName); | ||||
| void DynOS_Tex_ModShutdown(); | ||||
|  |  | |||
|  | @ -148,6 +148,10 @@ bool dynos_texture_get(const char* textureName, struct TextureInfo* outTextureIn | |||
|     return DynOS_Tex_Get(textureName, outTextureInfo); | ||||
| } | ||||
| 
 | ||||
| bool dynos_texture_get_from_data(const Texture *tex, struct TextureInfo* outTextureInfo) { | ||||
|     return DynOS_Tex_GetFromData(tex, outTextureInfo); | ||||
| } | ||||
| 
 | ||||
| void dynos_texture_override_set(const char* textureName, struct TextureInfo* overrideTextureInfo) { | ||||
|     DynOS_Tex_Override_Set(textureName, overrideTextureInfo); | ||||
| } | ||||
|  |  | |||
|  | @ -1153,7 +1153,7 @@ static const struct BuiltinTexInfo sDynosBuiltinTexs[] = { | |||
|     define_builtin_tex(texture_selectionbox_back_icon, "textures/segment2/custom_selectionbox_back_icon.rgba16.png", 16, 16, 16), | ||||
|     define_builtin_tex(texture_selectionbox_forward_icon, "textures/segment2/custom_selectionbox_forward_icon.rgba16.png", 16, 16, 16), | ||||
|     define_builtin_tex(texture_coopdx_logo, "textures/segment2/custom_coopdx_logo.rgba32.png", 2048, 1024, 32), | ||||
|      | ||||
| 
 | ||||
|     // Goddard
 | ||||
|     define_builtin_tex(gd_texture_hand_open, "textures/intro_raw/hand_open.rgba16.png", 32, 32, 16), | ||||
|     define_builtin_tex(gd_texture_hand_closed, "textures/intro_raw/hand_closed.rgba16.png", 32, 32, 16), | ||||
|  | @ -1179,7 +1179,7 @@ static const struct BuiltinTexInfo sDynosBuiltinTexs[] = { | |||
|     define_builtin_tex(gd_texture_sparkle_3, "textures/intro_raw/sparkle_3.rgba16.png", 32, 32, 16), | ||||
|     define_builtin_tex(gd_texture_sparkle_4, "textures/intro_raw/sparkle_4.rgba16.png", 32, 32, 16), | ||||
|     define_builtin_tex(gd_texture_sparkle_5, "textures/intro_raw/sparkle_5.rgba16.png", 32, 32, 16), | ||||
|      | ||||
| 
 | ||||
|     // Version Exclusives
 | ||||
| #if defined(VERSION_JP) | ||||
|     define_builtin_tex(texture_font_char_jp_0, "textures/segment2/segment2.07100.ia1.png", 8, 8, 16), | ||||
|  | @ -1448,7 +1448,7 @@ static const struct BuiltinTexInfo sDynosBuiltinTexs[] = { | |||
|     define_builtin_tex(texture_font_char_eu_unknown, "textures/segment2/font_graphics.06510.ia1.png", 16, 8, 16), | ||||
|     define_builtin_tex(texture_font_char_eu_Cedilla, "textures/segment2/font_graphics.06520.ia1.png", 16, 8, 16), | ||||
|     define_builtin_tex(texture_font_char_eu_eszeet, "textures/segment2/font_graphics.06530.ia1.png", 16, 8, 16), | ||||
|      | ||||
| 
 | ||||
|     define_builtin_tex(cake_end_texture_eu_35, "levels/ending/eu_023000.rgba16.png", 64, 32, 16), | ||||
|     define_builtin_tex(cake_end_texture_eu_36, "levels/ending/eu_024000.rgba16.png", 64, 32, 16), | ||||
|     define_builtin_tex(cake_end_texture_eu_37, "levels/ending/eu_025000.rgba16.png", 64, 32, 16), | ||||
|  | @ -1614,7 +1614,7 @@ static const struct BuiltinTexInfo sDynosBuiltinTexs[] = { | |||
|     define_builtin_tex(water_skybox_texture_0003D, "textures/skybox_tiles/water.61.rgba16.png", 32, 32, 16), | ||||
|     define_builtin_tex(water_skybox_texture_0003E, "textures/skybox_tiles/water.62.rgba16.png", 32, 32, 16), | ||||
|     define_builtin_tex(water_skybox_texture_0003F, "textures/skybox_tiles/water.63.rgba16.png", 32, 32, 16), | ||||
|      | ||||
| 
 | ||||
|     define_builtin_tex(bitfs_skybox_texture_00000, "textures/skybox_tiles/bitfs.0.rgba16.png", 32, 32, 16), | ||||
|     define_builtin_tex(bitfs_skybox_texture_00001, "textures/skybox_tiles/bitfs.1.rgba16.png", 32, 32, 16), | ||||
|     define_builtin_tex(bitfs_skybox_texture_00002, "textures/skybox_tiles/bitfs.2.rgba16.png", 32, 32, 16), | ||||
|  | @ -2461,3 +2461,15 @@ const struct BuiltinTexInfo* DynOS_Builtin_Tex_GetInfoFromName(const char* aData | |||
| 
 | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| const struct BuiltinTexInfo* DynOS_Builtin_Tex_GetInfoFromData(const Texture* aData) { | ||||
|     size_t count = sizeof(sDynosBuiltinTexs) / (sizeof(struct BuiltinTexInfo)); | ||||
|     for (size_t i = 0; i < count; i++) { | ||||
|         const struct BuiltinTexInfo* info = &sDynosBuiltinTexs[i]; | ||||
|         if (info->pointer == aData) { | ||||
|             return info; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return NULL; | ||||
| } | ||||
|  |  | |||
|  | @ -447,24 +447,24 @@ void DynOS_Tex_AddCustom(const SysPath &aFilename, const char *aTexName) { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| bool DynOS_Tex_Get(const char* aTexName, struct TextureInfo* aOutTexInfo) { | ||||
|     #define CONVERT_TEXINFO() { \ | ||||
|         /* translate bit size */ \ | ||||
|         switch (_Data->mRawSize) { \ | ||||
|             case G_IM_SIZ_8b:  aOutTexInfo->bitSize = 8; break; \ | ||||
|             case G_IM_SIZ_16b: aOutTexInfo->bitSize = 16; break; \ | ||||
|             case G_IM_SIZ_32b: aOutTexInfo->bitSize = 32; break; \ | ||||
|             default: return false; \ | ||||
|         } \ | ||||
|         aOutTexInfo->width   = _Data->mRawWidth; \ | ||||
|         aOutTexInfo->height  = _Data->mRawHeight; \ | ||||
|         aOutTexInfo->texture = _Data->mRawData.begin(); \ | ||||
|         aOutTexInfo->name    = aTexName; \ | ||||
|     } | ||||
| #define CONVERT_TEXINFO(texName) { \ | ||||
|     /* translate bit size */ \ | ||||
|     switch (_Data->mRawSize) { \ | ||||
|         case G_IM_SIZ_8b:  aOutTexInfo->bitSize = 8; break; \ | ||||
|         case G_IM_SIZ_16b: aOutTexInfo->bitSize = 16; break; \ | ||||
|         case G_IM_SIZ_32b: aOutTexInfo->bitSize = 32; break; \ | ||||
|         default: return false; \ | ||||
|     } \ | ||||
|     aOutTexInfo->width   = _Data->mRawWidth; \ | ||||
|     aOutTexInfo->height  = _Data->mRawHeight; \ | ||||
|     aOutTexInfo->texture = _Data->mRawData.begin(); \ | ||||
|     aOutTexInfo->name    = texName; \ | ||||
| } | ||||
| 
 | ||||
|     auto& _DynosCustomTexs = DynosCustomTexs(); | ||||
| bool DynOS_Tex_Get(const char* aTexName, struct TextureInfo* aOutTexInfo) { | ||||
| 
 | ||||
|     // check custom textures
 | ||||
|     auto& _DynosCustomTexs = DynosCustomTexs(); | ||||
|     for (s32 i = 0; i < _DynosCustomTexs.Count(); ++i) { | ||||
|         if (!strcmp(_DynosCustomTexs[i].first, aTexName)) { | ||||
|             auto& _Data = _DynosCustomTexs[i].second->mData; | ||||
|  | @ -483,7 +483,7 @@ bool DynOS_Tex_Get(const char* aTexName, struct TextureInfo* aOutTexInfo) { | |||
|                 free(_RawData); | ||||
|             } | ||||
| 
 | ||||
|             CONVERT_TEXINFO(); | ||||
|             CONVERT_TEXINFO(aTexName); | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
|  | @ -494,7 +494,7 @@ bool DynOS_Tex_Get(const char* aTexName, struct TextureInfo* aOutTexInfo) { | |||
|         for (DataNode<TexData>* _Node : DynosValidTextures()) { // check valid textures
 | ||||
|             if (_Node->mName == aTexName) { | ||||
|                 auto& _Data = _Node->mData; | ||||
|                 CONVERT_TEXINFO(); | ||||
|                 CONVERT_TEXINFO(aTexName); | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|  | @ -508,6 +508,28 @@ bool DynOS_Tex_Get(const char* aTexName, struct TextureInfo* aOutTexInfo) { | |||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool DynOS_Tex_GetFromData(const Texture *aTex, struct TextureInfo* aOutTexInfo) { | ||||
|     DataNode<TexData> *node = DynOS_Tex_RetrieveNode((void *) aTex); | ||||
|     if (node) { | ||||
|         auto& _Data = node->mData; | ||||
|         CONVERT_TEXINFO(node->mName.begin()); | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     // check builtin textures
 | ||||
|     const struct BuiltinTexInfo* info = DynOS_Builtin_Tex_GetInfoFromData(aTex); | ||||
|     if (info) { | ||||
|         aOutTexInfo->bitSize = info->bitSize; | ||||
|         aOutTexInfo->width   = info->width; | ||||
|         aOutTexInfo->height  = info->height; | ||||
|         aOutTexInfo->texture = (u8*)info->pointer; | ||||
|         aOutTexInfo->name    = info->identifier; | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| static DataNode<TexData> *DynOS_Lua_Tex_RetrieveNode(const char* aName) { | ||||
|     auto& _DynosCustomTexs = DynosCustomTexs(); | ||||
|     for (s32 i = 0; i < _DynosCustomTexs.Count(); ++i) { | ||||
|  |  | |||
|  | @ -5105,6 +5105,30 @@ Gets the current GraphNodeHeldObject | |||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [get_texture_average_color](#get_texture_average_color) | ||||
| 
 | ||||
| ### Description | ||||
| Calculates the average color of a given texture. Returns true if success | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local booleanValue = get_texture_average_color(tex, out)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | tex | `Pointer` <`integer`> | | ||||
| | out | [Color](structs.md#Color) | | ||||
| 
 | ||||
| ### Returns | ||||
| - `boolean` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `bool get_texture_average_color(const u8 *tex, OUT Color out);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| --- | ||||
| # functions from smlua_model_utils.h | ||||
| 
 | ||||
|  |  | |||
|  | @ -1990,6 +1990,7 @@ | |||
|    - [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_held_object](functions-6.md#geo_get_current_held_object) | ||||
|    - [get_texture_average_color](functions-6.md#get_texture_average_color) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
|  |  | |||
|  | @ -33075,6 +33075,29 @@ int smlua_func_geo_get_current_held_object(UNUSED lua_State* L) { | |||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| int smlua_func_get_texture_average_color(lua_State* L) { | ||||
|     if (L == NULL) { return 0; } | ||||
| 
 | ||||
|     int top = lua_gettop(L); | ||||
|     if (top != 2) { | ||||
|         LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "get_texture_average_color", 2, top); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     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; } | ||||
| 
 | ||||
|     Color out; | ||||
|     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; | ||||
| } | ||||
| 
 | ||||
|   /////////////////////////
 | ||||
|  // smlua_model_utils.h //
 | ||||
| /////////////////////////
 | ||||
|  | @ -36957,6 +36980,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_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, "get_texture_average_color", smlua_func_get_texture_average_color); | ||||
| 
 | ||||
|     // smlua_model_utils.h
 | ||||
|     smlua_bind_function(L, "smlua_model_util_get_id", smlua_func_smlua_model_util_get_id); | ||||
|  |  | |||
|  | @ -584,4 +584,26 @@ struct GraphNodeCamera* geo_get_current_camera(void) { | |||
| 
 | ||||
| struct GraphNodeHeldObject* geo_get_current_held_object(void) { | ||||
|     return gCurGraphNodeHeldObject; | ||||
| } | ||||
| } | ||||
| 
 | ||||
| bool get_texture_average_color(const u8 *tex, OUT Color out) { | ||||
|     struct TextureInfo texInfo; | ||||
|     if (!tex) { return false; } | ||||
|     if (!dynos_texture_get_from_data(tex, &texInfo)) { return false; } | ||||
|     u32 w = texInfo.width; | ||||
|     u32 h = texInfo.height; | ||||
|     u32 texSize = w * h; | ||||
|     const u8 *data = texInfo.texture; | ||||
|     u32 r = 0; | ||||
|     u32 g = 0; | ||||
|     u32 b = 0; | ||||
|     for (u32 i = 0; i < texSize; i++) { | ||||
|         r += data[4 * i + 0]; | ||||
|         g += data[4 * i + 1]; | ||||
|         b += data[4 * i + 2]; | ||||
|     } | ||||
|     out[0] = r / texSize; | ||||
|     out[1] = g / texSize; | ||||
|     out[2] = b / texSize; | ||||
|     return true; | ||||
| } | ||||
|  |  | |||
|  | @ -231,4 +231,7 @@ struct GraphNodeCamera* geo_get_current_camera(void); | |||
| /* |description|Gets the current GraphNodeHeldObject|descriptionEnd|*/ | ||||
| struct GraphNodeHeldObject* geo_get_current_held_object(void); | ||||
| 
 | ||||
| /* |description|Calculates the average color of a given texture. Returns true if success|descriptionEnd|*/ | ||||
| bool get_texture_average_color(const u8 *tex, OUT Color out); | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Isaac0-dev
						Isaac0-dev