UV Mapping for Destructable Walls
This commit is contained in:
@@ -9,6 +9,8 @@ var uvs = PackedVector2Array()
|
||||
var normals = PackedVector3Array()
|
||||
var array_mesh = ArrayMesh.new()
|
||||
|
||||
var original_face_data: Faces
|
||||
|
||||
var _v_indexes = []
|
||||
var _v_points = []
|
||||
|
||||
@@ -17,24 +19,25 @@ var edges = {}
|
||||
var depth_vector: Vector3
|
||||
var extrude_direction: DestructableWall.ExtrudeDirection
|
||||
|
||||
func _init(vector_indexes: PackedInt32Array, vector_points: PackedVector2Array, extrude_direction: DestructableWall.ExtrudeDirection, depth: float = -0.1):
|
||||
func _init(vector_indexes: PackedInt32Array, vector_points: PackedVector2Array, extrude_direction: DestructableWall.ExtrudeDirection, original_vectors: PackedVector3Array, original_uvs: PackedVector2Array, original_normals: PackedVector3Array, depth: float = -0.1):
|
||||
assert(len(vector_indexes) % 3 == 0 && len(vector_indexes) != 0, "Number of vertex points is not divisible by 3, invalid triangle verticies")
|
||||
surface_array.resize(Mesh.ARRAY_MAX)
|
||||
original_face_data = Faces.new(original_vectors, original_uvs, original_normals)
|
||||
|
||||
self._v_indexes = vector_indexes
|
||||
self.extrude_direction = extrude_direction
|
||||
|
||||
if extrude_direction == DestructableWall.ExtrudeDirection.BACK:
|
||||
for point in vector_points:
|
||||
self._v_points.append(Vector3(point.x, point.y, 0))
|
||||
depth_vector = Vector3.BACK * depth
|
||||
elif extrude_direction == DestructableWall.ExtrudeDirection.RIGHT:
|
||||
for point in vector_points:
|
||||
self._v_points.append(Vector3(0, point.y, point.x))
|
||||
self._v_points.append(Vector3(point.x, point.y, -depth/2))
|
||||
elif extrude_direction == DestructableWall.ExtrudeDirection.RIGHT:
|
||||
depth_vector = Vector3.LEFT * depth
|
||||
for point in vector_points:
|
||||
self._v_points.append(Vector3(depth/2, point.y, point.x))
|
||||
elif extrude_direction == DestructableWall.ExtrudeDirection.UP:
|
||||
for point in vector_points:
|
||||
self._v_points.append(Vector3(point.x, 0, point.y))
|
||||
self._v_points.append(Vector3(point.x, depth/2, point.y))
|
||||
depth_vector = Vector3.DOWN * depth
|
||||
|
||||
|
||||
@@ -71,6 +74,38 @@ func _pre_process_edges():
|
||||
else:
|
||||
self.edges[[min_index, max_index]] += 1
|
||||
|
||||
func in_triag(u, v, w):
|
||||
return u >= 0 and u <= 1 and v >= 0 and v <= 1 and w >= 0 and w <= 1
|
||||
|
||||
func _reduce_significance(value: float):
|
||||
return snapped(value, 0.0001)
|
||||
|
||||
func _new_interpolated_uv_point(new_vector: Vector3, normal: Vector3) -> Vector2:
|
||||
# get faces that have the same normal e.g faces that the point can fall into
|
||||
var faces = self.original_face_data.get_faces()
|
||||
|
||||
var possible_faces: Array[Face] = []
|
||||
|
||||
for f in faces:
|
||||
if normal.dot(f.normal) > 0.99:
|
||||
possible_faces.append(f)
|
||||
|
||||
for ps in possible_faces:
|
||||
var ps_face_verts = ps.vectors
|
||||
var b_points = Geometry3D.get_triangle_barycentric_coords(new_vector, ps_face_verts[0], ps_face_verts[1], ps_face_verts[2])
|
||||
|
||||
var u = self._reduce_significance(b_points[0])
|
||||
var v = self._reduce_significance(b_points[1])
|
||||
var w = self._reduce_significance(b_points[2])
|
||||
|
||||
|
||||
var uv_coords = ps.uvs
|
||||
if in_triag(u, v, w):
|
||||
return (uv_coords[0] * u) + (uv_coords[1] * v) + (uv_coords[2] * w)
|
||||
|
||||
# for destructable walls, if we couldn't interpolate a uv, this is fine
|
||||
return Vector2.ZERO
|
||||
|
||||
func get_loops():
|
||||
var unvisted_edges = self.get_outline_edge()
|
||||
var loops = []
|
||||
@@ -167,34 +202,16 @@ func _draw_sides():
|
||||
|
||||
var n1 = self._calc_triangle_normal(v2, v1, v0)
|
||||
self.verts.append_array([v0, v1, v2, v1, v3, v2])
|
||||
_append_uvs4(v0, v1, v2, v3, n1)
|
||||
_append_uvs3(v0, v1, v2, n1)
|
||||
_append_uvs3(v1, v3, v2, n1)
|
||||
self.normals.append_array([n1, n1, n1, n1, n1, n1])
|
||||
|
||||
func _append_uvs4(v0: Vector3, v1: Vector3, v2: Vector3, v3: Vector3, normal: Vector3):
|
||||
if normal == Vector3.BACK or normal == Vector3.FORWARD:
|
||||
self.uvs.append_array([Vector2(-v0.x, -v0.y), Vector2(-v1.x, -v1.y), Vector2(-v2.x, -v2.y), Vector2(-v1.x, -v1.y), Vector2(-v3.x, -v3.y), Vector2(-v2.x, -v2.y)])
|
||||
return
|
||||
elif normal == Vector3.RIGHT or normal == Vector3.LEFT:
|
||||
self.uvs.append_array([Vector2(-v0.z, -v0.y), Vector2(-v1.z, -v1.y), Vector2(-v2.z, -v2.y), Vector2(-v1.z, -v1.y), Vector2(-v3.z, -v3.y), Vector2(-v2.z, -v2.y)])
|
||||
return
|
||||
elif normal == Vector3.UP or normal == Vector3.DOWN:
|
||||
self.uvs.append_array([Vector2(-v0.x, -v0.z), Vector2(-v1.x, -v1.z), Vector2(-v2.x, -v2.z), Vector2(-v1.x, -v1.z), Vector2(-v3.x, -v3.z), Vector2(-v2.x, -v2.z)])
|
||||
return
|
||||
|
||||
self.uvs.append_array([Vector2(-v0.x, -v0.y), Vector2(-v1.x, -v1.y), Vector2(-v2.x, -v2.y), Vector2(-v1.x, -v1.y), Vector2(-v3.x, -v3.y), Vector2(-v2.x, -v2.y)])
|
||||
|
||||
func _append_uvs3(v0: Vector3, v1: Vector3, v2: Vector3, normal: Vector3):
|
||||
if normal == Vector3.BACK or normal == Vector3.FORWARD:
|
||||
self.uvs.append_array([Vector2(-v0.x, -v0.y), Vector2(-v1.x, -v1.y), Vector2(-v2.x, -v2.y)])
|
||||
return
|
||||
elif normal == Vector3.RIGHT or normal == Vector3.LEFT:
|
||||
self.uvs.append_array([Vector2(-v0.z, -v0.y), Vector2(-v1.z, -v1.y), Vector2(-v2.z, -v2.y)])
|
||||
return
|
||||
elif normal == Vector3.UP or normal == Vector3.DOWN:
|
||||
self.uvs.append_array([Vector2(-v0.x, -v0.z), Vector2(-v1.x, -v1.z), Vector2(-v2.x, -v2.z)])
|
||||
return
|
||||
var uv0 = self._new_interpolated_uv_point(v0, normal)
|
||||
var uv1 = self._new_interpolated_uv_point(v1, normal)
|
||||
var uv2 = self._new_interpolated_uv_point(v2, normal)
|
||||
|
||||
self.uvs.append_array([Vector2(-v0.x, -v0.y), Vector2(-v1.x, -v1.y), Vector2(-v2.x, -v2.y)])
|
||||
self.uvs.append_array([uv0, uv1, uv2])
|
||||
|
||||
# front face
|
||||
func _draw_mesh():
|
||||
@@ -204,10 +221,9 @@ func _draw_mesh():
|
||||
|
||||
var normal = self._calc_triangle_normal(vector3C, vector3B, vector3A)
|
||||
|
||||
|
||||
self.verts.append_array([vector3A, vector3B, vector3C])
|
||||
_append_uvs3(vector3A, vector3B, vector3C, normal)
|
||||
|
||||
|
||||
self.normals.append_array([normal, normal, normal])
|
||||
|
||||
# insert each front face into the mesh "clockwise"
|
||||
|
||||
Reference in New Issue
Block a user