controller partial
This commit is contained in:
		
							parent
							
								
									a471e868eb
								
							
						
					
					
						commit
						2c8f320441
					
				
					 13 changed files with 215 additions and 0 deletions
				
			
		
							
								
								
									
										10
									
								
								blends/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								blends/Makefile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
BLEND_FILES = $(shell find -type f -name '*.blend')
 | 
			
		||||
GLB_TARGETS = $(patsubst %.blend, ../godot/%.glb, $(BLEND_FILES))
 | 
			
		||||
 | 
			
		||||
all: ${GLB_TARGETS}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# --factory-startup disables addons (My custom addons are buggy and crash lots)
 | 
			
		||||
../godot/%.glb: %.blend
 | 
			
		||||
	mkdir -p $(shell dirname $@)
 | 
			
		||||
	blender -b --factory-startup $< --python-text export.py --export-path $@
 | 
			
		||||
							
								
								
									
										10
									
								
								blends/README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								blends/README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
# Automating exports
 | 
			
		||||
each blend file has a text block named "export.py" which is usually just the file in this directory
 | 
			
		||||
## Exporting from the Blender
 | 
			
		||||
- Create a new text block by opening "export.py" Make sure to relativize the path by clicking "File>>External Data>>Make paths relative"
 | 
			
		||||
Right now the script depends on the location of the script to find the root of the blends folder so it will not work if the export.py text block is internal
 | 
			
		||||
- Create a collection named "export" and move the objects to be exported inside
 | 
			
		||||
- Run the script inside Blender
 | 
			
		||||
## Exporting from CLI
 | 
			
		||||
- Save the blend file with a export collection as above
 | 
			
		||||
- Run `make`
 | 
			
		||||
							
								
								
									
										44
									
								
								blends/export.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								blends/export.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,44 @@
 | 
			
		|||
import bpy
 | 
			
		||||
from sys import argv
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
 | 
			
		||||
blends_folder = (Path(bpy.path.abspath(bpy.data.texts["export.py"].filepath))/"..").resolve()
 | 
			
		||||
blend_path = Path(bpy.path.abspath(bpy.context.blend_data.filepath)).relative_to(blends_folder)
 | 
			
		||||
godot_folder = (Path(bpy.path.abspath(bpy.data.texts["export.py"].filepath))/".."/".."/"godot").resolve()
 | 
			
		||||
export_file = str((godot_folder/blend_path).resolve()).replace(".blend", ".glb")
 | 
			
		||||
 | 
			
		||||
