Added random obj spawn + set giants dir on start
This commit is contained in:
parent
b37f4c5121
commit
c03e87bc21
30
3d.gd
30
3d.gd
@ -7,6 +7,7 @@ extends Spatial
|
|||||||
|
|
||||||
export var fast_close := true
|
export var fast_close := true
|
||||||
var mouse_mode: String = "CAPTURED"
|
var mouse_mode: String = "CAPTURED"
|
||||||
|
var objmgr
|
||||||
|
|
||||||
onready var camera = get_node("Player/Head/Camera")
|
onready var camera = get_node("Player/Head/Camera")
|
||||||
|
|
||||||
@ -16,7 +17,12 @@ func _ready() -> void:
|
|||||||
if fast_close:
|
if fast_close:
|
||||||
print("** 'Esc' to close 'Shift + F1' to release mouse **")
|
print("** 'Esc' to close 'Shift + F1' to release mouse **")
|
||||||
var giantsscript = load("res://objectmanager.gd")
|
var giantsscript = load("res://objectmanager.gd")
|
||||||
var objmgr = giantsscript.ObjectManager.new()
|
var f = File.new()
|
||||||
|
f.open("res://dir.txt", File.READ)
|
||||||
|
var dir = f.get_as_text()
|
||||||
|
f.close()
|
||||||
|
objmgr = giantsscript.ObjectManager.new()
|
||||||
|
objmgr.GIANTS_PATH = dir
|
||||||
# var giants_dir_browser = FileDialog.new()
|
# var giants_dir_browser = FileDialog.new()
|
||||||
# giants_dir_browser.mode = FileDialog.MODE_OPEN_DIR
|
# giants_dir_browser.mode = FileDialog.MODE_OPEN_DIR
|
||||||
# giants_dir_browser.window_title = "Select your Giants directory"
|
# giants_dir_browser.window_title = "Select your Giants directory"
|
||||||
@ -25,6 +31,7 @@ func _ready() -> void:
|
|||||||
# giants_dir_browser.popup_centered()
|
# giants_dir_browser.popup_centered()
|
||||||
objmgr.build()
|
objmgr.build()
|
||||||
# var m = objmgr.load_model("mc_nothrust_l0.gbs")
|
# var m = objmgr.load_model("mc_nothrust_l0.gbs")
|
||||||
|
# var m = objmgr.load_model("ripper.gbs")
|
||||||
var m = objmgr.load_model("RP_command.gbs")
|
var m = objmgr.load_model("RP_command.gbs")
|
||||||
# print(m.tex)
|
# print(m.tex)
|
||||||
# print(m.point_uv)
|
# print(m.point_uv)
|
||||||
@ -46,6 +53,23 @@ func _input(event: InputEvent) -> void:
|
|||||||
"VISIBLE":
|
"VISIBLE":
|
||||||
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
||||||
mouse_mode = "CAPTURED"
|
mouse_mode = "CAPTURED"
|
||||||
|
if event.is_action_pressed("spawn_object"):
|
||||||
|
var random_key = ""
|
||||||
|
var rand = RandomNumberGenerator.new()
|
||||||
|
rand.randomize()
|
||||||
|
var keys = objmgr.index.keys()
|
||||||
|
while not random_key.ends_with(".gbs"):
|
||||||
|
var rand_i = rand.randi_range(0, len(keys)-1)
|
||||||
|
random_key = keys[rand_i]
|
||||||
|
var m = objmgr.load_model(random_key)
|
||||||
|
print("Loading "+random_key)
|
||||||
|
var meshinstance = objmgr.load_model_mesh(m)
|
||||||
|
var pos = camera.get_global_transform().origin
|
||||||
|
meshinstance.transform.origin.x = pos.x
|
||||||
|
meshinstance.transform.origin.y = pos.y
|
||||||
|
meshinstance.transform.origin.z = pos.z
|
||||||
|
add_child(meshinstance)
|
||||||
|
|
||||||
|
|
||||||
func _process(delta):
|
func _process(delta):
|
||||||
var pos = camera.get_global_transform().origin
|
var pos = camera.get_global_transform().origin
|
||||||
@ -56,7 +80,3 @@ func _process(delta):
|
|||||||
|
|
||||||
func _on_Button_pressed():
|
func _on_Button_pressed():
|
||||||
get_tree().quit()
|
get_tree().quit()
|
||||||
|
|
||||||
|
|
||||||
func _on_GiantsDirectory_dir_selected(dir):
|
|
||||||
pass # Replace with function body.
|
|
||||||
|
22
FileDialog.gd
Normal file
22
FileDialog.gd
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
extends FileDialog
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func _on_FileDialog_ready():
|
||||||
|
popup_centered()
|
||||||
|
|
||||||
|
|
||||||
|
func _on_FileDialog_dir_selected(dir):
|
||||||
|
var d = Directory.new()
|
||||||
|
d.open(dir)
|
||||||
|
if not d.file_exists("Giants.exe"):
|
||||||
|
return
|
||||||
|
var f = File.new()
|
||||||
|
f.open("res://dir.txt", File.WRITE)
|
||||||
|
f.store_string(dir)
|
||||||
|
f.close()
|
||||||
|
get_tree().change_scene("res://3d.tscn")
|
||||||
|
|
||||||
|
|
||||||
|
func _on_FileDialog_popup_hide():
|
||||||
|
popup_centered()
|
@ -1,3 +1,5 @@
|
|||||||
|
tool
|
||||||
|
|
||||||
extends MeshInstance
|
extends MeshInstance
|
||||||
|
|
||||||
var signature
|
var signature
|
||||||
|
@ -33,17 +33,19 @@ class ObjectManager:
|
|||||||
var compression = file.get_8()
|
var compression = file.get_8()
|
||||||
var name_length = file.get_8()
|
var name_length = file.get_8()
|
||||||
var name = file.get_buffer(name_length).get_string_from_ascii()
|
var name = file.get_buffer(name_length).get_string_from_ascii()
|
||||||
|
name = name.to_lower()
|
||||||
if name.ends_with(".tga") or name.ends_with(".gbs"):
|
if name.ends_with(".tga") or name.ends_with(".gbs"):
|
||||||
index[name] = file.get_path_absolute()
|
index[name] = file.get_path_absolute()
|
||||||
if name.ends_with(".gbs"):
|
|
||||||
print(name)
|
|
||||||
|
|
||||||
func read_file_in_gzp(filename: String) -> StreamPeerBuffer:
|
func read_file_in_gzp(filename: String) -> StreamPeerBuffer:
|
||||||
|
filename = filename.to_lower()
|
||||||
|
if not filename in index:
|
||||||
|
return null
|
||||||
var gzp_file = index[filename]
|
var gzp_file = index[filename]
|
||||||
var res = StreamPeerBuffer.new()
|
var res = StreamPeerBuffer.new()
|
||||||
var file = File.new()
|
var file = File.new()
|
||||||
if not file.open(gzp_file, File.READ) == OK:
|
if not file.open(gzp_file, File.READ) == OK:
|
||||||
print("Could not open "+filename)
|
print("Could not open "+gzp_file)
|
||||||
return res
|
return res
|
||||||
var checksum = file.get_32()
|
var checksum = file.get_32()
|
||||||
assert(checksum == 0x6608F101)
|
assert(checksum == 0x6608F101)
|
||||||
@ -59,7 +61,7 @@ class ObjectManager:
|
|||||||
var compression = file.get_8()
|
var compression = file.get_8()
|
||||||
var name_length = file.get_8()
|
var name_length = file.get_8()
|
||||||
var name = file.get_buffer(name_length).get_string_from_ascii()
|
var name = file.get_buffer(name_length).get_string_from_ascii()
|
||||||
if name == filename:
|
if name.to_lower() == filename:
|
||||||
var current_offset = file.get_position()
|
var current_offset = file.get_position()
|
||||||
file.seek(content_offset)
|
file.seek(content_offset)
|
||||||
var data = file.get_buffer(compressed_size)
|
var data = file.get_buffer(compressed_size)
|
||||||
@ -68,9 +70,13 @@ class ObjectManager:
|
|||||||
data = _decompress(data, original_size)
|
data = _decompress(data, original_size)
|
||||||
res.data_array = data
|
res.data_array = data
|
||||||
file.close()
|
file.close()
|
||||||
|
if res.data_array.size() == 0:
|
||||||
|
print("Could not open "+filename)
|
||||||
|
return null
|
||||||
return res
|
return res
|
||||||
|
|
||||||
func load_model(gbs_file: String):
|
func load_model(gbs_file: String):
|
||||||
|
gbs_file = gbs_file.to_lower()
|
||||||
var pos = 0
|
var pos = 0
|
||||||
var gbs_stream = read_file_in_gzp(gbs_file)
|
var gbs_stream = read_file_in_gzp(gbs_file)
|
||||||
var model = load("res://model.gd").Model.new()
|
var model = load("res://model.gd").Model.new()
|
||||||
@ -78,7 +84,6 @@ class ObjectManager:
|
|||||||
model.magic = gbs_stream.get_32()
|
model.magic = gbs_stream.get_32()
|
||||||
model.u1 = gbs_stream.get_32()
|
model.u1 = gbs_stream.get_32()
|
||||||
model.basepoints = gbs_stream.get_32()
|
model.basepoints = gbs_stream.get_32()
|
||||||
print("basepoints="+str(model.basepoints))
|
|
||||||
model.basepoint = []
|
model.basepoint = []
|
||||||
model.basepoint.resize(model.basepoints)
|
model.basepoint.resize(model.basepoints)
|
||||||
for s in range(model.basepoints):
|
for s in range(model.basepoints):
|
||||||
@ -96,7 +101,6 @@ class ObjectManager:
|
|||||||
|
|
||||||
model.points = gbs_stream.get_32()
|
model.points = gbs_stream.get_32()
|
||||||
model.point_1.resize(model.points)
|
model.point_1.resize(model.points)
|
||||||
print("points="+str(model.points))
|
|
||||||
if model.u1 == 7:
|
if model.u1 == 7:
|
||||||
model.point_2.resize(model.points)
|
model.point_2.resize(model.points)
|
||||||
model.point_uv.resize(model.points)
|
model.point_uv.resize(model.points)
|
||||||
@ -121,7 +125,6 @@ class ObjectManager:
|
|||||||
model.point_c.append(b)
|
model.point_c.append(b)
|
||||||
|
|
||||||
var i = gbs_stream.get_32()
|
var i = gbs_stream.get_32()
|
||||||
print("i="+str(i))
|
|
||||||
model.ref1.resize(i)
|
model.ref1.resize(i)
|
||||||
for s in range(i):
|
for s in range(i):
|
||||||
model.ref1[s] = []
|
model.ref1[s] = []
|
||||||
@ -133,12 +136,10 @@ class ObjectManager:
|
|||||||
model.ref1[s][4] = gbs_stream.get_32()
|
model.ref1[s][4] = gbs_stream.get_32()
|
||||||
|
|
||||||
model.parts = gbs_stream.get_32()
|
model.parts = gbs_stream.get_32()
|
||||||
print("parts="+str(model.parts))
|
|
||||||
model.part.resize(model.parts)
|
model.part.resize(model.parts)
|
||||||
for p in range(model.parts):
|
for p in range(model.parts):
|
||||||
model.part[p] = modelitem_gd.ModelItem.new()
|
model.part[p] = modelitem_gd.ModelItem.new()
|
||||||
model.part[p].objname = gbs_stream.get_string(32)
|
model.part[p].objname = gbs_stream.get_string(32)
|
||||||
print("Objname: "+model.part[p].objname)
|
|
||||||
model.part[p].objindex = gbs_stream.get_32()
|
model.part[p].objindex = gbs_stream.get_32()
|
||||||
model.part[p].refs = gbs_stream.get_32()
|
model.part[p].refs = gbs_stream.get_32()
|
||||||
model.part[p].wordz = gbs_stream.get_32()
|
model.part[p].wordz = gbs_stream.get_32()
|
||||||
@ -152,8 +153,8 @@ class ObjectManager:
|
|||||||
model.part[p].triangle[s][2] = gbs_stream.get_16()
|
model.part[p].triangle[s][2] = gbs_stream.get_16()
|
||||||
model.part[p].refstart = gbs_stream.get_32()
|
model.part[p].refstart = gbs_stream.get_32()
|
||||||
model.part[p].refnum = gbs_stream.get_32()
|
model.part[p].refnum = gbs_stream.get_32()
|
||||||
model.part[p].texture = gbs_stream.get_string(32)
|
model.part[p].texture = gbs_stream.get_string(32).to_lower()
|
||||||
model.part[p].bumptexture = gbs_stream.get_string(32)
|
model.part[p].bumptexture = gbs_stream.get_string(32).to_lower()
|
||||||
model.part[p].falloff = gbs_stream.get_float()
|
model.part[p].falloff = gbs_stream.get_float()
|
||||||
model.part[p].blend = gbs_stream.get_float()
|
model.part[p].blend = gbs_stream.get_float()
|
||||||
model.part[p].flags = gbs_stream.get_32()
|
model.part[p].flags = gbs_stream.get_32()
|
||||||
@ -200,6 +201,8 @@ class ObjectManager:
|
|||||||
if not tmpDirectory.dir_exists("res://tmp"):
|
if not tmpDirectory.dir_exists("res://tmp"):
|
||||||
tmpDirectory.make_dir("res://tmp")
|
tmpDirectory.make_dir("res://tmp")
|
||||||
var stream = read_file_in_gzp(texture_file)
|
var stream = read_file_in_gzp(texture_file)
|
||||||
|
if stream == null:
|
||||||
|
return null
|
||||||
var tmpFile = File.new()
|
var tmpFile = File.new()
|
||||||
tmpFile.open("res://tmp/"+texture_file, File.WRITE)
|
tmpFile.open("res://tmp/"+texture_file, File.WRITE)
|
||||||
tmpFile.store_buffer(stream.data_array)
|
tmpFile.store_buffer(stream.data_array)
|
||||||
@ -209,7 +212,7 @@ class ObjectManager:
|
|||||||
var tex = ImageTexture.new()
|
var tex = ImageTexture.new()
|
||||||
img.load("res://tmp/"+texture_file)
|
img.load("res://tmp/"+texture_file)
|
||||||
tex.create_from_image(img)
|
tex.create_from_image(img)
|
||||||
# tmpDirectory.remove("res://tmp/"+texture_file)
|
tmpDirectory.remove("res://tmp/"+texture_file)
|
||||||
return tex
|
return tex
|
||||||
|
|
||||||
func load_model_mesh(model) -> MeshInstance:
|
func load_model_mesh(model) -> MeshInstance:
|
||||||
@ -220,13 +223,18 @@ class ObjectManager:
|
|||||||
st.begin(Mesh.PRIMITIVE_TRIANGLES)
|
st.begin(Mesh.PRIMITIVE_TRIANGLES)
|
||||||
var mat = SpatialMaterial.new()
|
var mat = SpatialMaterial.new()
|
||||||
mat.params_cull_mode = SpatialMaterial.CULL_DISABLED
|
mat.params_cull_mode = SpatialMaterial.CULL_DISABLED
|
||||||
|
mat.flags_unshaded = true
|
||||||
if model.tex[i]:
|
if model.tex[i]:
|
||||||
mat.albedo_texture = model.tex[i]
|
mat.albedo_texture = model.tex[i]
|
||||||
|
if mat.albedo_texture.has_alpha():
|
||||||
|
# mat.flags_transparent = true
|
||||||
|
# mat.params_blend_mode = SpatialMaterial.BLEND_MODE_MIX
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
mat.vertex_color_use_as_albedo = true
|
mat.vertex_color_use_as_albedo = true
|
||||||
st.set_material(mat)
|
st.set_material(mat)
|
||||||
|
|
||||||
assert(len(model.basepoint) % 3 == 0)
|
# assert(len(model.basepoint) % 3 == 0)
|
||||||
|
|
||||||
for j in range(len(model.part[i].triangle)):
|
for j in range(len(model.part[i].triangle)):
|
||||||
for k in range(3):
|
for k in range(3):
|
||||||
|
@ -16,7 +16,7 @@ _global_script_class_icons={
|
|||||||
[application]
|
[application]
|
||||||
|
|
||||||
config/name="GiantsEdit"
|
config/name="GiantsEdit"
|
||||||
run/main_scene="res://3d.tscn"
|
run/main_scene="res://start.tscn"
|
||||||
config/icon="res://icon.png"
|
config/icon="res://icon.png"
|
||||||
|
|
||||||
[display]
|
[display]
|
||||||
@ -62,6 +62,11 @@ mouse_input={
|
|||||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777244,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777244,"unicode":0,"echo":false,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
spawn_object={
|
||||||
|
"deadzone": 0.5,
|
||||||
|
"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
[rendering]
|
[rendering]
|
||||||
|
|
||||||
|
25
start.tscn
Normal file
25
start.tscn
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
[gd_scene load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://FileDialog.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[node name="Control" type="Control"]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="FileDialog" type="FileDialog" parent="."]
|
||||||
|
margin_right = 307.0
|
||||||
|
margin_bottom = 130.0
|
||||||
|
popup_exclusive = true
|
||||||
|
window_title = "Open Giants directory"
|
||||||
|
resizable = true
|
||||||
|
mode = 2
|
||||||
|
access = 2
|
||||||
|
current_dir = "/home/tasty/Jeux/GiantsEdit"
|
||||||
|
current_path = "/home/tasty/Jeux/GiantsEdit/"
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
[connection signal="dir_selected" from="FileDialog" to="FileDialog" method="_on_FileDialog_dir_selected"]
|
||||||
|
[connection signal="popup_hide" from="FileDialog" to="FileDialog" method="_on_FileDialog_popup_hide"]
|
||||||
|
[connection signal="ready" from="FileDialog" to="FileDialog" method="_on_FileDialog_ready"]
|
Loading…
Reference in New Issue
Block a user