From 898ae65e2f25f08977014c51942dacbff0f8cefc Mon Sep 17 00:00:00 2001 From: Panagiotis Christopoulos Charitos Date: Sat, 20 Jul 2024 15:19:01 +0200 Subject: [PATCH] Move GpuSceneParticleEmitter to its own array --- AnKi/Renderer/Utils/Drawer.cpp | 1 + AnKi/Renderer/Utils/GpuVisibility.cpp | 2 +- AnKi/Scene/Components/ModelComponent.cpp | 1 + .../Components/ParticleEmitterComponent.cpp | 4 +- AnKi/Scene/GpuSceneArray.h | 13 +++ AnKi/Shaders/ForwardShadingParticles.ankiprog | 8 +- AnKi/Shaders/GBufferGeneric.ankiprog | 8 +- AnKi/Shaders/GBufferGpuParticles.ankiprog | 2 +- AnKi/Shaders/GpuVisibility.ankiprog | 8 +- AnKi/Shaders/GpuVisibilityMeshlet.ankiprog | 4 +- AnKi/Shaders/Include/GpuSceneFunctions.h | 4 +- AnKi/Shaders/Include/GpuSceneTypes.h | 6 +- AnKi/Shaders/Include/MaterialTypes.h | 19 +-- AnKi/Shaders/MaterialShadersCommon.hlsl | 1 + .../Icosphere_834d64c142beaa13.ankimesh | Bin 2136 -> 2440 bytes Samples/PhysicsPlayground/Assets/Scene.lua | 108 +++++++++--------- .../Assets/Suzanne_e3526e1428c0763c.ankimesh | Bin 18480 -> 23788 bytes .../Assets/dynamic_f238b379a41079ff.ankimtl | 42 +++---- .../Assets/floor_71cbd2644e53ab8c.ankimesh | Bin 1224 -> 1400 bytes .../Assets/wall_87565b500719f7c4.ankimesh | Bin 1152 -> 1280 bytes .../Assets/walls.001_2469a4d42c8d129c.ankimtl | 44 +++---- .../Assets/walls_9619132fa258d22d.ankimtl | 44 +++---- 22 files changed, 155 insertions(+), 164 deletions(-) diff --git a/AnKi/Renderer/Utils/Drawer.cpp b/AnKi/Renderer/Utils/Drawer.cpp index 6525f21a4e..530bd619f4 100644 --- a/AnKi/Renderer/Utils/Drawer.cpp +++ b/AnKi/Renderer/Utils/Drawer.cpp @@ -70,6 +70,7 @@ void RenderableDrawer::setState(const RenderableDrawerArguments& args, CommandBu cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_RENDERABLES), GpuSceneArrays::Renderable::getSingleton().getBufferView()); cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_MESH_LODS), GpuSceneArrays::MeshLod::getSingleton().getBufferView()); cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_TRANSFORMS), GpuSceneArrays::Transform::getSingleton().getBufferView()); + cmdb.bindStorageBuffer(ANKI_REG(ANKI_MATERIAL_REGISTER_PARTICLE_EMITTERS), GpuSceneArrays::ParticleEmitter::getSingleton().getBufferViewSafe()); cmdb.bindTexture(ANKI_REG(ANKI_MATERIAL_REGISTER_HZB_TEXTURE), (args.m_hzbTexture.isValid()) ? args.m_hzbTexture : TextureView(&getRenderer().getDummyTexture2d(), TextureSubresourceDesc::all())); diff --git a/AnKi/Renderer/Utils/GpuVisibility.cpp b/AnKi/Renderer/Utils/GpuVisibility.cpp index 205e665c77..91a3eb4faf 100644 --- a/AnKi/Renderer/Utils/GpuVisibility.cpp +++ b/AnKi/Renderer/Utils/GpuVisibility.cpp @@ -425,7 +425,7 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib cmdb.bindStorageBuffer(ANKI_REG(t1), GpuSceneArrays::Renderable::getSingleton().getBufferView()); cmdb.bindStorageBuffer(ANKI_REG(t2), GpuSceneArrays::MeshLod::getSingleton().getBufferView()); cmdb.bindStorageBuffer(ANKI_REG(t3), GpuSceneArrays::Transform::getSingleton().getBufferView()); - cmdb.bindStorageBuffer(ANKI_REG(t4), GpuSceneBuffer::getSingleton().getBufferView()); + cmdb.bindStorageBuffer(ANKI_REG(t4), GpuSceneArrays::ParticleEmitter::getSingleton().getBufferViewSafe()); if(gatherType & 1u) { cmdb.bindStorageBuffer(ANKI_REG(u0), out.m_legacy.m_renderableInstancesBuffer); diff --git a/AnKi/Scene/Components/ModelComponent.cpp b/AnKi/Scene/Components/ModelComponent.cpp index 39b9653518..10265ff2f8 100644 --- a/AnKi/Scene/Components/ModelComponent.cpp +++ b/AnKi/Scene/Components/ModelComponent.cpp @@ -209,6 +209,7 @@ Error ModelComponent::update(SceneComponentUpdateInfo& info, Bool& updated) gpuRenderable.m_uniformsOffset = m_patchInfos[i].m_gpuSceneUniformsOffset; gpuRenderable.m_meshLodsIndex = m_patchInfos[i].m_gpuSceneMeshLods.getIndex() * kMaxLodCount; gpuRenderable.m_boneTransformsOffset = (hasSkin) ? m_skinComponent->getBoneTransformsGpuSceneOffset() : 0; + gpuRenderable.m_particleEmitterIndex = kMaxU32; if(!!(mtl.getRenderingTechniques() & RenderingTechniqueBit::kRtShadow)) { const RenderingKey key(RenderingTechnique::kRtShadow, 0, false, false, false); diff --git a/AnKi/Scene/Components/ParticleEmitterComponent.cpp b/AnKi/Scene/Components/ParticleEmitterComponent.cpp index c759701c06..f833756f80 100644 --- a/AnKi/Scene/Components/ParticleEmitterComponent.cpp +++ b/AnKi/Scene/Components/ParticleEmitterComponent.cpp @@ -396,11 +396,11 @@ Error ParticleEmitterComponent::update(SceneComponentUpdateInfo& info, Bool& upd m_gpuSceneMeshLods.uploadToGpuScene(meshLods); // Upload the GpuSceneRenderable - GpuSceneRenderable renderable; + GpuSceneRenderable renderable = {}; renderable.m_boneTransformsOffset = 0; renderable.m_uniformsOffset = m_gpuSceneUniforms.getOffset(); renderable.m_meshLodsIndex = m_gpuSceneMeshLods.getIndex() * kMaxLodCount; - renderable.m_particleEmitterOffset = m_gpuSceneParticleEmitter.getGpuSceneOffset(); + renderable.m_particleEmitterIndex = m_gpuSceneParticleEmitter.getIndex(); renderable.m_worldTransformsIndex = 0; renderable.m_uuid = SceneGraph::getSingleton().getNewUuid(); if(!m_gpuSceneRenderable.isValid()) diff --git a/AnKi/Scene/GpuSceneArray.h b/AnKi/Scene/GpuSceneArray.h index 57fb1dcc14..4d91673c6b 100644 --- a/AnKi/Scene/GpuSceneArray.h +++ b/AnKi/Scene/GpuSceneArray.h @@ -127,6 +127,19 @@ class GpuSceneArray : public MakeSingleton> return {&GpuSceneBuffer::getSingleton().getBuffer(), getGpuSceneOffsetOfArrayBase(), getBufferRange()}; } + /// @note Thread-safe + BufferView getBufferViewSafe() const + { + PtrSize range = getBufferRange(); + if(range == 0) + { + // Just set something + range = getElementSize(); + } + + return {&GpuSceneBuffer::getSingleton().getBuffer(), getGpuSceneOffsetOfArrayBase(), range}; + } + /// Some bookeeping. Needs to be called once per frame. /// @note Thread-safe void flush() diff --git a/AnKi/Shaders/ForwardShadingParticles.ankiprog b/AnKi/Shaders/ForwardShadingParticles.ankiprog index 7037fcfe30..83bc0b63a1 100644 --- a/AnKi/Shaders/ForwardShadingParticles.ankiprog +++ b/AnKi/Shaders/ForwardShadingParticles.ankiprog @@ -34,9 +34,9 @@ struct VertOut VertOut main(VertIn input) { - const GpuSceneRenderableInstance renderable = unpackGpuSceneRenderableVertex(input.m_gpuSceneRenderable); - const GpuSceneParticleEmitter particles = g_gpuScene.Load(renderable.m_boneTransformsOrParticleEmitterOffset); - const GpuSceneMeshLod meshLod = g_meshLods[renderable.m_meshLodIndex]; + const GpuSceneRenderableInstance instance = unpackGpuSceneRenderableVertex(input.m_gpuSceneRenderable); + const GpuSceneParticleEmitter particles = g_particleEmitters[instance.m_boneTransformsOffsetOrParticleEmitterIndex]; + const GpuSceneMeshLod meshLod = g_meshLods[instance.m_meshLodIndex]; const U32 particleId = input.m_svVertexId / meshLod.m_indexCount; const U32 vertexId = g_unifiedGeom_R16_Uint[meshLod.m_firstIndex + input.m_svVertexId % meshLod.m_indexCount]; @@ -62,7 +62,7 @@ VertOut main(VertIn input) output.m_svPosition = mul(g_globalUniforms.m_viewProjectionMatrix, Vec4(output.m_worldPos, 1.0)); output.m_alpha = particleAlpha; - output.m_uniformsOffset = renderable.m_uniformsOffset; + output.m_uniformsOffset = instance.m_uniformsOffset; return output; } diff --git a/AnKi/Shaders/GBufferGeneric.ankiprog b/AnKi/Shaders/GBufferGeneric.ankiprog index dce1aa7201..d60a96d04a 100644 --- a/AnKi/Shaders/GBufferGeneric.ankiprog +++ b/AnKi/Shaders/GBufferGeneric.ankiprog @@ -265,7 +265,7 @@ VertOut main(VertIn input) const U32 uniformsOffset = instance.m_uniformsOffset; const U32 worldTransformsIndex = instance.m_worldTransformsIndex_25bit_meshletPrimitiveCount_7bit >> 7u; - const U32 boneTransformsOrParticleEmitterOffset = instance.m_boneTransformsOrParticleEmitterOffset; + const U32 boneTransformsOffset = instance.m_boneTransformsOffsetOrParticleEmitterIndex; # if VISUALIZE_MESHLETS output.m_meshletIndex = instance.m_meshletGeometryDescriptorIndex; @@ -278,9 +278,9 @@ VertOut main(VertIn input) const U32 uniformsOffset = instance.m_uniformsOffset; const U32 worldTransformsIndex = instance.m_worldTransformsIndex; - const U32 boneTransformsOrParticleEmitterOffset = instance.m_boneTransformsOrParticleEmitterOffset; + const U32 boneTransformsOffset = instance.m_boneTransformsOffsetOrParticleEmitterIndex; # endif // SW_MESHLETS - ANKI_MAYBE_UNUSED(boneTransformsOrParticleEmitterOffset); + ANKI_MAYBE_UNUSED(boneTransformsOffset); const Mat3x4 worldTransform = g_transforms[worldTransformsIndex]; const Mat3x4 prevWorldTransform = g_transforms[worldTransformsIndex + 1u]; @@ -295,7 +295,7 @@ VertOut main(VertIn input) // Do stuff # if ANKI_BONES - skinning(vert, boneTransformsOrParticleEmitterOffset, vert.m_position, prevPos, vert.m_normal); + skinning(vert, boneTransformsOffset, vert.m_position, prevPos, vert.m_normal); # endif const Vec3 worldPos = mul(worldTransform, Vec4(vert.m_position, 1.0)); diff --git a/AnKi/Shaders/GBufferGpuParticles.ankiprog b/AnKi/Shaders/GBufferGpuParticles.ankiprog index 5ede1ec8b4..14db0fceb8 100644 --- a/AnKi/Shaders/GBufferGpuParticles.ankiprog +++ b/AnKi/Shaders/GBufferGpuParticles.ankiprog @@ -43,7 +43,7 @@ VertOut main(VertIn input) VertOut output; const GpuSceneRenderableInstance renderable = unpackGpuSceneRenderableVertex(input.m_gpuSceneRenderable); - const GpuSceneParticleEmitter particles = g_gpuScene.Load(renderable.m_boneTransformsOrParticleEmitterOffset); + const GpuSceneParticleEmitter particles = g_particleEmitters[renderable.m_boneTransformsOffsetOrParticleEmitterIndex]; // Read vertex const U32 particleId = input.m_svVertexId; diff --git a/AnKi/Shaders/GpuVisibility.ankiprog b/AnKi/Shaders/GpuVisibility.ankiprog index a793990408..e74adf06e0 100644 --- a/AnKi/Shaders/GpuVisibility.ankiprog +++ b/AnKi/Shaders/GpuVisibility.ankiprog @@ -35,7 +35,7 @@ StructuredBuffer g_renderableBoundingVolumes : StructuredBuffer g_renderables : register(t1); StructuredBuffer g_meshLods : register(t2); StructuredBuffer g_transforms : register(t3); -ByteAddressBuffer g_gpuScene : register(t4); +StructuredBuffer g_particleEmitters : register(t4); #if GATHER_MDI // These 3 have the same size @@ -162,7 +162,7 @@ RWStructuredBuffer g_hash : register(u7); const U32 meshLodIndex = renderable.m_meshLodsIndex + lod; const GpuSceneMeshLod meshLod = g_meshLods[meshLodIndex]; - const Bool isParticleEmitter = renderable.m_particleEmitterOffset != 0; + const Bool isParticleEmitter = renderable.m_particleEmitterIndex < kMaxU32; ANKI_MAYBE_UNUSED(isParticleEmitter); const Bool usesMeshShaders = meshLod.m_meshletCount != 0u; @@ -238,7 +238,7 @@ RWStructuredBuffer g_hash : register(u7); } else { - const GpuSceneParticleEmitter emitter = g_gpuScene.Load(renderable.m_particleEmitterOffset); + const GpuSceneParticleEmitter emitter = g_particleEmitters[renderable.m_particleEmitterIndex]; DrawIndirectArgsWithPadding indirect; indirect.m_vertexCount = emitter.m_aliveParticleCount * meshLod.m_indexCount; @@ -252,7 +252,7 @@ RWStructuredBuffer g_hash : register(u7); instanceVertex.x = renderable.m_worldTransformsIndex; instanceVertex.y = renderable.m_uniformsOffset; instanceVertex.z = meshLodIndex; - instanceVertex.w = renderable.m_particleEmitterOffset; + instanceVertex.w = renderable.m_particleEmitterIndex; g_instanceRateRenderables[indirectIdx] = instanceVertex; } } diff --git a/AnKi/Shaders/GpuVisibilityMeshlet.ankiprog b/AnKi/Shaders/GpuVisibilityMeshlet.ankiprog index 4d5e299357..cbcfd6b0e9 100644 --- a/AnKi/Shaders/GpuVisibilityMeshlet.ankiprog +++ b/AnKi/Shaders/GpuVisibilityMeshlet.ankiprog @@ -125,8 +125,8 @@ ANKI_PUSH_CONSTANTS(Consts, g_unis) instance.m_worldTransformsIndex_25bit_meshletPrimitiveCount_7bit = renderable.m_worldTransformsIndex << 7u; instance.m_worldTransformsIndex_25bit_meshletPrimitiveCount_7bit |= meshletBoundingVol.m_primitiveCount; instance.m_uniformsOffset = renderable.m_uniformsOffset; - instance.m_boneTransformsOrParticleEmitterOffset = - (renderable.m_boneTransformsOffset) ? renderable.m_boneTransformsOffset : renderable.m_particleEmitterOffset; + instance.m_boneTransformsOffsetOrParticleEmitterIndex = + (renderable.m_boneTransformsOffset) ? renderable.m_boneTransformsOffset : renderable.m_particleEmitterIndex; g_meshletInstances[g_unis.m_firstMeshlet + instanceIdx] = instance; } diff --git a/AnKi/Shaders/Include/GpuSceneFunctions.h b/AnKi/Shaders/Include/GpuSceneFunctions.h index 66ad145f57..0d66aee443 100644 --- a/AnKi/Shaders/Include/GpuSceneFunctions.h +++ b/AnKi/Shaders/Include/GpuSceneFunctions.h @@ -15,7 +15,7 @@ inline GpuSceneRenderableInstance unpackGpuSceneRenderableVertex(UVec4 x) o.m_worldTransformsIndex = x[0]; o.m_uniformsOffset = x[1]; o.m_meshLodIndex = x[2]; - o.m_boneTransformsOrParticleEmitterOffset = x[3]; + o.m_boneTransformsOffsetOrParticleEmitterIndex = x[3]; return o; } @@ -25,7 +25,7 @@ inline GpuSceneMeshletInstance unpackGpuSceneMeshletInstance(UVec4 x) o.m_worldTransformsIndex_25bit_meshletPrimitiveCount_7bit = x[0]; o.m_uniformsOffset = x[1]; o.m_meshletGeometryDescriptorIndex = x[2]; - o.m_boneTransformsOrParticleEmitterOffset = x[3]; + o.m_boneTransformsOffsetOrParticleEmitterIndex = x[3]; return o; } diff --git a/AnKi/Shaders/Include/GpuSceneTypes.h b/AnKi/Shaders/Include/GpuSceneTypes.h index 6c42f92fda..23fbd54225 100644 --- a/AnKi/Shaders/Include/GpuSceneTypes.h +++ b/AnKi/Shaders/Include/GpuSceneTypes.h @@ -23,7 +23,7 @@ struct GpuSceneRenderable U32 m_uniformsOffset; U32 m_meshLodsIndex; ///< Points to the array of GpuSceneMeshLod. kMaxLodCount are reserved for each renderable. U32 m_boneTransformsOffset; ///< Array of Mat3x4 or 0 if its not a skin. - U32 m_particleEmitterOffset; ///< Offset to GpuSceneParticleEmitter or 0 if it's not an emitter. + U32 m_particleEmitterIndex; ///< Index to the GpuSceneParticleEmitter array or kMaxU32 if it's not an emitter. U32 m_rtShadowsShaderHandleIndex; ///< The index of the shader handle in the array of library's handles. U32 m_uuid; }; @@ -34,7 +34,7 @@ struct GpuSceneRenderableInstance U32 m_worldTransformsIndex; U32 m_uniformsOffset; U32 m_meshLodIndex; ///< Points to a single GpuSceneMeshLod in the mesh lods. - U32 m_boneTransformsOrParticleEmitterOffset; + U32 m_boneTransformsOffsetOrParticleEmitterIndex; }; static_assert(sizeof(GpuSceneRenderableInstance) == sizeof(UVec4)); @@ -51,7 +51,7 @@ struct GpuSceneMeshletInstance U32 m_worldTransformsIndex_25bit_meshletPrimitiveCount_7bit; U32 m_uniformsOffset; U32 m_meshletGeometryDescriptorIndex; ///< Index in the UGB. - U32 m_boneTransformsOrParticleEmitterOffset; + U32 m_boneTransformsOffsetOrParticleEmitterIndex; }; static_assert(kMaxPrimitivesPerMeshlet < ((1u << 7u) - 1)); diff --git a/AnKi/Shaders/Include/MaterialTypes.h b/AnKi/Shaders/Include/MaterialTypes.h index 8b8f19ddd6..511c2894d9 100644 --- a/AnKi/Shaders/Include/MaterialTypes.h +++ b/AnKi/Shaders/Include/MaterialTypes.h @@ -35,22 +35,23 @@ static_assert(sizeof(MaterialGlobalUniforms) == 16 * sizeof(Vec4)); #define ANKI_MATERIAL_REGISTER_MESHLET_GROUPS t3 #define ANKI_MATERIAL_REGISTER_RENDERABLES t4 #define ANKI_MATERIAL_REGISTER_MESH_LODS t5 -#define ANKI_MATERIAL_REGISTER_TRANSFORMS t6 -#define ANKI_MATERIAL_REGISTER_HZB_TEXTURE t7 +#define ANKI_MATERIAL_REGISTER_PARTICLE_EMITTERS t6 +#define ANKI_MATERIAL_REGISTER_TRANSFORMS t7 +#define ANKI_MATERIAL_REGISTER_HZB_TEXTURE t8 #define ANKI_MATERIAL_REGISTER_NEAREST_CLAMP_SAMPLER s1 // For FW shading: #define ANKI_MATERIAL_REGISTER_LINEAR_CLAMP_SAMPLER s2 #define ANKI_MATERIAL_REGISTER_SHADOW_SAMPLER s3 -#define ANKI_MATERIAL_REGISTER_SCENE_DEPTH t8 -#define ANKI_MATERIAL_REGISTER_LIGHT_VOLUME t9 +#define ANKI_MATERIAL_REGISTER_SCENE_DEPTH t9 +#define ANKI_MATERIAL_REGISTER_LIGHT_VOLUME t10 #define ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_UNIFORMS b1 -#define ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_POINT_LIGHTS t10 -#define ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_SPOT_LIGHTS t11 -#define ANKI_MATERIAL_REGISTER_SHADOW_ATLAS t12 -#define ANKI_MATERIAL_REGISTER_CLUSTERS t13 +#define ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_POINT_LIGHTS t11 +#define ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_SPOT_LIGHTS t12 +#define ANKI_MATERIAL_REGISTER_SHADOW_ATLAS t13 +#define ANKI_MATERIAL_REGISTER_CLUSTERS t14 // Always last because it's variable. Texture buffer bindings pointing to unified geom buffer: -#define ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START t14 +#define ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START t15 ANKI_END_NAMESPACE diff --git a/AnKi/Shaders/MaterialShadersCommon.hlsl b/AnKi/Shaders/MaterialShadersCommon.hlsl index 7680be9a28..45d6b1bad0 100644 --- a/AnKi/Shaders/MaterialShadersCommon.hlsl +++ b/AnKi/Shaders/MaterialShadersCommon.hlsl @@ -29,6 +29,7 @@ StructuredBuffer g_meshLods : register(ANKI_MATERIAL_REGISTER_M StructuredBuffer g_transforms : register(ANKI_MATERIAL_REGISTER_TRANSFORMS); Texture2D g_hzbTexture : register(ANKI_MATERIAL_REGISTER_HZB_TEXTURE); SamplerState g_nearestClampSampler : register(ANKI_MATERIAL_REGISTER_NEAREST_CLAMP_SAMPLER); +StructuredBuffer g_particleEmitters : register(ANKI_MATERIAL_REGISTER_PARTICLE_EMITTERS); // FW shading specific #if defined(FORWARD_SHADING) diff --git a/Samples/PhysicsPlayground/Assets/Icosphere_834d64c142beaa13.ankimesh b/Samples/PhysicsPlayground/Assets/Icosphere_834d64c142beaa13.ankimesh index cd2909d29c8bac4c669de8d84a6c8a808fe015fb..09592ecb89a3b0d61dc9ce25fa6a85dbff37cc45 100644 GIT binary patch literal 2440 zcmd^=du-EH6vt1uKKAIkXVVCP=YNh~z`(p*DjokQVeXQvtjTNDG!38Ae14agGtvLRNU$kcHSSf^UJe!p?^- zf-HtCrV_{!#I2B}$hAUdLNCFxLE15MCS)e;EZBBL%V3wmT0#!Q?64h>Ij|krb;5rH z(uV&pXUwWVqyl?o&(MHPIJZs;oVKzm}@m5?5)Mzx1( zuu~4{fv%4EweZTR7G4cLooH~+2+@c3OSIH4n`;=8I(-;<(3lT+yYI_9k|%xST$x+ukbdIF>*M`o-qPHK_aj=~ zgXGD*36IPt^>S~~@q5U;a^Ltp`tZqp6lNL)HTO;s{WRgH;W{t%(KLlaMAt)%{RoA; z(ltnzy_?A%-c0lc(WJiuxnXkD`B6WB+z2fVO=DG%Ka6*bp6e#OWcD+y_A&)7PbU1ic547m4jlo}(^=c|x(ia$pP2u!jd?XRMnD$Ij@#QpCZ}%Gu?A zlDE}A#VKV^uzz(XU%!>hzinE{KTER>XHQn5BH5ygF%qx|$?~oFI{F@tU+rbmc*ZPIJeRsQ>bdRgHy;s%H(e=t^ z>Q$X1?>9(&ci!a&>332SQk}+eb?e}}YU;~6-qicJl6k*=exEA+z{s{;?aKA+jJnhB zQ@e*8-2L~F2D!&j2dVX+=(w|^xIykA--`HeiTu7i4A<#_-w)~WuSWyoYw$ayO#~(^{72vJ| z)J+9*Q$gGu@YVs^=76^;(6tI|^?7!~&AIgYJ%@>%-un&SWeKLf*_FlCr8`;;?$&l%1tehqtF;M?sGd3cR~=lhYrucB;p zB#oc|An^l%2zO!wDagkPrV!i;BLu&a5O|{?0W=zVG=(BEio$$1Vemr905l5P0DlaP zg&l*4fyO}$z~SJAL5BfHzz;{4V0huck&toV2#SJ)1N#F-Ln43!fuf7@?m-G!8lregb?GBpx^k z+yv+Z;AHqolmeX$Ya%nm1dgBykR;#~APXcJI2Fi3X<#Hmn_-QxiMTP-^AIzTkCh8kt+3)-fF{FQp)Ihf(32?x#|oVa+vX(lx`?d%j1imm5Dk(At;)nb>=#J~awNWV`+=Ogn?wtL^4JSb5>?;xx}=U+$)DDr zdsz4nP9Y9n*TsU9Qa{k$+b{9jdRX9uCUv;CpD>Tt<@FLRD)QI`N0$_wl=`m8gZa`| z_<2DdyX4FC(l0Sl9hUyHZN2@1uY{t{lY5y1b@7)o)K_>Cm%P@T!TOakgMEz=L+_UU z5|_E8o4i-B>`U@xe%XV}FM0Al!B5})bPw`=$&)=vzo+{oO_bS?O1Byqwj0(%4mXjz zfoQMWLrLzHRN7%9C%!EwbyH)a~l2M*I9S#^|Bw%=)lMg+Dsql*x(vn(MGy0?hU>4{Bb?~*G8T8xK{f`Z_sf8 zHG0W~qq?-~AWo|;^vu;2NBw;KiZ-uaaLlfY-KT8eJ>FrsW`mCW+w?|j#ol|D%##vsyYi6h3F*Q#&&LsWSj3fHTDVufEOD_Za z>6V#i_3>$+>$92L^*Iuasx1E!9i8tni>REL+a~H%;n9%Wf{~F37#oWaYF^ENbnXd|tS* zPL+L=&!^md>Srq8OHLE>t{1rf*dZ01{31Jw$8ee>i`V4L;9K`2__r1Fx$as#yS}yX zo+uOBcimU#dLp^3t3@q89l}>){kZ7fU&_^*!PmWB^~-=#!J9u*(zpHlJ8I3=gQ}#f zPp$qqh^=={s0)|Pe1Gews_SSruc)4?Z9fqE`Pi` zSN3C{b3{FOv{oJRYfvSj?W%d-Vr4Q^tCBrCa^>CSkv+Mx2h+xRD(%%?)m%hs@z()d KQk0M@`}`X#8Wsxx diff --git a/Samples/PhysicsPlayground/Assets/Scene.lua b/Samples/PhysicsPlayground/Assets/Scene.lua index 8242450173..b176f4cd69 100644 --- a/Samples/PhysicsPlayground/Assets/Scene.lua +++ b/Samples/PhysicsPlayground/Assets/Scene.lua @@ -1,4 +1,4 @@ --- Generated by: C:\src\anki\out\build\x64-Debug\Bin\GltfImporter.exe PhysicsPlayground.gltf C:/src/anki/Samples/PhysicsPlayground/Assets/ -rpath Assets -texrpath Assets -v +-- Generated by: C:\src\anki\out\build\x64-Debug\Binaries\GltfImporter.exe PhysicsPlayground.gltf C:/src/anki/Samples/PhysicsPlayground/Assets/ -rpath Assets -texrpath Assets -v local scene = getSceneGraph() local events = getEventManager() @@ -9,7 +9,7 @@ trf:setOrigin(Vec4.new(25.411236, 3.345554, 28.742823, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.912920) +trf:setScale(Vec4.new(1.912920, 1.912920, 1.912920, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -22,7 +22,7 @@ trf:setOrigin(Vec4.new(25.411236, 3.316930, 22.637743, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.264235) +trf:setScale(Vec4.new(1.264235, 1.264235, 1.264235, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -35,7 +35,7 @@ trf:setOrigin(Vec4.new(30.798492, 2.376611, -6.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -48,7 +48,7 @@ trf:setOrigin(Vec4.new(29.798492, 1.376611, -6.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -61,7 +61,7 @@ trf:setOrigin(Vec4.new(28.798492, 0.376611, -6.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -74,7 +74,7 @@ trf:setOrigin(Vec4.new(31.798492, 3.376611, -6.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -87,7 +87,7 @@ trf:setOrigin(Vec4.new(32.798492, 4.376611, -6.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -100,7 +100,7 @@ trf:setOrigin(Vec4.new(33.798492, 5.376611, -6.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -113,7 +113,7 @@ trf:setOrigin(Vec4.new(39.798492, 6.376611, 0.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -126,7 +126,7 @@ trf:setOrigin(Vec4.new(39.798492, 6.376611, -6.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -139,7 +139,7 @@ trf:setOrigin(Vec4.new(39.798492, 6.376611, 6.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -152,7 +152,7 @@ trf:setOrigin(Vec4.new(39.798492, 6.376611, 12.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -165,7 +165,7 @@ trf:setOrigin(Vec4.new(42.271385, 2.886189, 0.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -178,7 +178,7 @@ trf:setOrigin(Vec4.new(42.271385, 2.886189, -6.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -191,7 +191,7 @@ trf:setOrigin(Vec4.new(42.271385, 2.886189, 6.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -204,7 +204,7 @@ trf:setOrigin(Vec4.new(42.271385, 2.886189, 12.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -217,7 +217,7 @@ trf:setOrigin(Vec4.new(37.271385, 2.886189, 12.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -230,7 +230,7 @@ trf:setOrigin(Vec4.new(37.271385, 2.886189, 6.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -243,7 +243,7 @@ trf:setOrigin(Vec4.new(37.271385, 2.886189, -6.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -256,7 +256,7 @@ trf:setOrigin(Vec4.new(37.271385, 2.886189, 0.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -269,7 +269,7 @@ trf:setOrigin(Vec4.new(179.044937, 9.701135, 0.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -282,7 +282,7 @@ trf:setOrigin(Vec4.new(0.000000, -5.068616, 0.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -298,7 +298,7 @@ trf:setOrigin(Vec4.new(4.076245, 74.444725, -1.005454, 0)) rot = Mat3x4.new() rot:setAll(0.649201, -0.658183, -0.381226, 0.000000, 0.506372, 0.000000, 0.862315, 0.000000, -0.567562, -0.752858, 0.333286, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) node = scene:newSceneNode("Camera_Orientation") @@ -310,7 +310,7 @@ trf:setOrigin(Vec4.new(7.481132, 7.870111, 6.507640, 0)) rot = Mat3x4.new() rot:setAll(0.685921, -0.324013, 0.651558, 0.000000, 0.000000, 0.895396, 0.445271, 0.000000, -0.727676, -0.305421, 0.614170, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) node = scene:newSceneNode("Cube.021") @@ -320,7 +320,7 @@ trf:setOrigin(Vec4.new(39.798492, 6.376611, -12.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -333,7 +333,7 @@ trf:setOrigin(Vec4.new(42.271385, 2.886189, -12.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -346,7 +346,7 @@ trf:setOrigin(Vec4.new(37.271385, 2.886189, -12.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -359,7 +359,7 @@ trf:setOrigin(Vec4.new(39.798492, 6.376611, -18.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -372,7 +372,7 @@ trf:setOrigin(Vec4.new(42.271385, 2.886189, -18.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -385,7 +385,7 @@ trf:setOrigin(Vec4.new(37.271385, 2.886189, -18.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -398,7 +398,7 @@ trf:setOrigin(Vec4.new(34.761005, 2.886189, -21.498241, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -411,7 +411,7 @@ trf:setOrigin(Vec4.new(44.761005, 2.886189, -21.498241, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -424,7 +424,7 @@ trf:setOrigin(Vec4.new(47.271385, 2.886189, -25.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -437,7 +437,7 @@ trf:setOrigin(Vec4.new(32.271385, 2.886189, -25.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -450,7 +450,7 @@ trf:setOrigin(Vec4.new(32.271385, 2.886189, -31.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -463,7 +463,7 @@ trf:setOrigin(Vec4.new(47.271385, 2.886189, -31.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -476,7 +476,7 @@ trf:setOrigin(Vec4.new(44.761005, 2.886189, -34.498241, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -489,7 +489,7 @@ trf:setOrigin(Vec4.new(38.761005, 2.886189, -34.498241, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -502,7 +502,7 @@ trf:setOrigin(Vec4.new(34.761005, 2.886189, -34.498241, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000) trf:setRotation(rot) -trf:setScale(0.995130) +trf:setScale(Vec4.new(0.995130, 0.995130, 0.995130, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -515,7 +515,7 @@ trf:setOrigin(Vec4.new(34.798492, 6.376611, -32.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -528,7 +528,7 @@ trf:setOrigin(Vec4.new(34.798492, 6.376611, -24.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -541,7 +541,7 @@ trf:setOrigin(Vec4.new(34.798492, 6.398044, -28.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -554,7 +554,7 @@ trf:setOrigin(Vec4.new(44.798492, 6.376611, -32.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -567,7 +567,7 @@ trf:setOrigin(Vec4.new(44.798492, 6.376611, -24.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -580,7 +580,7 @@ trf:setOrigin(Vec4.new(44.798492, 6.398044, -28.000000, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -593,7 +593,7 @@ trf:setOrigin(Vec4.new(39.798492, 6.334259, -31.947594, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -606,7 +606,7 @@ trf:setOrigin(Vec4.new(39.798492, 6.334259, -23.947592, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -619,7 +619,7 @@ trf:setOrigin(Vec4.new(39.798492, 6.355691, -27.947592, 0)) rot = Mat3x4.new() rot:setAll(0.000000, 1.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) comp = node:newBodyComponent() comp:setMeshFromModelComponent() @@ -634,7 +634,7 @@ trf:setOrigin(Vec4.new(-0.068372, 9.192602, -0.126609, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) node = scene:newSceneNode("refl_probe") @@ -645,7 +645,7 @@ trf:setOrigin(Vec4.new(0.000000, 9.113202, 0.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) node = scene:newSceneNode("Cube.045") @@ -656,17 +656,17 @@ trf:setOrigin(Vec4.new(39.731613, 2.915391, -28.049887, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) node = scene:newSceneNode("Skybox") comp = node:newSkyboxComponent() comp:loadImageResource("EngineAssets/DefaultSkybox.ankitex") -comp:setMaxFogDensity("0.100000") +comp:setMaxFogDensity(0.100000) trf = Transform.new() trf:setOrigin(Vec4.new(-3.710423, 69.685875, 0.000000, 0)) rot = Mat3x4.new() rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000) trf:setRotation(rot) -trf:setScale(1.000000) +trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0)) node:setLocalTransform(trf) diff --git a/Samples/PhysicsPlayground/Assets/Suzanne_e3526e1428c0763c.ankimesh b/Samples/PhysicsPlayground/Assets/Suzanne_e3526e1428c0763c.ankimesh index 23e233471c2095139876a07a2efb997bed486aad..b1a0b2d32389dac89de10cdc8dc6116f2301906c 100644 GIT binary patch literal 23788 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 diff --git a/Samples/PhysicsPlayground/Assets/dynamic_f238b379a41079ff.ankimtl b/Samples/PhysicsPlayground/Assets/dynamic_f238b379a41079ff.ankimtl index 99118efc57..704993aac5 100644 --- a/Samples/PhysicsPlayground/Assets/dynamic_f238b379a41079ff.ankimtl +++ b/Samples/PhysicsPlayground/Assets/dynamic_f238b379a41079ff.ankimtl @@ -1,36 +1,26 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - - - + + + + - + diff --git a/Samples/PhysicsPlayground/Assets/floor_71cbd2644e53ab8c.ankimesh b/Samples/PhysicsPlayground/Assets/floor_71cbd2644e53ab8c.ankimesh index 8f5fa5ef76efef68abba05c4ea65591e4eba844f..97fbb83a348dd6f4ca0a7aeb963bdb4c668fdd16 100644 GIT binary patch literal 1400 zcmd^8OHRUI7#t8vks=R4Jb{S^FmVT!m|%=5(7LqcMm z=}#YEHSYbAneYAoEgjtJ%Zsb?n^VwiBD40&lk9d~w9skCk;UW%=nswWHB+2B3J>Tt zfjGj3AEe25VJSYR_p6W^V_j6OwH#MBb4r6hKPiBQ|A;(y3BahvX3(RbY9Tc$_a*3G(aTygs~W&_BF3L-EH<}ey;nJYhL~6Tp;+L$p5ZWoah$_ z^shM4QdF>zrh17?mdX_@s+O?xRIE^-S_!8}r3xjglqgrIP@zh7616&&DKw}`;tQ+W B`7;0j literal 1224 zcmdT=OHKk&5G)XfkBEwbp1>=(gwdE_jBZ?d0FMFOgq!Gy3lhgOcmQ`S2nmUguIZUK zJ*Y7*eMwhWch{@;32(2jZZ7Z6Agd-(NrU{mb)Pl^3@&VJWA+S8o-~hoCDEOFgHaE# z;RgvR|3SMY+6TYgdXoSDH84*&F`WO&u>V}e?7V|Xzb@HGVLg7<-S_yn4PDc>^xT4os?&Oc~-5SHx!YLVl~8A<~E9zOze={nvr8n zkq>E&ZETc7nf(@p{VVqxez^DETr$vq1YRQMrJF|VZ_YoZZ|93tH&6T2t52Nx0&!C3 iKI+ST)Um%3&b&-w8Z9KNAMX+;oO!5Ob!I->smZ4%m+x1PQx$?q{09y& zkvPF2j&O{r#3@d2iZje4&Tx(kWSC2wKV!^SPth6mW8L1%=54MP)?*=i2T!qf6zgATN){c|9CPU9H>J&(99bun<<}j* pEzLk#WpP~Q& diff --git a/Samples/PhysicsPlayground/Assets/walls.001_2469a4d42c8d129c.ankimtl b/Samples/PhysicsPlayground/Assets/walls.001_2469a4d42c8d129c.ankimtl index 9255ce9d40..84490e89fd 100644 --- a/Samples/PhysicsPlayground/Assets/walls.001_2469a4d42c8d129c.ankimtl +++ b/Samples/PhysicsPlayground/Assets/walls.001_2469a4d42c8d129c.ankimtl @@ -1,36 +1,28 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - - - + + + + + + - + diff --git a/Samples/PhysicsPlayground/Assets/walls_9619132fa258d22d.ankimtl b/Samples/PhysicsPlayground/Assets/walls_9619132fa258d22d.ankimtl index 5737edbddc..74e2ed2fdc 100644 --- a/Samples/PhysicsPlayground/Assets/walls_9619132fa258d22d.ankimtl +++ b/Samples/PhysicsPlayground/Assets/walls_9619132fa258d22d.ankimtl @@ -1,36 +1,28 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - - - + + + + + + - +