@@ -293,17 +293,17 @@ namespace cage
293293 prevTransformComponent = camera->prevTransformComponent ;
294294 }
295295
296- Mat4 modelTransform (Entity *e) const
296+ Transform modelTransform (Entity *e) const
297297 {
298298 CAGE_ASSERT (e->has (transformComponent));
299299 if (e->has (prevTransformComponent))
300300 {
301301 const Transform c = e->value <TransformComponent>(transformComponent);
302302 const Transform p = e->value <TransformComponent>(prevTransformComponent);
303- return Mat4 ( interpolate (p, c, interpolationFactor) );
303+ return interpolate (p, c, interpolationFactor);
304304 }
305305 else
306- return Mat4 ( e->value <TransformComponent>(transformComponent) );
306+ return e->value <TransformComponent>(transformComponent);
307307 }
308308
309309 UniMesh makeMeshUni (const RenderData &rd) const
@@ -950,7 +950,7 @@ namespace cage
950950 CAGE_ASSERT (ri.mesh ->bones == 0 );
951951 RenderData rd;
952952 rd.e = e;
953- rd.model = modelTransform (e);
953+ rd.model = Mat4 ( modelTransform (e) );
954954 rd.color = initializeColor (e->getOrDefault <ColorComponent>());
955955 const uint64 startTime = rd.e ->getOrDefault <SpawnTimeComponent>().spawnTime ;
956956 rd.animation = Vec4 ((double )(sint64)(currentTime - startTime) / (double )1'000'000 , 1 , 0 , 0 );
@@ -981,7 +981,7 @@ namespace cage
981981 return ;
982982 RenderData rd;
983983 rd.e = e;
984- rd.model = modelTransform (e) * Mat4 (Vec3 (rt.layout .size * Vec2 (-0.5 , 0.5 ), 0 ));
984+ rd.model = Mat4 ( modelTransform (e) ) * Mat4 (Vec3 (rt.layout .size * Vec2 (-0.5 , 0.5 ), 0 ));
985985 rd.color = initializeColor (e->getOrDefault <ColorComponent>());
986986 rd.renderLayer = tc.renderLayer ;
987987 rd.translucent = true ;
@@ -1012,7 +1012,7 @@ namespace cage
10121012 return ;
10131013 RenderData rd;
10141014 rd.e = e;
1015- rd.model = modelTransform (e);
1015+ rd.model = Mat4 ( modelTransform (e) );
10161016 if (Holder<RenderObject> obj = assets->get <AssetSchemeIndexRenderObject, RenderObject>(rc.model ))
10171017 {
10181018 prepareObject (rd, std::move (obj));
@@ -1091,7 +1091,7 @@ namespace cage
10911091 return ;
10921092 if (e->has <ShadowmapComponent>())
10931093 return ;
1094- UniLight uni = initializeLightUni (modelTransform (e), lc, e->getOrDefault <ColorComponent>(), transform.position );
1094+ UniLight uni = initializeLightUni (Mat4 ( modelTransform (e) ), lc, e->getOrDefault <ColorComponent>(), transform.position );
10951095 if (lc.lightType == LightTypeEnum::Point && !intersects (Sphere (Vec3 (uni.position ), lc.maxDistance ), frustum))
10961096 return ;
10971097 lights.push_back (uni);
@@ -1455,7 +1455,17 @@ namespace cage
14551455 shadowmap.lightComponent = lc;
14561456 shadowmap.shadowmapComponent = sc;
14571457 data->resolution = Vec2i (sc.resolution );
1458- data->model = modelTransform (e);
1458+
1459+ { // quantize light direction - reduces shimmering of slowly rotating lights
1460+ Transform src = modelTransform (e);
1461+ Vec3 f = src.orientation * Vec3 (0 , 0 , -1 );
1462+ f *= 300 ;
1463+ for (uint32 i = 0 ; i < 3 ; i++)
1464+ f[i] = round (f[i]);
1465+ f = normalize (f);
1466+ src.orientation = Quat (f, src.orientation * Vec3 (0 , 1 , 0 ));
1467+ data->model = Mat4 (src);
1468+ }
14591469
14601470 {
14611471 UniShadowedLight &uni = shadowmap.shadowUni ;
0 commit comments