Made game work

This commit is contained in:
Segey Lapin
2019-10-19 16:35:36 +03:00
parent 53c8a3504f
commit 69410badf6
14 changed files with 506 additions and 463 deletions

View File

@@ -176,156 +176,156 @@ func add_body_mesh(mesh: ArrayMesh, same_indices: Dictionary) -> Array:
# maps[k].image.unlock()
# maps[k].image_normal.unlock()
# return mod_mesh
func modify_part(part_name) -> ArrayMesh:
# var mesh = meshes[part_name].orig_mesh
# var indices = meshes[part_name].same_indices
# return modify_mesh(mesh, indices)
return _mod_part(part_name)
func set_modifier_value(modifier: String, value: float):
maps[modifier].value = value
func get_mesh_modifier(m_name: String, arrays: Array) -> Array:
maps[m_name].image.lock()
maps[m_name].image_normal.lock()
var indices = PoolIntArray()
var mod_vertex = PoolVector3Array()
var mod_normal = PoolVector3Array()
var uv_index: int = ArrayMesh.ARRAY_TEX_UV
if arrays[ArrayMesh.ARRAY_TEX_UV2] && arrays[ArrayMesh.ARRAY_TEX_UV2].size() > 0:
uv_index = ArrayMesh.ARRAY_TEX_UV2
var mrect: Rect2 = maps[m_name].rect
var count = 0
var max_count = arrays[ArrayMesh.ARRAY_VERTEX].size()
var width: int = maps[m_name].width
var height: int = maps[m_name].height
indices.resize(max_count)
mod_vertex.resize(max_count)
mod_normal.resize(max_count)
if uv_index != ArrayMesh.ARRAY_TEX_UV2:
print("not on uv2")
for index in range(arrays[ArrayMesh.ARRAY_VERTEX].size()):
var uv: Vector2 = arrays[uv_index][index]
if !mrect.has_point(uv):
continue
var diff: = Vector3()
var diffn: = Vector3()
var pos: Vector2 = Vector2(uv.x * width, uv.y * height)
var offset: Color = maps[m_name].image.get_pixelv(pos)
var offsetn: Color = maps[m_name].image_normal.get_pixelv(pos)
var pdiff: Vector3 = Vector3(offset.r, offset.g, offset.b)
var ndiff: Vector3 = Vector3(offsetn.r, offsetn.g, offsetn.b)
for u in range(3):
diff[u] = range_lerp(pdiff[u], 0.0, 1.0, maps[m_name].min_point[u], maps[m_name].min_point[u] + maps[m_name].point_scaler[u])
diffn[u] = range_lerp(ndiff[u], 0.0, 1.0, maps[m_name].min_normal[u], maps[m_name].min_normal[u] + maps[m_name].normal_scaler[u])
if abs(diff[u]) < 0.0001:
diff[u] = 0
if diff.length() > 0.001:
indices[count] = index
mod_vertex[count] = diff
mod_normal[count] = diffn
count += 1
indices.resize(count)
mod_vertex.resize(count)
mod_normal.resize(count)
maps[m_name].image.unlock()
maps[m_name].image_normal.unlock()
return [indices, mod_vertex, mod_normal]
func apply_modifier(mod: Array, arrays: Array, value: float, offset = 0.0):
var value_: float = clamp(value, 0.0, 1.0)
var indices: PoolIntArray = mod[0]
var mod_vertex: PoolVector3Array = mod[1]
var mod_normal: PoolVector3Array = mod[2]
for count in range(indices.size()):
var index: int = indices[count]
var diff: Vector3 = mod_vertex[count]
var diffn: Vector3 = mod_normal[count]
var n = (arrays[ArrayMesh.ARRAY_NORMAL][index] - diffn).normalized() * offset
arrays[ArrayMesh.ARRAY_VERTEX][index] -= diff * value_ - n
# do not normalize now
arrays[ArrayMesh.ARRAY_NORMAL][index] -= diffn * value_
func _mod_part(part_name: String) -> ArrayMesh:
print("modifying ", part_name)
print("helper:", meshes[part_name].helper)
var start_time = OS.get_unix_time()
# var mesh: ArrayMesh = meshes[part_name].orig_mesh
var mod_mesh: = ArrayMesh.new()
var indices: Dictionary = meshes[part_name].same_indices
var surface: int = 0
if meshes[part_name].has("surface"):
surface = meshes[part_name].surface
# var arrays: Array = mesh.surface_get_arrays(surface)
var arrays: Array = meshes[part_name].orig_arrays.duplicate()
if part_name == "body":
for mod in meshes[part_name].modifiers.keys():
var mod_data = meshes[part_name].modifiers[mod]
apply_modifier(mod_data, arrays, maps[mod].value)
else:
for mod in meshes[part_name].modifiers.keys():
var mod_data = meshes[part_name].modifiers[mod]
apply_modifier(mod_data, arrays, maps[mod].value, 0.0002)
for v in indices.keys():
if indices[v].size() <= 1:
continue
var vx: Vector3 = arrays[ArrayMesh.ARRAY_VERTEX][indices[v][0]]
for idx in range(1, indices[v].size()):
vx = vx.linear_interpolate(arrays[ArrayMesh.ARRAY_VERTEX][indices[v][idx]], 0.5)
for idx in indices[v]:
arrays[ArrayMesh.ARRAY_VERTEX][idx] = vx
mod_mesh.add_surface_from_arrays(ArrayMesh.PRIMITIVE_TRIANGLES, arrays)
if meshes[part_name].material:
mod_mesh.surface_set_material(surface, meshes[part_name].material.duplicate(true))
# if mesh.surface_get_material(surface):
# mod_mesh.surface_set_material(surface, mesh.surface_get_material(surface).duplicate(true))
var elapsed = OS.get_unix_time() - start_time
print("modified ", part_name, " ", elapsed)
return mod_mesh
#func modify_part(part_name) -> ArrayMesh:
## var mesh = meshes[part_name].orig_mesh
## var indices = meshes[part_name].same_indices
## return modify_mesh(mesh, indices)
# return _mod_part(part_name)
#func set_modifier_value(modifier: String, value: float):
# maps[modifier].value = value
#func get_mesh_modifier(m_name: String, arrays: Array) -> Array:
# maps[m_name].image.lock()
# maps[m_name].image_normal.lock()
# var indices = PoolIntArray()
# var mod_vertex = PoolVector3Array()
# var mod_normal = PoolVector3Array()
# var uv_index: int = ArrayMesh.ARRAY_TEX_UV
# if arrays[ArrayMesh.ARRAY_TEX_UV2] && arrays[ArrayMesh.ARRAY_TEX_UV2].size() > 0:
# uv_index = ArrayMesh.ARRAY_TEX_UV2
# var mrect: Rect2 = maps[m_name].rect
# var count = 0
# var max_count = arrays[ArrayMesh.ARRAY_VERTEX].size()
# var width: int = maps[m_name].width
# var height: int = maps[m_name].height
# indices.resize(max_count)
# mod_vertex.resize(max_count)
# mod_normal.resize(max_count)
# if uv_index != ArrayMesh.ARRAY_TEX_UV2:
# print("not on uv2")
# for index in range(arrays[ArrayMesh.ARRAY_VERTEX].size()):
# var uv: Vector2 = arrays[uv_index][index]
# if !mrect.has_point(uv):
# continue
# var diff: = Vector3()
# var diffn: = Vector3()
# var pos: Vector2 = Vector2(uv.x * width, uv.y * height)
# var offset: Color = maps[m_name].image.get_pixelv(pos)
# var offsetn: Color = maps[m_name].image_normal.get_pixelv(pos)
# var pdiff: Vector3 = Vector3(offset.r, offset.g, offset.b)
# var ndiff: Vector3 = Vector3(offsetn.r, offsetn.g, offsetn.b)
# for u in range(3):
# diff[u] = range_lerp(pdiff[u], 0.0, 1.0, maps[m_name].min_point[u], maps[m_name].min_point[u] + maps[m_name].point_scaler[u])
# diffn[u] = range_lerp(ndiff[u], 0.0, 1.0, maps[m_name].min_normal[u], maps[m_name].min_normal[u] + maps[m_name].normal_scaler[u])
# if abs(diff[u]) < 0.0001:
# diff[u] = 0
# if diff.length() > 0.001:
# indices[count] = index
# mod_vertex[count] = diff
# mod_normal[count] = diffn
# count += 1
# indices.resize(count)
# mod_vertex.resize(count)
# mod_normal.resize(count)
# maps[m_name].image.unlock()
# maps[m_name].image_normal.unlock()
# return [indices, mod_vertex, mod_normal]
#func apply_modifier(mod: Array, arrays: Array, value: float, offset = 0.0):
# var value_: float = clamp(value, 0.0, 1.0)
# var indices: PoolIntArray = mod[0]
# var mod_vertex: PoolVector3Array = mod[1]
# var mod_normal: PoolVector3Array = mod[2]
# for count in range(indices.size()):
# var index: int = indices[count]
# var diff: Vector3 = mod_vertex[count]
# var diffn: Vector3 = mod_normal[count]
# var n = (arrays[ArrayMesh.ARRAY_NORMAL][index] - diffn).normalized() * offset
# arrays[ArrayMesh.ARRAY_VERTEX][index] -= diff * value_ - n
# # do not normalize now
# arrays[ArrayMesh.ARRAY_NORMAL][index] -= diffn * value_
#func _mod_part(part_name: String) -> ArrayMesh:
# print("modifying ", part_name)
# print("helper:", meshes[part_name].helper)
# var start_time = OS.get_unix_time()
## var mesh: ArrayMesh = meshes[part_name].orig_mesh
# var mod_mesh: = ArrayMesh.new()
# var indices: Dictionary = meshes[part_name].same_indices
# var surface: int = 0
# if meshes[part_name].has("surface"):
# surface = meshes[part_name].surface
## var arrays: Array = mesh.surface_get_arrays(surface)
# var arrays: Array = meshes[part_name].orig_arrays.duplicate()
# if part_name == "body":
# for mod in meshes[part_name].modifiers.keys():
# var mod_data = meshes[part_name].modifiers[mod]
# apply_modifier(mod_data, arrays, maps[mod].value)
# else:
# for mod in meshes[part_name].modifiers.keys():
# var mod_data = meshes[part_name].modifiers[mod]
# apply_modifier(mod_data, arrays, maps[mod].value, 0.0002)
# for v in indices.keys():
# if indices[v].size() <= 1:
# continue
# var vx: Vector3 = arrays[ArrayMesh.ARRAY_VERTEX][indices[v][0]]
# for idx in range(1, indices[v].size()):
# vx = vx.linear_interpolate(arrays[ArrayMesh.ARRAY_VERTEX][indices[v][idx]], 0.5)
# for idx in indices[v]:
# arrays[ArrayMesh.ARRAY_VERTEX][idx] = vx
# mod_mesh.add_surface_from_arrays(ArrayMesh.PRIMITIVE_TRIANGLES, arrays)
# if meshes[part_name].material:
# mod_mesh.surface_set_material(surface, meshes[part_name].material.duplicate(true))
## if mesh.surface_get_material(surface):
## mod_mesh.surface_set_material(surface, mesh.surface_get_material(surface).duplicate(true))
# var elapsed = OS.get_unix_time() - start_time
# print("modified ", part_name, " ", elapsed)
# return mod_mesh
func load_maps(path: String):
maps = {}
var fd: File = File.new()
fd.open(path, File.READ)
if !fd.is_open():
print("Could not open " + path)
print(fd.get_len())
var count = fd.get_var()
print(count)
for c in range(count):
var map_name = fd.get_var()
map_name = map_name.replace("base:", "")
var rect = fd.get_var()
var map_min_point = fd.get_var()
var point_scaler = fd.get_var()
var map_min_normal = fd.get_var()
var normal_scaler = fd.get_var()
var map_width = fd.get_var()
var map_height = fd.get_var()
var data_size = fd.get_var()
var data = fd.get_var()
var map_normal_width = fd.get_var()
var map_normal_height = fd.get_var()
var normal_data_size = fd.get_var()
var normal_data = fd.get_var()
maps[map_name] = {}
maps[map_name].rect = rect
maps[map_name].min_point = map_min_point
maps[map_name].point_scaler = point_scaler
maps[map_name].min_normal = map_min_normal
maps[map_name].normal_scaler = normal_scaler
maps[map_name].width = map_width
maps[map_name].height = map_height
maps[map_name].normal_width = map_normal_width
maps[map_name].normal_height = map_normal_height
data = data.decompress(data_size, File.COMPRESSION_DEFLATE)
maps[map_name].image = Image.new()
maps[map_name].image.create_from_data(maps[map_name].width, maps[map_name].height, false, Image.FORMAT_RGB8, data)
normal_data = normal_data.decompress(normal_data_size, File.COMPRESSION_DEFLATE)
maps[map_name].image_normal = Image.new()
maps[map_name].image_normal.create_from_data(maps[map_name].normal_width, maps[map_name].normal_height, false, Image.FORMAT_RGB8, normal_data)
print(map_name, " ", map_width, " ", map_height, " ", data_size, " ", data.size(), " ", map_normal_width, " ", map_normal_height, " ", normal_data_size, " ", normal_data.size())
maps[map_name].value = 0.0
fd.close()
#func load_maps(path: String):
# maps = {}
# var fd: File = File.new()
# fd.open(path, File.READ)
# if !fd.is_open():
# print("Could not open " + path)
# print(fd.get_len())
# var count = fd.get_var()
# print(count)
# for c in range(count):
# var map_name = fd.get_var()
# map_name = map_name.replace("base:", "")
# var rect = fd.get_var()
# var map_min_point = fd.get_var()
# var point_scaler = fd.get_var()
# var map_min_normal = fd.get_var()
# var normal_scaler = fd.get_var()
# var map_width = fd.get_var()
# var map_height = fd.get_var()
# var data_size = fd.get_var()
# var data = fd.get_var()
# var map_normal_width = fd.get_var()
# var map_normal_height = fd.get_var()
# var normal_data_size = fd.get_var()
# var normal_data = fd.get_var()
# maps[map_name] = {}
# maps[map_name].rect = rect
# maps[map_name].min_point = map_min_point
# maps[map_name].point_scaler = point_scaler
# maps[map_name].min_normal = map_min_normal
# maps[map_name].normal_scaler = normal_scaler
# maps[map_name].width = map_width
# maps[map_name].height = map_height
# maps[map_name].normal_width = map_normal_width
# maps[map_name].normal_height = map_normal_height
# data = data.decompress(data_size, File.COMPRESSION_DEFLATE)
# maps[map_name].image = Image.new()
# maps[map_name].image.create_from_data(maps[map_name].width, maps[map_name].height, false, Image.FORMAT_RGB8, data)
# normal_data = normal_data.decompress(normal_data_size, File.COMPRESSION_DEFLATE)
# maps[map_name].image_normal = Image.new()
# maps[map_name].image_normal.create_from_data(maps[map_name].normal_width, maps[map_name].normal_height, false, Image.FORMAT_RGB8, normal_data)
# print(map_name, " ", map_width, " ", map_height, " ", data_size, " ", data.size(), " ", map_normal_width, " ", map_normal_height, " ", normal_data_size, " ", normal_data.size())
# maps[map_name].value = 0.0
# fd.close()
func _init(path: String):
load_maps("res://characters/blendmaps.bin")
#func _init(path: String):
# load_maps("res://characters/blendmaps.bin")
# var fd = File.new()
# fd.open(path, File.READ)
# min_point = fd.get_var()