@@ -107,7 +107,6 @@ namespace cage
107107		{
108108			Holder<SkeletalAnimationPreparatorInstance> skeletalAnimation;
109109			Holder<Model> mesh;
110- 			Vec4 animation = Vec4::Nan(); //  time (seconds), speed, offset (normalized), unused
111110		};
112111
113112		struct  RenderIcon  : private  Noncopyable 
@@ -129,6 +128,7 @@ namespace cage
129128			std::variant<std::monostate, RenderModel, RenderIcon, RenderText> data;
130129			Mat4 model;
131130			Vec4 color = Vec4::Nan(); //  linear rgb (NOT alpha-premultiplied), opacity
131+ 			Vec4 animation = Vec4::Nan(); //  time (seconds), speed, offset (normalized), unused
132132			Entity *e = nullptr ;
133133			sint32 renderLayer = 0 ;
134134			bool  translucent = false ; //  transparent or fade
@@ -208,7 +208,7 @@ namespace cage
208208			Holder<ShaderProgram> shaderBlitPixels;
209209			Holder<ShaderProgram> shaderDepth, shaderDepthCutOut;
210210			Holder<ShaderProgram> shaderStandard, shaderStandardCutOut;
211- 			Holder<ShaderProgram> shaderIcon, shaderIconCutOut;
211+ 			Holder<ShaderProgram> shaderIcon, shaderIconCutOut, shaderIconAnimated, shaderIconCutOutAnimated ;
212212			Holder<ShaderProgram> shaderText;
213213
214214			Holder<SkeletalAnimationPreparatorCollection> skeletonPreparatorCollection;
@@ -255,6 +255,8 @@ namespace cage
255255				CAGE_ASSERT (icon);
256256				shaderIcon = icon->get (0 );
257257				shaderIconCutOut = icon->get (HashString (" CutOut"  ));
258+ 				shaderIconAnimated = icon->get (HashString (" Animated"  ));
259+ 				shaderIconCutOutAnimated = icon->get (HashString (" CutOut"  ) + HashString (" Animated"  ));
258260
259261				shaderText = assets->get <AssetSchemeIndexShaderProgram, MultiShaderProgram>(HashString (" cage/shaders/engine/text.glsl"  ))->get (0 );
260262				CAGE_ASSERT (shaderText);
@@ -281,6 +283,8 @@ namespace cage
281283				SHARE (shaderStandardCutOut);
282284				SHARE (shaderIcon);
283285				SHARE (shaderIconCutOut);
286+ 				SHARE (shaderIconAnimated);
287+ 				SHARE (shaderIconCutOutAnimated);
284288				SHARE (shaderText);
285289				SHARE (skeletonPreparatorCollection);
286290#undef  SHARE
@@ -304,12 +308,10 @@ namespace cage
304308
305309			UniMesh makeMeshUni (const  RenderData &rd) const 
306310			{
307- 				CAGE_ASSERT (std::holds_alternative<RenderModel>(rd.data ));
308- 				const  RenderModel &rm = std::get<RenderModel>(rd.data );
309311				UniMesh uni;
310312				uni.modelMat  = Mat3x4 (rd.model );
311313				uni.color  = rd.color ;
312- 				uni.animation  = rm .animation ;
314+ 				uni.animation  = rd .animation ;
313315				return  uni;
314316			}
315317
@@ -625,10 +627,20 @@ namespace cage
625627					}
626628					else 
627629					{
628- 						if  (any (mesh->flags  & MeshRenderFlags::CutOut))
629- 							return  shaderIconCutOut.share ();
630+ 						if  (texture->target () == GL_TEXTURE_2D_ARRAY)
631+ 						{
632+ 							if  (any (mesh->flags  & MeshRenderFlags::CutOut))
633+ 								return  shaderIconCutOutAnimated.share ();
634+ 							else 
635+ 								return  shaderIconAnimated.share ();
636+ 						}
630637						else 
631- 							return  shaderIcon.share ();
638+ 						{
639+ 							if  (any (mesh->flags  & MeshRenderFlags::CutOut))
640+ 								return  shaderIconCutOut.share ();
641+ 							else 
642+ 								return  shaderIcon.share ();
643+ 						}
632644					}
633645				}();
634646				renderQueue->bind (shader);
@@ -641,7 +653,18 @@ namespace cage
641653				if  (rd.translucent )
642654					renderQueue->blendFuncAlphaTransparency ();
643655
644- 				renderQueue->bind (texture, CAGE_SHADER_TEXTURE_ALBEDO);
656+ 				switch  (texture->target ())
657+ 				{
658+ 					case  GL_TEXTURE_2D_ARRAY:
659+ 						renderQueue->bind (texture, CAGE_SHADER_TEXTURE_ALBEDO_ARRAY);
660+ 						break ;
661+ 					case  GL_TEXTURE_CUBE_MAP:
662+ 						renderQueue->bind (texture, CAGE_SHADER_TEXTURE_ALBEDO_CUBE);
663+ 						break ;
664+ 					default :
665+ 						renderQueue->bind (texture, CAGE_SHADER_TEXTURE_ALBEDO);
666+ 						break ;
667+ 				}
645668
646669				//  separate instances into draw calls by the limit
647670				const  uint32 limit = CAGE_SHADER_MAX_MESHES;
@@ -660,10 +683,7 @@ namespace cage
660683						CAGE_ASSERT (std::holds_alternative<RenderIcon>(inst.data ));
661684						CAGE_ASSERT (+std::get<RenderIcon>(inst.data ).mesh  == +mesh);
662685						CAGE_ASSERT (+std::get<RenderIcon>(inst.data ).texture  == +texture);
663- 						UniMesh uni;
664- 						uni.modelMat  = Mat3x4 (inst.model );
665- 						uni.color  = inst.color ;
666- 						uniMeshes.push_back (uni);
686+ 						uniMeshes.push_back (makeMeshUni (inst));
667687						appendShaderCustomData (inst.e , shader->customDataCount );
668688					}
669689
@@ -829,12 +849,10 @@ namespace cage
829849						ps->animation  = parent->skelAnimId ;
830850				}
831851
832- 				rd.color  = initializeColor (color);
833852				if  (!anim.speed .valid ())
834853					anim.speed  = 1 ;
835854				if  (!anim.offset .valid ())
836855					anim.offset  = 0 ;
837- 				rm.animation  = Vec4 ((double )(sint64)(currentTime - startTime) / (double )1'000'000 , anim.speed , anim.offset , 0 );
838856
839857				if  (!rm.mesh ->bones )
840858					ps.reset ();
@@ -850,6 +868,8 @@ namespace cage
850868						ps.reset ();
851869				}
852870
871+ 				rd.color  = initializeColor (color);
872+ 				rd.animation  = Vec4 ((double )(sint64)(currentTime - startTime) / (double )1'000'000 , anim.speed , anim.offset , 0 );
853873				rd.renderLayer  = render.renderLayer  + rm.mesh ->layer ;
854874				rd.translucent  = any (rm.mesh ->flags  & (MeshRenderFlags::Transparent | MeshRenderFlags::Fade)) || rd.color [3 ] < 1 ;
855875				if  (rd.translucent )
@@ -932,7 +952,9 @@ namespace cage
932952				rd.e  = e;
933953				rd.model  = modelTransform (e);
934954				rd.color  = initializeColor (e->getOrDefault <ColorComponent>());
935- 				rd.renderLayer  = ic.renderLayer ;
955+ 				const  uint64 startTime = rd.e ->getOrDefault <SpawnTimeComponent>().spawnTime ;
956+ 				rd.animation  = Vec4 ((double )(sint64)(currentTime - startTime) / (double )1'000'000 , 1 , 0 , 0 );
957+ 				rd.renderLayer  = ic.renderLayer  + ri.mesh ->layer ;
936958				rd.translucent  = true ;
937959				rd.depth  = (viewProj * (rd.model  * Vec4 (0 , 0 , 0 , 1 )))[2 ] * -1 ;
938960				rd.data  = std::move (ri);
0 commit comments