def export(path: str):
 | 
			
		||||
    bpy.ops.object.mode_set(mode="OBJECT")
 | 
			
		||||
    bpy.context.view_layer.update()
 | 
			
		||||
    # Clear the selection
 | 
			
		||||
    for target in bpy.context.selected_objects:
 | 
			
		||||
        target.select_set(False)
 | 
			
		||||
    collection = bpy.data.collections["export"]
 | 
			
		||||
    for target in collection.objects:
 | 
			
		||||
        target.select_set(True)
 | 
			
		||||
    bpy.context.view_layer.update()
 | 
			
		||||
    bpy.ops.export_scene.gltf(
 | 
			
		||||
        filepath=path,
 | 
			
		||||
        export_format="GLB",
 | 
			
		||||
        use_selection=True,
 | 
			
		||||
        export_colors=False,
 | 
			
		||||
        export_apply=True,
 | 
			
		||||
        export_animation_mode="NLA_TRACKS",
 | 
			
		||||
        export_anim_slide_to_zero=True,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
    i = next((i for i, arg in enumerate(argv) if arg == "--export-path"), None)
 | 
			
		||||
    if i is None:
 | 
			
		||||
        path = export_file
 | 
			
		||||
    else:
 | 
			
		||||
        path = str(Path(argv[i+1]).resolve())
 | 
			
		||||
    export(path)
 | 
			
		||||
    print("Export successful")
 | 
			
		||||
    if bpy.app.background:
 | 
			
		||||
        quit(0)
 | 
			
		||||
except SystemExit as e:
 | 
			
		||||
    quit(e.code)
 | 
			
		||||
except:
 | 
			
		||||
    import traceback
 | 
			
		||||
    traceback.print_exc()
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								blends/small_room.blend
									 (Stored with Git LFS)
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								blends/small_room.blend
									 (Stored with Git LFS)
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								blends/small_room.blend1
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								blends/small_room.blend1
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								godot/control_scheme/control_target_overlay.material
									 (Stored with Git LFS)
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								godot/control_scheme/control_target_overlay.material
									 (Stored with Git LFS)
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										63
									
								
								godot/control_scheme/controller.gd
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								godot/control_scheme/controller.gd
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
extends Node3D
 | 
			
		||||
 | 
			
		||||
@export var camera: Camera3D
 | 
			
		||||
@export var target: Node3D
 | 
			
		||||
@export var sensitivity := 0.01
 | 
			
		||||
 | 
			
		||||
func _input(event):
 | 
			
		||||
	if event is InputEventMouseMotion:
 | 
			
		||||
		rotate_view(event.relative*sensitivity)
 | 
			
		||||
 | 
			
		||||
func _process(_delta):
 | 
			
		||||
	transform.origin = target.global_position
 | 
			
		||||
	camera.global_position = %camera_spot.global_position
 | 
			
		||||
	camera.look_at(target.global_position)
 | 
			
		||||
 | 
			
		||||
func rotate_view(amount: Vector2):
 | 
			
		||||
	rotate_y(-amount.x)
 | 
			
		||||
	%rotate_helper.rotate_z(amount.y)
 | 
			
		||||
	%rotate_helper.rotation_degrees.z = clampf(%rotate_helper.rotation_degrees.z, -77, 77)
 | 
			
		||||
 | 
			
		||||
func set_target(node: Node3D, should_unset=true):
 | 
			
		||||
	if target != null and should_unset:
 | 
			
		||||
		pass
 | 
			
		||||
 | 
			
		||||
var old_material_props = null
 | 
			
		||||
 | 
			
		||||
func change_material(mesh: MeshInstance3D):
 | 
			
		||||
	if old_material_props != null:
 | 
			
		||||
		push_error("UH OOH!!! 628")
 | 
			
		||||
	old_material_props = []
 | 
			
		||||
	for i in range(mesh.get_surface_override_material_count()):
 | 
			
		||||
		var mat := mesh.get_active_material(i)
 | 
			
		||||
		if mat is BaseMaterial3D:
 | 
			
		||||
			old_material_props.append(mat.depth_draw_mode)
 | 
			
		||||
			mat.depth_draw_mode = BaseMaterial3D.DEPTH_DRAW_DISABLED
 | 
			
		||||
			push_next_pass(mat, preload("control_target_overlay.material"))
 | 
			
		||||
		else:
 | 
			
		||||
			old_material_props.append(null)
 | 
			
		||||
			push_error("Don't know how to handle shader material for", mesh)
 | 
			
		||||
			
 | 
			
		||||
func unchange_material(mesh: MeshInstance3D):
 | 
			
		||||
	if old_material_props == null:
 | 
			
		||||
		push_error("UH OOH!!! 629")
 | 
			
		||||
	for i in range(mesh.get_surface_override_material_count()):
 | 
			
		||||
		var mat := mesh.get_active_material(i)
 | 
			
		||||
		if mat is BaseMaterial3D:
 | 
			
		||||
			mat.depth_draw_mode = old_material_props[i]
 | 
			
		||||
			pop_next_pass(mat)
 | 
			
		||||
		else:
 | 
			
		||||
			push_error("Don't know how to handle shader material for", mesh)
 | 
			
		||||
 | 
			
		||||
func push_next_pass(m: Material, with: Material):
 | 
			
		||||
	if m.next_pass != null:
 | 
			
		||||
		push_next_pass(m.next_pass, with)
 | 
			
		||||
	else:
 | 
			
		||||
		m.next_pass = with
 | 
			
		||||
 | 
			
		||||
func pop_next_pass(m: Material):
 | 
			
		||||
	if m == null:
 | 
			
		||||
		return true
 | 
			
		||||
	if pop_next_pass(m.next_pass):
 | 
			
		||||
		m.next_pass = null
 | 
			
		||||
	return false
 | 
			
		||||
							
								
								
									
										14
									
								
								godot/control_scheme/controller.tscn
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								godot/control_scheme/controller.tscn
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
[gd_scene load_steps=2 format=3 uid="uid://drmb4sitb74fx"]
 | 
			
		||||
 | 
			
		||||
[ext_resource type="Script" path="res://control_scheme/controller.gd" id="1_h3pjb"]
 | 
			
		||||
 | 
			
		||||
[node name="controller" type="Node3D"]
 | 
			
		||||
top_level = true
 | 
			
		||||
script = ExtResource("1_h3pjb")
 | 
			
		||||
 | 
			
		||||
[node name="rotate_helper" type="Node3D" parent="."]
 | 
			
		||||
unique_name_in_owner = true
 | 
			
		||||
 | 
			
		||||
[node name="camera_spot" type="Marker3D" parent="rotate_helper"]
 | 
			
		||||
unique_name_in_owner = true
 | 
			
		||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0)
 | 
			
		||||
							
								
								
									
										2
									
								
								godot/controller_event_bus.gd
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								godot/controller_event_bus.gd
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
extends Node
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -14,6 +14,14 @@ config/name="Hurrmmm"
 | 
			
		|||
