From 4bde0b11d8c1362815e917fb4d1b4f2beba4a969 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Sat, 15 Dec 2018 23:10:11 +0100 Subject: [PATCH] Packed pos fixes --- .../armory/trait/physics/bullet/RigidBody.hx | 44 ++++++++++++------- blender/arm/exporter.py | 27 +++--------- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/Sources/armory/trait/physics/bullet/RigidBody.hx b/Sources/armory/trait/physics/bullet/RigidBody.hx index 312c4cca..4e5272bb 100644 --- a/Sources/armory/trait/physics/bullet/RigidBody.hx +++ b/Sources/armory/trait/physics/bullet/RigidBody.hx @@ -441,39 +441,53 @@ class RigidBody extends iron.Trait { } function fillConvexHull(shape:BtConvexHullShapePointer, scale:Vec4, margin:Float) { - var positions = cast(object, MeshObject).data.geom.positions; + var data = cast(object, MeshObject).data; + var positions = data.geom.positions; var sx = scale.x * (1.0 - margin) * (1 / 32767); var sy = scale.y * (1.0 - margin) * (1 / 32767); var sz = scale.z * (1.0 - margin) * (1 / 32767); + if (data.raw.scale_pos != null) { + sx *= data.raw.scale_pos; + sy *= data.raw.scale_pos; + sz *= data.raw.scale_pos; + } + for (i in 0...Std.int(positions.length / 4)) { - vec1.setX(positions[i * 3] * sx); - vec1.setY(positions[i * 3 + 1] * sy); - vec1.setZ(positions[i * 3 + 2] * sz); + vec1.setX(positions[i * 4 ] * sx); + vec1.setY(positions[i * 4 + 1] * sy); + vec1.setZ(positions[i * 4 + 2] * sz); shape.addPoint(vec1, true); } } function fillTriangleMesh(triangleMesh:BtTriangleMeshPointer, scale:Vec4) { - var positions = cast(object, MeshObject).data.geom.positions; - var indices = cast(object, MeshObject).data.geom.indices; + var data = cast(object, MeshObject).data; + var positions = data.geom.positions; + var indices = data.geom.indices; var sx = scale.x * (1 / 32767); var sy = scale.y * (1 / 32767); var sz = scale.z * (1 / 32767); + if (data.raw.scale_pos != null) { + sx *= data.raw.scale_pos; + sy *= data.raw.scale_pos; + sz *= data.raw.scale_pos; + } + for (ar in indices) { for (i in 0...Std.int(ar.length / 3)) { - vec1.setX(positions[ar[i * 3 + 0] * 3 + 0] * sx); - vec1.setY(positions[ar[i * 3 + 0] * 3 + 1] * sy); - vec1.setZ(positions[ar[i * 3 + 0] * 3 + 2] * sz); - vec2.setX(positions[ar[i * 3 + 1] * 3 + 0] * sx); - vec2.setY(positions[ar[i * 3 + 1] * 3 + 1] * sy); - vec2.setZ(positions[ar[i * 3 + 1] * 3 + 2] * sz); - vec3.setX(positions[ar[i * 3 + 2] * 3 + 0] * sx); - vec3.setY(positions[ar[i * 3 + 2] * 3 + 1] * sy); - vec3.setZ(positions[ar[i * 3 + 2] * 3 + 2] * sz); + vec1.setX(positions[ar[i * 3 + 0] * 4 + 0] * sx); + vec1.setY(positions[ar[i * 3 + 0] * 4 + 1] * sy); + vec1.setZ(positions[ar[i * 3 + 0] * 4 + 2] * sz); + vec2.setX(positions[ar[i * 3 + 1] * 4 + 0] * sx); + vec2.setY(positions[ar[i * 3 + 1] * 4 + 1] * sy); + vec2.setZ(positions[ar[i * 3 + 1] * 4 + 2] * sz); + vec3.setX(positions[ar[i * 3 + 2] * 4 + 0] * sx); + vec3.setY(positions[ar[i * 3 + 2] * 4 + 1] * sy); + vec3.setZ(positions[ar[i * 3 + 2] * 4 + 2] * sz); triangleMesh.addTriangle(vec1, vec2, vec3); } } diff --git a/blender/arm/exporter.py b/blender/arm/exporter.py index ecfd46cb..f18ce4dc 100755 --- a/blender/arm/exporter.py +++ b/blender/arm/exporter.py @@ -1448,26 +1448,13 @@ class ArmoryExporter: cdata[i * 4 + 2] = np.int16(pow(vtx.col[2], 2.2) * 32767) # Save aabb - aabb_min = [-0.01, -0.01, -0.01] - aabb_max = [0.01, 0.01, 0.01] - i = 0 - while i < len(vdata): - if vdata[i] > aabb_max[0]: - aabb_max[0] = vdata[i] - if vdata[i + 1] > aabb_max[1]: - aabb_max[1] = vdata[i + 1] - if vdata[i + 2] > aabb_max[2]: - aabb_max[2] = vdata[i + 2] - if vdata[i] < aabb_min[0]: - aabb_min[0] = vdata[i] - if vdata[i + 1] < aabb_min[1]: - aabb_min[1] = vdata[i + 1] - if vdata[i + 2] < aabb_min[2]: - aabb_min[2] = vdata[i + 2] - i += 3 - bobject.data.arm_aabb = [abs(aabb_min[0]) + abs(aabb_max[0]), abs(aabb_min[1]) + abs(aabb_max[1]), abs(aabb_min[2]) + abs(aabb_max[2])] - # Not axis-aligned - # arm_aabb = [bobject.matrix_world * Vector(v) for v in bobject.bound_box] + aabb_center = 0.125 * sum((Vector(b) for b in bobject.bound_box), Vector()) + bobject.data.arm_aabb = [bobject.dimensions[0] / bobject.scale[0], \ + bobject.dimensions[1] / bobject.scale[1], \ + bobject.dimensions[2] / bobject.scale[2]] + bobject.data.arm_aabb[0] += abs(aabb_center[0]) * 2 + bobject.data.arm_aabb[1] += abs(aabb_center[1]) * 2 + bobject.data.arm_aabb[2] += abs(aabb_center[2]) * 2 # Scale for packed coords maxdim = max(bobject.data.arm_aabb[0], max(bobject.data.arm_aabb[1], bobject.data.arm_aabb[2]))