Skip to content

Commit b25b86a

Browse files
committed
make animated textures work with icons
1 parent 1c48cc8 commit b25b86a

File tree

2 files changed

+44
-16
lines changed

2 files changed

+44
-16
lines changed

data/cage/shaders/engine/icon.glsl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,16 @@ layout(early_fragment_tests) in;
1919

2020
void main()
2121
{
22+
#ifdef Animated
23+
vec4 albedo = sampleTextureAnimation(texMaterialAlbedoArray, varUv.xy, uniMeshes[varInstanceId].animation, uniMaterial.animation);
24+
#else
2225
vec4 albedo = texture(texMaterialAlbedo2d, varUv.xy);
26+
#endif
27+
2328
#ifdef CutOut
2429
if (albedo.w < 0.5)
2530
discard;
2631
#endif // CutOut
32+
2733
outColor = albedo;
2834
}

sources/libengine/graphics/renderPipeline.cpp

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)