config/features=PackedStringArray("4.1", "Forward Plus")
 | 
			
		||||
config/icon="res://icon.svg"
 | 
			
		||||
 | 
			
		||||
[autoload]
 | 
			
		||||
 | 
			
		||||
ControllerEventBus="*res://controller_event_bus.gd"
 | 
			
		||||
 | 
			
		||||
[dotnet]
 | 
			
		||||
 | 
			
		||||
project/assembly_name="Hurrmmm"
 | 
			
		||||
 | 
			
		||||
[filesystem]
 | 
			
		||||
 | 
			
		||||
import/blender/enabled=false
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										
											BIN
										
									
								
								godot/small_room.glb
									 (Stored with Git LFS)
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								godot/small_room.glb
									 (Stored with Git LFS)
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										32
									
								
								godot/small_room.glb.import
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								godot/small_room.glb.import
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
[remap]
 | 
			
		||||
 | 
			
		||||
importer="scene"
 | 
			
		||||
importer_version=1
 | 
			
		||||
type="PackedScene"
 | 
			
		||||
uid="uid://bua7f25rpewkp"
 | 
			
		||||
path="res://.godot/imported/small_room.glb-40e857318362384b2412bafcaef8b669.scn"
 | 
			
		||||
 | 
			
		||||
[deps]
 | 
			
		||||
 | 
			
		||||
source_file="res://small_room.glb"
 | 
			
		||||
dest_files=["res://.godot/imported/small_room.glb-40e857318362384b2412bafcaef8b669.scn"]
 | 
			
		||||
 | 
			
		||||
[params]
 | 
			
		||||
 | 
			
		||||
nodes/root_type="Node3D"
 | 
			
		||||
nodes/root_name="Scene Root"
 | 
			
		||||
nodes/apply_root_scale=true
 | 
			
		||||
nodes/root_scale=1.0
 | 
			
		||||
meshes/ensure_tangents=true
 | 
			
		||||
meshes/generate_lods=true
 | 
			
		||||
meshes/create_shadow_meshes=true
 | 
			
		||||
meshes/light_baking=1
 | 
			
		||||
meshes/lightmap_texel_size=0.2
 | 
			
		||||
skins/use_named_skins=true
 | 
			
		||||
animation/import=true
 | 
			
		||||
animation/fps=30
 | 
			
		||||
animation/trimming=false
 | 
			
		||||
animation/remove_immutable_tracks=true
 | 
			
		||||
import_script/path=""
 | 
			
		||||
_subresources={}
 | 
			
		||||
gltf/embedded_image_handling=1
 | 
			
		||||
							
								
								
									
										23
									
								
								godot/tests/control_scheme/test_basic_controls.tscn
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								godot/tests/control_scheme/test_basic_controls.tscn
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
[gd_scene load_steps=4 format=3 uid="uid://70bb2yncbl"]
 | 
			
		||||
 | 
			
		||||
[ext_resource type="PackedScene" uid="uid://bua7f25rpewkp" path="res://small_room.glb" id="1_2ticn"]
 | 
			
		||||
[ext_resource type="PackedScene" uid="uid://drmb4sitb74fx" path="res://control_scheme/controller.tscn" id="2_dcvuq"]
 | 
			
		||||
 | 
			
		||||
[sub_resource type="Environment" id="Environment_f0m14"]
 | 
			
		||||
ambient_light_source = 2
 | 
			
		||||
ambient_light_color = Color(1, 1, 1, 1)
 | 
			
		||||
ambient_light_energy = 0.5
 | 
			
		||||
 | 
			
		||||
[node name="small_room" instance=ExtResource("1_2ticn")]
 | 
			
		||||
 | 
			
		||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="." index="3"]
 | 
			
		||||
environment = SubResource("Environment_f0m14")
 | 
			
		||||
 | 
			
		||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="WorldEnvironment" index="0"]
 | 
			
		||||
transform = Transform3D(1, 0, 0, 0, 0.933762, 0.357895, 0, -0.357895, 0.933762, 0, 1.43864, 1.81738)
 | 
			
		||||
 | 
			
		||||
[node name="controller" parent="." index="4" node_paths=PackedStringArray("camera", "target") instance=ExtResource("2_dcvuq")]
 | 
			
		||||
camera = NodePath("Camera3D")
 | 
			
		||||
target = NodePath("../grape")
 | 
			
		||||
 | 
			
		||||
[node name="Camera3D" type="Camera3D" parent="controller" index="1"]
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue