diff --git a/Makefile b/Makefile index 8a36dcf1..fe8d8184 100644 --- a/Makefile +++ b/Makefile @@ -343,7 +343,7 @@ clean: @-rm -f $(OBJS_EXT_DLL) @-rm -f $(OBJS) - @-rm $(shell find $(ENGINE_SRC_DIR) -name "*.$(PREFIX).o") $(shell find $(EXT_SRC_DIR) -name "*.$(PREFIX).o") $(shell find $(DEP_SRC_DIR) -name "*.$(PREFIX).o") + #@-rm $(shell find $(ENGINE_SRC_DIR) -name "*.$(PREFIX).o") $(shell find $(EXT_SRC_DIR) -name "*.$(PREFIX).o") $(shell find $(DEP_SRC_DIR) -name "*.$(PREFIX).o") ifneq (,$(findstring dreamcast,$(ARCH))) @-rm ./bin/dreamcast/build/* @@ -391,4 +391,4 @@ backup: #make CC=zig RENDERER=opengl clean #make CC=zig RENDERER=vulkan clean @-rm $(shell find $(ENGINE_SRC_DIR) -name "*.o") $(shell find $(EXT_SRC_DIR) -name "*.o") $(shell find $(DEP_SRC_DIR) -name "*.o") - $(7Z) a -r ../misc/backups/$(shell date +"%Y.%m.%d\ %H-%M-%S").7z . \ No newline at end of file + $(7Z) a -bsp1 -r ../misc/backups/$(shell date +"%Y.%m.%d\ %H-%M-%S").7z . \ No newline at end of file diff --git a/bin/data/config.json b/bin/data/config.json index 1ef07a1e..32c1bd5c 100644 --- a/bin/data/config.json +++ b/bin/data/config.json @@ -6,12 +6,12 @@ "matrix": { "reverseInfinite": true }, "lights": { "enabled": true, "useLightmaps": false, - "max": 32 + "max": 48 }, "shadows": { "enabled": true, - "update": 2, - "max": 16, + "update": 4, + "max": 24, "samples": 1 }, "textures": { @@ -38,8 +38,8 @@ } }, "rt": { - "size": [ 960, 540 ], - "filter": "NEAREST", + // "size": [ 1280, 720 ], + "filter": "nearest", "defaultRayBounds": [ 0.001, 1024.0 ], "alphaTestOffset": 0.001, "samples": 1, @@ -193,6 +193,7 @@ "interpolate": false, "debug draw": { "enabled": false, + "line width": 8, // "layer": "Gui", "rate": 0.0125 } diff --git a/bin/data/entities/burger.json b/bin/data/entities/burger.json new file mode 100644 index 00000000..2530600c --- /dev/null +++ b/bin/data/entities/burger.json @@ -0,0 +1,52 @@ +{ + "type": "Object", + "name": "Burger", + "ignore": false, + "import": "/model.json", + "assets": [ + // "/burger/burger.glb" + "/burger/burger/graph.json" + ], + "behaviors": [], + "transform": { + "position": [ -0.574743, 2.3547, -5.05161 ], + "rotation": { + "axis": [ 0, 1, 0 ], + "angle": 0 + }, + "scale": [ 1, 1, 1 ] + }, + "system": { + "hot reload": { + "enabled": true + } + }, + "metadata": { + "holdable": true, + + "physics": { + "gravity": [ 0, -9.81, 0 ], + "inertia": [ 0, 0, 0 ], + + "mass": 10, + "type": "bounding box", + "recenter": false + }, + "model": { + "exporter": { + "enabled": true, + "unwrap": false, + "optimize": false + }, + "baking": { + "enabled": false + }, + "renderer": { + "flip textures": false + }, + "lighting": { + "lightmap": false + } + } + } +} \ No newline at end of file diff --git a/bin/data/scenes/sh2_mcdonalds/door.json b/bin/data/entities/door.json similarity index 100% rename from bin/data/scenes/sh2_mcdonalds/door.json rename to bin/data/entities/door.json diff --git a/bin/data/entities/model.json b/bin/data/entities/model.json index ee22c83b..438f0083 100644 --- a/bin/data/entities/model.json +++ b/bin/data/entities/model.json @@ -38,7 +38,7 @@ }, "baking": { "enabled": true, - "resolution": 8192, + "resolution": 2048, "shadows": 1024, "layers": 1, "trigger": { "mode": "rendered", "quit": true }, @@ -46,7 +46,7 @@ "output": "./lightmap.%i.png", "settings": { "useInputMeshUvs": true, - "maxIterations": 16, + "maxIterations": 4, // "maxChartSize": 0, "padding": 4, // "texelsPerUnit": 0, @@ -59,19 +59,15 @@ } }, "renderer": { - "front face": "ccw", + "front face": "auto", "cull mode": "back", - "filter": "linear" - }, - "flags": { - "ATLAS": false, - "INVERT": false, - "TRANSFORM": false, - "SKINNED": false, - - "RENDER": true, - "SEPARATE": false, - "NORMALS": false + "filter": "linear", + + "atlas": false, + "invert": true, + "skinned": false, + "render": true, + "separate": false }, "lights": { "lightmap": "auto", diff --git a/bin/data/entities/player.json b/bin/data/entities/player.json index 0cc23dc8..8513c136 100644 --- a/bin/data/entities/player.json +++ b/bin/data/entities/player.json @@ -2,7 +2,8 @@ "name": "Player", "type": "Object", "behaviors": [ - "PlayerBehavior" + "PlayerBehavior", + "SoundEmitterBehavior" ], "ignore": false, "transform": { @@ -14,8 +15,11 @@ "scale": [ 1, 1, 1 ] }, "assets": [ + // { "filename": "./playerModel.json", "delay": 1 }, "./playerModel.json", - "./hands.json" + "./playerLight.json", + "./playerHands.json", + "./scripts/player.lua" ], "system": { "hot reload": { @@ -96,6 +100,9 @@ "clip" : [ 0.1, 64.0 ], "size" : [ 0, 0 ] } + }, + "use": { + "length": 5 } } } \ No newline at end of file diff --git a/bin/data/entities/hands.json b/bin/data/entities/playerHands.json similarity index 100% rename from bin/data/entities/hands.json rename to bin/data/entities/playerHands.json diff --git a/bin/data/entities/playerLight.json b/bin/data/entities/playerLight.json new file mode 100644 index 00000000..07ac1ade --- /dev/null +++ b/bin/data/entities/playerLight.json @@ -0,0 +1,32 @@ +{ + "import": "/light.json", + "ignore": false, + "assets": [ + ], + "transform": { + "track": "parent", + "position": [ 0, 1.7, 0 ] + }, + "system": { + "hot reload": { + "enabled": true + } + }, + "metadata": { + "light": { + "type": "point", + "color": [1, 1, 1], + "power": 15, + "fov": 90, + "bias": { + "constant": 1.25, + "slope": 1.75, + "shader": 0.000005 //0.000000005 + }, + "radius": [0.001, 0], + "resolution": 1024, + "shadows": false, + "static": false + } + } +} \ No newline at end of file diff --git a/bin/data/entities/playerModel.json b/bin/data/entities/playerModel.json index ab58f2a8..e257bda3 100644 --- a/bin/data/entities/playerModel.json +++ b/bin/data/entities/playerModel.json @@ -29,7 +29,11 @@ "track": true, "hide": true, "model": { - "lightmap": false, + "debug": { + "print": { + "animations": true + } + }, "exporter": { "enabled": false, "unwrap": false, @@ -38,17 +42,19 @@ "baking": { "enabled": false }, - "animation": "wank", - "print animations": true, - "flags": { - "ATLAS": false, - "INVERT": true, - "TRANSFORM": false, - "SKINNED": false, - - "RENDER": true, - "SEPARATE": false, - "NORMALS": false + "renderer": { + "cull mode": "back", + "filter": "linear" + }, + "lights": { + "lightmap": false + }, + "renderer": { + "flip textures": false, + "skinned": true + }, + "animations": { + "animation": "wank" } } } diff --git a/bin/data/entities/prop.json b/bin/data/entities/prop.json new file mode 100644 index 00000000..e5aa02b4 --- /dev/null +++ b/bin/data/entities/prop.json @@ -0,0 +1,14 @@ +{ + "assets": [], + "metadata": { + "holdable": true, + "physics": { + "gravity": [ 0, -9.81, 0 ], + "inertia": [10, 10, 10], + "mass": 10, + + "type": "bounding box", + "recenter": true + } + } +} \ No newline at end of file diff --git a/bin/data/scenes/sh2_mcdonalds/scripts/door.lua b/bin/data/entities/scripts/door.lua similarity index 84% rename from bin/data/scenes/sh2_mcdonalds/scripts/door.lua rename to bin/data/entities/scripts/door.lua index accdcce0..7a34240b 100644 --- a/bin/data/scenes/sh2_mcdonalds/scripts/door.lua +++ b/bin/data/entities/scripts/door.lua @@ -86,13 +86,20 @@ ent:bind( "tick", function(self) end ) -- on use ent:addHook( "entity:Use.%UID%", function( payload ) + if payload.user == ent:uid() then return end + +-- if timer:elapsed() <= 0.125 then return end +-- timer:reset() + + print("Processing use: " .. payload["uid"] .. " | " .. payload["depth"] ) + if state == 0 or state == 3 then state = 1 playSound("default_move") if payload.uid ~= nil then - local player = entities.get( payload.uid ) - local pTransform = player:getComponent("Transform") - local delta = transform.position - pTransform.position + local user = entities.get( payload.user ) + local userTransform = user:getComponent("Transform") + local delta = transform.position - userTransform.position local side = normal:dot(delta) if side > 0 then polarity = 1 @@ -100,7 +107,7 @@ ent:addHook( "entity:Use.%UID%", function( payload ) polarity = -1 end end - elseif state == 2 or state == 1 then + elseif state == 2 --[[or state == 1]] then state = 3 playSound("default_move") end diff --git a/bin/data/entities/scripts/player.lua b/bin/data/entities/scripts/player.lua new file mode 100644 index 00000000..5e922b8e --- /dev/null +++ b/bin/data/entities/scripts/player.lua @@ -0,0 +1,113 @@ +local timer = Timer.new() +if not timer:running() then timer:start(); end + +local scene = entities.currentScene() +local metadata = ent:getComponent("Metadata") +local transform = ent:getComponent("Transform") +local camera = ent:getComponent("Camera") +local cameraTransform = camera:getTransform() + +local playSound = function( key, loop ) + if not loop then loop = false end + local url = "/ui/" .. key .. ".ogg" + ent:queueHook("sound:Emit.%UID%", { + filename = string.resolveURI(url, metadata["system"]["root"]), + spatial = true, + streamed = true, + volume = "sfx", + loop = loop + }, 0) +end +local stopSound = function( key ) + local url = "/ui/" .. key .. ".ogg" + ent:queueHook("sound:Stop.%UID%", { + filename = string.resolveURI(url, metadata["system"]["root"]) + }, 0) +end + +local heldObject = { + uid = 0, + distance = 0, + smoothSpeed = 4, + scrollSpeed = 16, + momentum = Vector3f(0,0,0) +} + +-- on tick +ent:bind( "tick", function(self) + if heldObject.uid ~= 0 then + local wheel = inputs.analog("MouseWheel") + local mouse3 = inputs.key("Mouse3"); + if wheel ~= 0 then + heldObject.distance = heldObject.distance + (wheel / 120 * heldObject.scrollSpeed) * time.delta() + end + if mouse3 then + heldObject.rotate = not heldObject.rotate + end + + local prop = entities.get( heldObject.uid ) + local heldObjectTransform = prop:getComponent("Transform") + local heldObjectPhysicsState = prop:getComponent("PhysicsState") + if heldObject.rotate then + heldObjectTransform.orientation = transform.orientation + end + + local transform = cameraTransform:flatten() + local forward = transform.orientation:rotate( Vector3f(0,0,1) ) * heldObject.distance + + if heldObject.smoothSpeed ~= 0 then + local target = transform.position + forward + local offset = target - heldObjectTransform.position + local delta = offset * time.delta() * heldObject.smoothSpeed + local distance = delta:norm() + + if distance > 0.001 then + heldObjectTransform.position = heldObjectTransform.position + delta + heldObject.momentum = offset * 1000 + else + heldObjectTransform.position = target + end + else + heldObjectTransform.position = transform.position + forward + end + end +end ) +-- on use +ent:addHook( "entity:Use.%UID%", function( payload ) + if payload.user ~= ent:uid() then return end + + local validUse = false + + if heldObject.uid == 0 then + local prop = entities.get( payload.uid ) + local propMetadata = prop:getComponent("Metadata") + if propMetadata["holdable"] then + validUse = true + local offset = transform.position - prop:getComponent("Transform").position + + heldObject.uid = payload.uid + heldObject.distance = offset:norm() + + prop:getComponent("PhysicsState"):enableGravity(false) + end + elseif heldObject.uid ~= 0 then + validUse = true + local prop = entities.get( heldObject.uid ) + local heldObjectPhysicsState = prop:getComponent("PhysicsState") + heldObjectPhysicsState:enableGravity(true) + heldObjectPhysicsState:applyImpulse( heldObject.momentum ) + + heldObject.uid = 0 + heldObject.distance = 0 + heldObject.momentum = Vector3f(0,0,0) + elseif payload.uid ~= 0 then + local hit = entities.get( heldObject.uid ) + validUse = not string.match( hit:name(), "/^worldspawn_/" ) + end + + if validUse then + playSound("select") + else + playSound("deny") + end +end ) \ No newline at end of file diff --git a/bin/data/scenes/construct/gm_construct.json b/bin/data/scenes/construct/gm_construct.json index f873f893..aee8ef86 100644 --- a/bin/data/scenes/construct/gm_construct.json +++ b/bin/data/scenes/construct/gm_construct.json @@ -8,12 +8,11 @@ "model": { "baking": { "enabled": true, - "resolution": 1024, + "resolution": 2048, "settings": { - // "useInputMeshUvs": false + "useInputMeshUvs": false } }, - "cull mode": "none", "tags": { "/^worldspawn/": { "physics": { "type": "mesh", "static": true }, diff --git a/bin/data/scenes/construct/player.json b/bin/data/scenes/construct/player.json index c1656ce9..38f04797 100644 --- a/bin/data/scenes/construct/player.json +++ b/bin/data/scenes/construct/player.json @@ -4,16 +4,5 @@ // { "filename": "/gui/hud/hud.json", "delay": 0 } ], "metadata": { - "overlay": { - "floating": true - }, - "collider": true, - "light": { - "should": false, - "color": [1, 1, 1], - "position": [ 0, 2.5, 0 ], - "power": 1, - "radius": [0.001, 32] - } } } \ No newline at end of file diff --git a/bin/data/scenes/construct/scene.json b/bin/data/scenes/construct/scene.json index 218eae21..fc0e9f8b 100644 --- a/bin/data/scenes/construct/scene.json +++ b/bin/data/scenes/construct/scene.json @@ -2,7 +2,8 @@ "import": "/scene.json", "assets": [ "./audio/soundscape/ambience.ogg", - "./loading.json" + "./gm_construct.json" + // "./loading.json" ], "system": { "hot reload": { diff --git a/bin/data/scenes/cornell/cornell.json b/bin/data/scenes/cornell/cornell.json index 60a8bd05..ef52aec9 100644 --- a/bin/data/scenes/cornell/cornell.json +++ b/bin/data/scenes/cornell/cornell.json @@ -19,11 +19,6 @@ "useInputMeshUvs": false } }, - "renderer": { - "front face": "cw", - "cull mode": "back", - "filter": "linear" - }, "tags": { "/^Mesh_/": { "physics": { "type": "mesh", "static": true }, diff --git a/bin/data/scenes/mcdonalds/craeture.json b/bin/data/scenes/mcdonalds/craeture.json deleted file mode 100644 index 9a3f7b7a..00000000 --- a/bin/data/scenes/mcdonalds/craeture.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "Craeture", - "behaviors": [ "CraetureBehavior" ], - "assets": [ - "./textures/craeture.jpg" - ], - "transform": { - "position": [9.62326, 1.1872, -40.8126], - "scale": [8, 8, 8] - }, - "metadata": { - "model": { - "cull mode": "none" - } - } -} \ No newline at end of file diff --git a/bin/data/scenes/mcdonalds/door.json b/bin/data/scenes/mcdonalds/door.json deleted file mode 100644 index 4da4924a..00000000 --- a/bin/data/scenes/mcdonalds/door.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "assets": ["./scripts/door.lua"], - "metadata": { - "physics": { - "type": "bounding box", - "recenter": true - } - } -} \ No newline at end of file diff --git a/bin/data/scenes/mcdonalds/loading.json b/bin/data/scenes/mcdonalds/loading.json deleted file mode 100644 index 0ec6c59c..00000000 --- a/bin/data/scenes/mcdonalds/loading.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "Gui: Loading", - "type": "Object", - "behaviors": [ - // "GuiBehavior" - ], - "assets": [ - { "filename": "./mcdonalds.json", "delay": 0 } - ], - "ignore": false, - "transform": { - "position": [ -0.830591, -0.699509, 0 ], - "rotation": { - "axis": [ 1, 0, 0 ], - "angle": 0 - }, - "scale": [ 0.258737, 0.115371, 1 ] - }, - "metadata": { - "uv": [ 0, 0, 1, 1 ], - "color": [ 1, 1, 1, 0.1 ], - "location": "", - "scaling": "relative", - "text settings": { - "stroke": [ 1, 0.749, 0.368, 1 ], - "color": [ 1, 0.749, 0.368, 1 ], - - "string": "Loading...", - "string1": "コマンド" - } - } -} \ No newline at end of file diff --git a/bin/data/scenes/mcdonalds/marker.json b/bin/data/scenes/mcdonalds/marker.json deleted file mode 100644 index e724cc23..00000000 --- a/bin/data/scenes/mcdonalds/marker.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "Marker", - "type": "Gui", - "ignore": false, - "transform": { - "position": [ 0, 0, 0 ], - "rotation": { - "axis": [ 1, 0, 0 ], - "angle": 0 - }, - "scale": [ 1, 1, 1 ] - }, - "metadata": { - "uv": [ 0, 0, 1, 1 ], - "color": [ 1, 1, 1, 0.8 ], - "location": "", - "scaling": [ 1, 1 ], - "world": true, - "gui layer": false - }, - "assets": [ - "https://cdn..xyz//unity/Android/sprite/sprite_magiccircle_in2.png" - ] -} \ No newline at end of file diff --git a/bin/data/scenes/mcdonalds/mcdonalds.json b/bin/data/scenes/mcdonalds/mcdonalds.json deleted file mode 100644 index c30e80dd..00000000 --- a/bin/data/scenes/mcdonalds/mcdonalds.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "import": "/model.json", - "assets": [ - // { "filename": "./static.json", "delay": 8 }, - - // { "filename": "./models/mcdonalds.glb" } - { "filename": "./models/mcdonalds/graph.json" } - - // { "filename": "./models/mini_mcd.glb" } - // { "filename": "./models/mini_mcd/graph.json" } - - // { "filename": "/cornell/cornell.glb" } - // { "filename": "/cornell/cornell/graph.json" } - ], - "metadata": { - "model": { - "baking": { - "enabled": true, - "resolution": 2048, - "settings": { - "useInputMeshUvs": false - } - }, - "renderer": { - "front face": "cw", - "cull mode": "back", - "filter": "linear" - }, - "tags": { - "/^worldspawn/": { - "physics": { "type": "mesh", "static": true }, - "grid": { "size": [4,1,4], "epsilon": 1.0, "cleanup": true, "print": true }, - "optimize mesh": { "simplify": 0 }, - "unwrap mesh": true - }, - "info_player_spawn": { "action": "attach", "filename": "./player.json", "preserve orientation": true }, - "cornellBox.000": { - "transform": { "position": [ 0, -2, -75 ], "scale": [ 3, 3, 3 ] } - }, - - "func_door_rotating_5409": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5487": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle": 1.570795, "normal": [ 1,0,0] } } }, - "func_door_rotating_5495": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle": 1.570795, "normal": [ 1,0,0] } } }, - "func_door_rotating_5568": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5568": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5576": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5584": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5656": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle": 1.570795, "normal": [ 1,0,0] } } }, - "func_door_rotating_5664": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5689": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5698": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5712": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - - "func_physbox_5212": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_physbox_5548": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_physbox_5931": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - - "tools/toolsnodraw": { "material": { "base": [0, 0, 0, 0] } } - } - } - } -} \ No newline at end of file diff --git a/bin/data/scenes/mcdonalds/player.json b/bin/data/scenes/mcdonalds/player.json deleted file mode 100644 index e2c6058c..00000000 --- a/bin/data/scenes/mcdonalds/player.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "import": "/player.json", - "assets": [ - // { "filename": "/gui/hud/hud.json", "delay": 0 } - ], - "system": { - }, - "metadata": { - } -} \ No newline at end of file diff --git a/bin/data/scenes/mcdonalds/scene.json b/bin/data/scenes/mcdonalds/scene.json deleted file mode 100644 index c949a3cd..00000000 --- a/bin/data/scenes/mcdonalds/scene.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "import": "/scene.json", - "assets": [ - "./audio/soundscape/ambience.ogg", - // "./loading.json", - "./mcdonalds.json", - "./static.json" - ], - "system": { - "hot reload": { - "enabled": true - }, - "renderer": { - "shader": { - "mode": 1, - "scalar": 16, - "parameters": [ 0, 0, 0, "time" ], - "frame accumulate limit": 0 - }, - "clear values": [ - [ 1, 1, 1, 0 ] - ] - } - }, - "metadata": { - "menus": { - "pause": "/gui/pause/menu.json" - }, - "bloom": { - "scale": 6.0, - "strength": 0.125, - "sigma": 0.125, - "samples": 8 - }, - "light": { - "exposure": 1.0, - "gamma": 1.0, - "brightnessThreshold": 1.2, - // "ambient": [ 0, 0, 0 ], - "ambient": [ 0.025, 0.025, 0.025 ], - // "ambient": [ 0.075, 0.075, 0.075 ], - // "ambient": [ 0.1, 0.1, 0.1 ], - // "ambient": [ 0.4, 0.4, 0.4 ], - - "fog-": { - "color": [ 0.5, 0.5, 0.5 ], - "range": [ 16, 32 ], - "step scale": 2, - "absorbtion": 0.01, - "density": { - "threshold": 0.35, - "multiplier": 5.0, - "scale": 25.0, - "offset": [0, -1, 1], - "timescale": 8 - } - }, - "should": true, - "shadows": true - }, - "noise": { - "size": [ 32, 32, 32 ] - }, - "vxgi": { - /* - "limiter": 1, - "size": 96, - "dispatch": 8, - "cascades": 2, - "cascadePower": 4, - "voxelizeScale": 1, - "shadows": 0, - */ - "occlusionFalloff": 2, - "traceStartOffsetFactor": 1, - "granularity": 2, - "extents": { - "min": [ -1.5, -1.5, -1.5 ], - "max": [ 1.5, 1.5, 1.5 ] - } - }, - "rt": { - "defaultRayBounds": [ 0.001, 1024.0 ], - "alphaTestOffset": 1.125, - "samples": 1, - "paths": 1, - "frameAccumulationMinimum": 0 - } - } -} \ No newline at end of file diff --git a/bin/data/scenes/mcdonalds/scripts/door.lua b/bin/data/scenes/mcdonalds/scripts/door.lua deleted file mode 100644 index ce18d5c1..00000000 --- a/bin/data/scenes/mcdonalds/scripts/door.lua +++ /dev/null @@ -1,110 +0,0 @@ -local scene = entities.currentScene() -local controller = entities.controller() - -local timer = Timer.new() -if not timer:running() then - timer:start(); -end - -local polarity = 1 -local state = 0 -local targetAlpha = 1 -local alpha = 0 -local target = Vector3f(0,0,0) -local transform = ent:getComponent("Transform") -local metadata = ent:getComponent("Metadata") -local speed = metadata["speed"] or 1.0 -local normal = Vector3f(0,0,-1) -if metadata["normal"] ~= nil then - local sign = -1 - if metadata["angle"] < 0 then sign = 1 end - normal = Vector3f( metadata["normal"][1] * sign, metadata["normal"][2] * sign, metadata["normal"][3] * sign ):normalize() -end -local starting = Quaternion(transform.orientation) -local ending = transform.orientation:multiply(Quaternion.axisAngle( Vector3f(0,1,0), metadata["angle"] )) -local soundEmitter = ent:loadChild("./sound.json",true) -local playSound = function( key, loop ) - if not loop then loop = false end - local url = "/door/" .. key .. ".ogg" - soundEmitter:queueHook("sound:Emit.%UID%", { - filename = string.resolveURI(url, metadata["system"]["root"]), - spatial = true, - streamed = true, - volume = "sfx", - loop = loop - }, 0) -end -local stopSound = function( key ) - local url = "/door/" .. key .. ".ogg" - soundEmitter:queueHook("sound:Stop.%UID%", { - filename = string.resolveURI(url, metadata["system"]["root"]) - }, 0) -end -local playSoundscape = function( key ) - local url = "/soundscape/" .. key .. ".ogg" - soundEmitter:queueHook("sound:Emit.%UID%", { - filename = string.resolveURI(url, metadata["system"]["root"]), - spatial = false, - volume = "sfx", - loop = true, - streamed = true - }, 0) -end -local stopSoundscape = function( key ) - local url = "/soundscape/" .. key .. ".ogg" - soundEmitter:queueHook("sound:Stop.%UID%", { - filename = string.resolveURI(url, metadata["system"]["root"]) - }, 0) -end -soundEmitter:getComponent("Transform"):setReference( transform ) --- on tick -ent:bind( "tick", function(self) --- transform.orientation = starting:slerp( ending, math.cos(time.current() * speed) * 0.5 + 0.5 ) - if state == 1 then - alpha = alpha + time.delta() * speed - - if alpha > targetAlpha then - state = 2 - alpha = targetAlpha - playSound("default_stop") - end - - end - if state == 3 then - alpha = alpha - time.delta() * speed - - if alpha < 0 then - state = 0 - alpha = 0 - playSound("default_stop") - end - end - - if state > 0 then - transform.orientation = starting:slerp( ending, alpha * polarity ) - end -end ) --- on use -ent:addHook( "entity:Use.%UID%", function( payload ) - if state == 0 then - state = 1 - playSound("default_move") - if payload.uid ~= nil then - local player = entities.get( payload.uid ) - local pTransform = player:getComponent("Transform") - local delta = transform.position - pTransform.position - local side = normal:dot(delta) - if side > 0 then - polarity = 1 - elseif side < 0 then - polarity = -1 - end - end - io.print(ent:name()) - end - if state == 2 then - state = 3 - playSound("default_move") - end - io.print( state, json.encode( payload ) ) -end ) \ No newline at end of file diff --git a/bin/data/scenes/mcdonalds/scripts/realign.lua b/bin/data/scenes/mcdonalds/scripts/realign.lua deleted file mode 100644 index 84527d13..00000000 --- a/bin/data/scenes/mcdonalds/scripts/realign.lua +++ /dev/null @@ -1,22 +0,0 @@ -local scene = entities.currentScene() -local controller = entities.controller() - -local timer = Timer.new() -if not timer:running() then - timer:start(); -end - -local transform = ent:getComponent("Transform") --- on tick -ent:bind( "tick", function(self) - local offset = Vector3f(0,0,0) - if window.keyPressed("J") then offset.x = offset.x - time.delta() end - if window.keyPressed("L") then offset.x = offset.x + time.delta() end - if window.keyPressed("N") then offset.y = offset.y - time.delta() end - if window.keyPressed("M") then offset.y = offset.y + time.delta() end - if window.keyPressed("I") then offset.z = offset.z - time.delta() end - if window.keyPressed("K") then offset.z = offset.z + time.delta() end - if offset:magnitude() > 0.0001 then - transform.position = transform.position + offset - end -end ) \ No newline at end of file diff --git a/bin/data/scenes/mcdonalds/scripts/static.lua b/bin/data/scenes/mcdonalds/scripts/static.lua deleted file mode 100644 index 085af29f..00000000 --- a/bin/data/scenes/mcdonalds/scripts/static.lua +++ /dev/null @@ -1,90 +0,0 @@ -local scene = entities.currentScene() -local controller = entities.controller() - -local timer = Timer.new() -if not timer:running() then - timer:start(); -end --- release control ---[[ -hooks.call("window:Mouse.CursorVisibility", { state = true }) -hooks.call("window:Mouse.Lock", {}); -]] --- on tick -ent:bind( "tick", function(self) - -- update static effect - local metadatas = { - ent = ent:getComponent("Metadata"), - scene = scene:getComponent("Metadata") - } - local transforms = { - ent = ent:getComponent("Transform"), - controller = controller:getComponent("Transform") - } - local distanceSquared = transforms.controller.position:distance( transforms.ent.position ) - distanceSquared = distanceSquared * distanceSquared - if type(metadatas.ent["static"]["scale"]) == "number" then - distanceSquared = distanceSquared * metadatas.ent["static"]["scale"] - end - local lo = type(metadatas.ent["static"]["range"][1]) == "number" and metadatas.ent["static"]["range"][1] or 0.1 - local hi = type(metadatas.ent["static"]["range"][2]) == "number" and metadatas.ent["static"]["range"][2] or 0.5 - local staticBlend = distanceSquared > 1 and 1.0 / distanceSquared or 1.0 - staticBlend = math.clamp( staticBlend, lo, hi ) - - local flicker = type(metadatas.ent["static"]["flicker"]) == "number" and metadatas.ent["static"]["flicker"] or 0.001 - local pieces = type(metadatas.ent["static"]["pieces"]) == "number" and metadatas.ent["static"]["pieces"] or 1000 - - local payload = { - mode = 2, - parameters = { - [1] = flicker, - [2] = pieces, - [3] = staticBlend, - [4] = "time" - } - } - scene:callHook("shader:Update.%UID%", payload) -end ) - ---[[ -local hud = ent:loadChild("/hud.json", true) -hud:bind( "tick", function(self) - -- update distance HUD element - if timer:elapsed() <= 0.0125 then return end - timer:reset() - - local metadata = self:getComponent("Metadata") - local transforms = { - controller = controller:getComponent("Transform"), - source = ent:getComponent("Transform") - } - local distance = transforms.controller.position:distance( transforms.source.position ) - --distance = string.si( distance, "m" ) - local maximum = 40 - local value = math.floor(distance/maximum * 100) - if value >= 100 then value = 100 end - distance = "Sanity: " .. value .. "%" - --distance = math.floor((15-distance)/15 * 100) .. "%" - if metadata["text settings"]["string"] ~= distance then - self:callHook( "gui:UpdateString.%UID%", { - string = distance - } ) - end -end ) -]] ---[[ -local marker = ent:loadChild("./marker.json", true) -marker:bind( "tick", function(self) - local transform = marker:getComponent("Transform") - local parentTransform = ent:getComponent("Transform") - local controllerTransform = controller:getComponent("Transform") - - local controllerCamera = controller:getComponent("Camera") - local controllerCameraTransform = controllerCamera:getTransform() - - transform.position = parentTransform.position + Vector3f(0,3,0) - transform.orientation = Quaternion.lookAt( transform.position - controllerTransform.position, Vector3f(0,1,0) ) - -- transform.orientation = transform.orientation:normalize() - -- transform.model = controllerCamera:getProjection() * controllerCamera:getView() * Matrix4f.translate( transform.position ) * transform.orientation:matrix() -end ) -]] \ No newline at end of file diff --git a/bin/data/scenes/mcdonalds/sound.json b/bin/data/scenes/mcdonalds/sound.json deleted file mode 100644 index 351f92fe..00000000 --- a/bin/data/scenes/mcdonalds/sound.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "type": "Object", - "name": "Sound Emitter", - "ignore": false, - "assets": [ - ], - "behaviors": [ - "SoundEmitterBehavior" - ], - "transform": { - "reference": true - }, - "system": { - "hot reload": { - "enabled": true - }, - "defaults": { - "render": true, - "asset load": true - }, - "load": { - "ignore": true - } - }, - "metadata": { - "audio": { - "spatial": true, - "loop": false, - "volume": 1, - "rolloffFactor": 0.5, - "epsilon": 0.5 - } - } -} \ No newline at end of file diff --git a/bin/data/scenes/mcdonalds/static.json b/bin/data/scenes/mcdonalds/static.json deleted file mode 100644 index e02750f9..00000000 --- a/bin/data/scenes/mcdonalds/static.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "type": "Object", - "name": "Static Emitter", - "ignore": false, - "assets": [ - "/overworld/static.ogg", - "./scripts/static.lua" - ], - "behaviors": [ - "SoundEmitterBehavior" - ], - "transform": { - "position": [ -13.4342, 2.43658, 298.797 ], - "rotation": { - "axis": [ 0, 1, 0 ], - "angle": 0 - }, - "scale": [ 1, 1, 1 ] - }, - "system": { - "hot reload": { - "enabled": true - }, - "defaults": { - "render": true, - "asset load": true - }, - "load": { - "ignore": true - } - }, - "metadata": { - "audio": { - "spatial": true, - "loop": true, - "streamed": false, - "volume": 1.6, - "rolloffFactor": 2 - }, - "static": { - "range": [ 0.0025, 1 ], - "flicker": 0.5, - "pieces": 16, - "scale": 0.4 - }, - "distance": false - } -} \ No newline at end of file diff --git a/bin/data/scenes/sh2_mcdonalds/player.json b/bin/data/scenes/sh2_mcdonalds/player.json index f41a4d75..171152e0 100644 --- a/bin/data/scenes/sh2_mcdonalds/player.json +++ b/bin/data/scenes/sh2_mcdonalds/player.json @@ -1,9 +1,6 @@ { "import": "/player.json", - "assets": [ - // { "filename": "/gui/hud/hud.json", "delay": 0 } - "./playerLight.json" - ], + "assets": [], "metadata": { } } \ No newline at end of file diff --git a/bin/data/scenes/sh2_mcdonalds/prop.json b/bin/data/scenes/sh2_mcdonalds/prop.json deleted file mode 100644 index 47b31635..00000000 --- a/bin/data/scenes/sh2_mcdonalds/prop.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "assets": [], - "metadata": { - "physics": { - "mass": 0, - "inertia": [0, 0, 0], - "type": "bounding box", - "recenter": true - } - } -} \ No newline at end of file diff --git a/bin/data/scenes/sh2_mcdonalds/scene.json b/bin/data/scenes/sh2_mcdonalds/scene.json index 981762df..71b7bbab 100644 --- a/bin/data/scenes/sh2_mcdonalds/scene.json +++ b/bin/data/scenes/sh2_mcdonalds/scene.json @@ -26,28 +26,31 @@ "pause": "/gui/pause/menu.json" }, "bloom": { - "scale": 1.0, - "strength": 1.0, - "sigma": 2.0, - "samples": 2 + "scale": 6.0, + "strength": 0.125, + "sigma": 0.125, + "samples": 8 }, "light": { "exposure": 1.0, "gamma": 1.0, "brightnessThreshold": 1.2, - - "ambient": [ 0.15, 0.15, 0.15 ], + // "ambient": [ 0, 0, 0 ], + // "ambient": [ 0.025, 0.025, 0.025 ], + // "ambient": [ 0.075, 0.075, 0.075 ], + "ambient": [ 0.1, 0.1, 0.1 ], + // "ambient": [ 0.4, 0.4, 0.4 ], "fog": { "color": [ 0.5, 0.5, 0.5 ], - "range": [ 8, 256 ], + "range": [ 16, 32 ], "step scale": 2, - "absorbtion": 0.07, + "absorbtion": 0.01, "density": { "threshold": 0.35, "multiplier": 5.0, "scale": 25.0, - "offset": [0.2, 0, 1], + "offset": [0, -1, 1], "timescale": 8 } }, @@ -55,7 +58,32 @@ "shadows": true }, "noise": { - "size": [ 16, 16, 16 ] + "size": [ 32, 32, 32 ] + }, + "vxgi": { + /* + "limiter": 1, + "size": 96, + "dispatch": 8, + "cascades": 2, + "cascadePower": 4, + "voxelizeScale": 1, + "shadows": 0, + */ + "occlusionFalloff": 2, + "traceStartOffsetFactor": 1, + "granularity": 2, + "extents": { + "min": [ -1.5, -1.5, -1.5 ], + "max": [ 1.5, 1.5, 1.5 ] + } + }, + "rt": { + "defaultRayBounds": [ 0.5, 1024.0 ], + "alphaTestOffset": 1.125, + "samples": 1, + "paths": 1, + "frameAccumulationMinimum": 0 } } } \ No newline at end of file diff --git a/bin/data/scenes/sh2_mcdonalds/sh2_mcdonalds.json b/bin/data/scenes/sh2_mcdonalds/sh2_mcdonalds.json index 748ba5b8..10efa881 100644 --- a/bin/data/scenes/sh2_mcdonalds/sh2_mcdonalds.json +++ b/bin/data/scenes/sh2_mcdonalds/sh2_mcdonalds.json @@ -7,28 +7,27 @@ // { "filename": "./models/sh_mcd/graph.json" } // { "filename": "./models/mcdonalds.glb" } - { "filename": "./models/mcdonalds/graph.json" } + { "filename": "./models/mcdonalds/graph.json" }, // { "filename": "./models/mini_mcd.glb" } // { "filename": "./models/mini_mcd/graph.json" } // { "filename": "/cornell/cornell.glb" } // { "filename": "/cornell/cornell/graph.json" } + + { "filename": "/burger.json" } ], "metadata": { "model": { "baking": { "enabled": true, - "resolution": 1024, + "resolution": 2048, "settings": { "useInputMeshUvs": false } }, "renderer": { - "front face": "cw", - "cull mode": "back", - "filter": "linear", - "alpha mode": "blend" + "filter": "linear" }, "tags": { "/^worldspawn/": { @@ -42,84 +41,31 @@ // "worldspawn_sh2": { "physics": { "type": "mesh", "static": true } }, "info_player_spawn": { "action": "attach", "filename": "./player.json", "preserve orientation": true }, - "func_door_rotating_5409": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5487": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle": 1.570795, "normal": [ 1,0,0] } } }, - "func_door_rotating_5495": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle": 1.570795, "normal": [ 1,0,0] } } }, - "func_door_rotating_5656": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle": 1.570795, "normal": [ 1,0,0] } } }, - "func_door_rotating_5664": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5689": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5698": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5712": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + "func_door_rotating_5409": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + "func_door_rotating_5487": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle": 1.570795, "normal": [ 1,0,0] } } }, + "func_door_rotating_5495": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle": 1.570795, "normal": [ 1,0,0] } } }, + "func_door_rotating_5656": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle": 1.570795, "normal": [ 1,0,0] } } }, + "func_door_rotating_5664": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + "func_door_rotating_5689": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + "func_door_rotating_5698": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + "func_door_rotating_5712": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_physbox_5212": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_physbox_5548": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_physbox_5931": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + "func_physbox_5212": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + "func_physbox_5548": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + "func_physbox_5931": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5568": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5576": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_door_rotating_5584": { "action": "load", "payload": { "import": "./door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + "func_door_rotating_5568": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + "func_door_rotating_5576": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + "func_door_rotating_5584": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + "/^func_door_/": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, - "func_physbox_5212": { "action": "load", "payload": { "import": "./prop.json" } }, - "func_physbox_5548": { "action": "load", "payload": { "import": "./prop.json" } }, - "func_physbox_5931": { "action": "load", "payload": { "import": "./prop.json" } }, - "func_physbox_multiplayer_5839": { "action": "load", "payload": { "import": "./prop.json" } }, - "func_physbox_multiplayer_5848": { "action": "load", "payload": { "import": "./prop.json" } }, - "func_physbox_multiplayer_5857": { "action": "load", "payload": { "import": "./prop.json" } }, - "func_physbox_multiplayer_5864": { "action": "load", "payload": { "import": "./prop.json" } }, - "func_physbox_multiplayer_5872": { "action": "load", "payload": { "import": "./prop.json" } }, - "func_physbox_multiplayer_5879": { "action": "load", "payload": { "import": "./prop.json" } }, - "func_physbox_multiplayer_5886": { "action": "load", "payload": { "import": "./prop.json" } }, - "func_physbox_multiplayer_5893": { "action": "load", "payload": { "import": "./prop.json" } }, - "func_physbox_multiplayer_5905": { "action": "load", "payload": { "import": "./prop.json" } }, - "func_physbox_multiplayer_5913": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5563": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5564": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5687": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5719": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5721": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5722": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5815": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5816": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5817": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5818": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5819": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5820": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_multiplayer_5821": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5227": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5373": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5374": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5375": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5545": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5546": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5565": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5566": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5591": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5675": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5680": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5681": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5682": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5683": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5684": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5685": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5696": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5707": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5723": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5749": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5750": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5760": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5764": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5787": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5807": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5808": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5809": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5810": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5814": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5822": { "action": "load", "payload": { "import": "./prop.json" } }, - "prop_physics_override_5824": { "action": "load", "payload": { "import": "./prop.json" } }, + "/^func_physbox/": { "action": "load", "payload": { "import": "/prop.json" } }, + "/^prop_physics/": { "action": "load", "payload": { "import": "/prop.json" } }, "tools/toolsnodraw": { "material": { "base": [0, 0, 0, 0] } }, - "materials/models/props_wasteland/prison_lamp001a": { "material": { "emissive": [0, 0, 0, 0] } } - } + "materials/models/props_wasteland/prison_lamp001a": { "material": { "emissive": [0, 0, 0, 0] } }, + "/alpha_mtl/": { "material": { "modeAlpha": "blend" } } + } } } } \ No newline at end of file diff --git a/bin/data/scenes/sm64/sm64.json b/bin/data/scenes/sm64/sm64.json index 3d9464b1..1da53c2e 100644 --- a/bin/data/scenes/sm64/sm64.json +++ b/bin/data/scenes/sm64/sm64.json @@ -14,7 +14,6 @@ } }, "renderer": { - "front face": "cw", "cull mode": "none", "filter": "nearest" }, @@ -27,8 +26,8 @@ }, "info_player_spawn": { "action": "attach", "filename": "./player.json" }, - "Material.071_574B138E_c.bmp": { "material": { "modeAlpha": "BLEND" } }, - "Material.070_41A41EE3_c.bmp": { "material": { "modeAlpha": "BLEND" } }, + "Material.071_574B138E_c.bmp": { "material": { "modeAlpha": "blend" } }, + "Material.070_41A41EE3_c.bmp": { "material": { "modeAlpha": "blend" } }, "light_sun": { "light": { "power": 25000 } } } diff --git a/bin/data/scenes/ss2/medsci.json b/bin/data/scenes/ss2/medsci.json index c940d22c..8a087076 100644 --- a/bin/data/scenes/ss2/medsci.json +++ b/bin/data/scenes/ss2/medsci.json @@ -11,20 +11,18 @@ // { "filename": "./models/micro_sci/graph.json" } // { "filename": "./models/msci.glb" } - // { "filename": "./models/msci/graph.json" } + { "filename": "./models/msci/graph.json" } // { "filename": "./models/medsci.glb" } - { "filename": "./models/medsci/graph.json" } + // { "filename": "./models/medsci/graph.json" } ], "metadata": { "model": { "baking": { "enabled": true, - "resolution": 1024 + "resolution": 2048 }, "renderer": { - "front face": "cw", - "cull mode": "back", "filter": "linear" }, "tags": { @@ -49,7 +47,12 @@ "prop_camera_103118": { /*"bake": false,*/ "action": "load", "payload": { "import": "./camera.json" } }, "func_movelinear_57637": { /*"bake": false,*/ "action": "load", "payload": { "import": "./lift.json", "metadata": { "delta": [ 0,8.6,0 ] } } }, "func_movelinear_82820": { /*"bake": false,*/ "action": "load", "payload": { "import": "./lift.json", "metadata": { "delta": [ 0,9.2,0 ] } } }, - "func_movelinear_103114": { /*"bake": false,*/ "action": "load", "payload": { "import": "./lift.json", "metadata": { "delta": [ 0,-3.0,0 ] } } } + "func_movelinear_103114": { /*"bake": false,*/ "action": "load", "payload": { "import": "./lift.json", "metadata": { "delta": [ 0,-3.0,0 ] } } }, + + "/^func_door_/": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [-1,0,0] } } }, + + "/^func_physbox/": { "action": "load", "payload": { "import": "/prop.json" } }, + "/^prop_physics/": { "action": "load", "payload": { "import": "/prop.json" } } } } } diff --git a/bin/data/scenes/ss2/scene.json b/bin/data/scenes/ss2/scene.json index 00296544..de5c3307 100644 --- a/bin/data/scenes/ss2/scene.json +++ b/bin/data/scenes/ss2/scene.json @@ -35,7 +35,8 @@ "gamma": 1.0, "brightnessThreshold": 1.2, - "ambient": [ 0.0, 0.0, 0.0 ], + // "ambient": [ 0.0, 0.0, 0.0 ], + "ambient": [ 0.1, 0.1, 0.2 ], "fog": { "color": [ 0.025, 0.025, 0.1 ], diff --git a/bin/data/shaders/common/vxgi.h b/bin/data/shaders/common/vxgi.h index 2b3b6605..82650c09 100644 --- a/bin/data/shaders/common/vxgi.h +++ b/bin/data/shaders/common/vxgi.h @@ -150,6 +150,7 @@ void indirectLighting() { indirectDiffuse += voxelConeTrace( ray, DIFFUSE_CONE_APERTURE ) * weight; weight = PI * 0.15f; } + // indirectDiffuse.rgb *= surface.material.albedo.rgb; surface.material.occlusion += 1.0 - clamp(indirectDiffuse.a, 0.0, 1.0); // outFragColor.rgb = indirectDiffuse.rgb; return; // outFragColor.rgb = vec3(surface.material.occlusion); return; @@ -160,10 +161,8 @@ void indirectLighting() { ray.direction = R; ray.origin = P; // + ray.direction; indirectSpecular = voxelConeTrace( ray, SPECULAR_CONE_APERTURE ); + // indirectSpecular.rgb *= surface.material.albedo.rgb; // outFragColor.rgb = indirectSpecular.rgb; return; - if ( length(indirectSpecular) < 0.0125 ) { - // indirectSpecular += (1.0 - indirectSpecular.a) * texture( samplerCubemaps[ubo.indexSkybox], R ) * SPECULAR_CONE_APERTURE; - } } surface.material.indirect = indirectDiffuse * DIFFUSE_INDIRECT_FACTOR + indirectSpecular * SPECULAR_INDIRECT_FACTOR; diff --git a/bin/data/shaders/raytrace/shader.ray-gen.glsl b/bin/data/shaders/raytrace/shader.ray-gen.glsl index 04c0581c..6a3e1384 100644 --- a/bin/data/shaders/raytrace/shader.ray-gen.glsl +++ b/bin/data/shaders/raytrace/shader.ray-gen.glsl @@ -13,9 +13,7 @@ layout (constant_id = 3) const uint CASCADES = 1; #define PBR 1 #define VXGI 0 #define RAYTRACE 1 -#define FOG 1 -#define FOG_RAY_MARCH 0 -#define FOG_BASIC 1 +#define FOG 0 #define BLOOM 0 #define WHITENOISE 0 #define MAX_TEXTURES TEXTURES @@ -98,7 +96,7 @@ float shadowFactor( const Light light, float def ) { ray.direction = light.position - ray.origin; float tMin = ubo.settings.rt.defaultRayBounds.x; - float tMax = length(ray.direction); + float tMax = length(ray.direction) - 0.0001; ray.direction = normalize(ray.direction); diff --git a/bin/dreamcast/config.json b/bin/dreamcast/config.json index df8ede35..c674c0b2 100644 --- a/bin/dreamcast/config.json +++ b/bin/dreamcast/config.json @@ -1,7 +1,7 @@ { "engine": { "scenes": { - "start": "SM64", + "start": "SS2", "meshes": { "interleaved": false }, "matrix": { "reverseInfinite": false }, "lights": { "enabled": false, diff --git a/engine/inc/uf/engine/object/payloads.h b/engine/inc/uf/engine/object/payloads.h index 944f3af4..7e48dda5 100644 --- a/engine/inc/uf/engine/object/payloads.h +++ b/engine/inc/uf/engine/object/payloads.h @@ -6,5 +6,14 @@ namespace pod { size_t uid{}; uf::Object* pointer = NULL; }; + + struct entitySpawn { + uf::stl::string filename; + uf::Serializer metadata; + + pod::Transform<> transform; + + pod::payloads::Entity parent; + }; } } \ No newline at end of file diff --git a/engine/inc/uf/ext/json/json.h b/engine/inc/uf/ext/json/json.h index b7b55888..1ae4f9fd 100644 --- a/engine/inc/uf/ext/json/json.h +++ b/engine/inc/uf/ext/json/json.h @@ -46,6 +46,8 @@ namespace ext { void UF_API forEach( const ext::json::Value& json, const std::function& function ); void UF_API forEach( const ext::json::Value& json, const std::function& function ); + template uf::stl::vector vector( const ext::json::Value& value ); + ext::json::Value UF_API reencode( const ext::json::Value& json, const ext::json::EncodingSettings& settings ); ext::json::Value& UF_API reencode( ext::json::Value& json, const ext::json::EncodingSettings& settings ); @@ -71,6 +73,16 @@ namespace ext { } } +template +uf::stl::vector ext::json::vector( const ext::json::Value& value ) { + uf::stl::vector res; + res.reserve( value.size() ); + ext::json::forEach( value, [&]( const ext::json::Value& value ){ + res.emplace_back( value.as() ); + }); + return res; +} + template T& ext::json::encode( const ext::json::Value& json, T& output, const ext::json::EncodingSettings& settings ) { // ext::json::Value json = ext::json::reencode( _json, settings ); diff --git a/engine/inc/uf/ext/reactphysics/reactphysics.h b/engine/inc/uf/ext/reactphysics/reactphysics.h index f0361cea..58894a09 100644 --- a/engine/inc/uf/ext/reactphysics/reactphysics.h +++ b/engine/inc/uf/ext/reactphysics/reactphysics.h @@ -92,6 +92,7 @@ namespace ext { // synchronize bullet transforms to engine transforms void UF_API syncFrom( float = 1 ); // apply impulse + void UF_API setImpulse( pod::PhysicsState&, const pod::Vector3f& = {} ); void UF_API applyImpulse( pod::PhysicsState&, const pod::Vector3f& ); // directly move a transform void UF_API applyMovement( pod::PhysicsState&, const pod::Vector3f& ); diff --git a/engine/inc/uf/utils/io/inputs.h b/engine/inc/uf/utils/io/inputs.h index de985e57..8278182c 100644 --- a/engine/inc/uf/utils/io/inputs.h +++ b/engine/inc/uf/utils/io/inputs.h @@ -125,6 +125,11 @@ namespace uf { constexpr key_t Num8 = UF_KEY("Num8"); constexpr key_t Num9 = UF_KEY("Num9"); constexpr key_t Num0 = UF_KEY("Num0"); + + constexpr key_t Mouse1 = UF_KEY("Mouse1"); + constexpr key_t Mouse2 = UF_KEY("Mouse2"); + constexpr key_t Mouse3 = UF_KEY("Mouse3"); + constexpr key_t MouseWheel = UF_KEY("MouseWheel"); }; namespace states { extern UF_API state_t LShift; @@ -228,6 +233,12 @@ namespace uf { extern UF_API state_t Num8; extern UF_API state_t Num9; extern UF_API state_t Num0; + + extern UF_API state_t Mouse1; + extern UF_API state_t Mouse2; + extern UF_API state_t Mouse3; + + extern UF_API analog_t MouseWheel; }; } namespace controller { @@ -296,5 +307,9 @@ namespace uf { extern UF_API state_t START; }; } + + state_t key( const uf::stl::string& ); + analog_t analog( const uf::stl::string& ); + analog2_t analog2( const uf::stl::string& ); } } \ No newline at end of file diff --git a/engine/inc/uf/utils/mesh/grid.h b/engine/inc/uf/utils/mesh/grid.h index 5c84470c..77269ca2 100644 --- a/engine/inc/uf/utils/mesh/grid.h +++ b/engine/inc/uf/utils/mesh/grid.h @@ -121,59 +121,4 @@ namespace uf { return partitioned; } } -} - -#if 0 -namespace uf { - class UF_API MeshGrid { - protected: - struct Node { - pod::Vector3f center = {}; // not necessary since we can easily calculate this on the fly in get() - pod::Vector3f extent = {}; // not necessary since this can be pre-computed on initialization() - #if 0 - size_t count = 0; - uint32_t* indices = NULL; - #else - uf::stl::vector indices; - #endif - }; - pod::Vector3ui m_size = {1,1,1}; - pod::Vector3f m_center = {}; - pod::Vector3f m_extent = {}; - uf::stl::vector m_nodes; - - void initialize( const pod::Vector3f&, const pod::Vector3f&, const pod::Vector3ui& ); - void destroy(); - - void allocate( Node&, size_t ); - Node& at( const pod::Vector3f& ); - const Node& at( const pod::Vector3f& ) const; - pod::Vector3f centroid( const pod::Vector3f&, const pod::Vector3f&, const pod::Vector3f& ) const; - - pod::Vector3i wrapIndex( size_t index ); - size_t unwrapIndex( const pod::Vector3i& ); - - void insert( uint32_t, uint32_t, uint32_t, const pod::Vector3f&, const pod::Vector3f&, const pod::Vector3f& ); - public: - ~MeshGrid(); - template - void initialize( const uf::Mesh& mesh, size_t = 1 ); - - template - void initialize( const uf::Mesh& mesh, const pod::Vector3ui& ); - - template - uf::stl::vector get() const; - - template - const uf::stl::vector& get( const pod::Vector3f& ) const; - - const pod::Vector3f& center() const; - const pod::Vector3f& extent() const; - - void analyze() const; - }; -}; - -#include "grid.inl" -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/engine/inc/uf/utils/mesh/grid.inl b/engine/inc/uf/utils/mesh/grid.inl deleted file mode 100644 index fc191d3d..00000000 --- a/engine/inc/uf/utils/mesh/grid.inl +++ /dev/null @@ -1,67 +0,0 @@ -#if 0 -template -void uf::MeshGrid::initialize( const uf::Mesh& mesh, size_t divisions ) { - return initialize( mesh, pod::Vector3ui{ divisions, divisions, divisions } ); -} -template -void uf::MeshGrid::initialize( const uf::Mesh& mesh, const pod::Vector3ui& size ) { - // calculate our extents - pod::Vector3f min = { std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max() }; - pod::Vector3f max = { -std::numeric_limits::max(), -std::numeric_limits::max(), -std::numeric_limits::max() }; - for ( auto& vertex : mesh.vertices ) { - auto& position = vertex.position; - min.x = std::min( position.x, min.x ); - min.y = std::min( position.z, min.y ); - min.z = std::min( position.y, min.z ); - - max.x = std::max( position.x, max.x ); - max.y = std::max( position.z, max.y ); - max.z = std::max( position.y, max.z ); - } - pod::Vector3f center = (max + min) * 0.5f; - pod::Vector3f extent = (max - min) * 0.5f; - // pre-generate nodes - initialize( center, extent, size ); - // fill our nodes - for ( size_t i = 0; i < mesh.indices.size() / 3; ++i ) { - // triangle face - auto& i1 = mesh.indices[i*3+0]; - auto& i2 = mesh.indices[i*3+1]; - auto& i3 = mesh.indices[i*3+2]; - // triangle positions - auto& v1 = mesh.vertices[i1].position; - auto& v2 = mesh.vertices[i2].position; - auto& v3 = mesh.vertices[i3].position; - - insert(i1, i2, i3, v1, v2, v3); - } -} - -template -uf::stl::vector uf::MeshGrid::get() const { -#if 0 - auto& node = get( point ); - uf::stl::vector indices(node.count); - for ( size_t i = 0; i < node.count; ++i ) indices[i] = node.indices[i]; - return indices; -#else - uf::stl::vector indices; - for ( auto& node : this->m_nodes ) { - indices.insert( indices.end(), node.indices.begin(), node.indices.end() ); - } - return indices; -#endif -} - -template -const uf::stl::vector& uf::MeshGrid::get( const pod::Vector3f& point ) const { -#if 0 - auto& node = get( point ); - uf::stl::vector indices(node.count); - for ( size_t i = 0; i < node.count; ++i ) indices[i] = node.indices[i]; - return indices; -#else - return at( point ).indices; -#endif -} -#endif \ No newline at end of file diff --git a/engine/src/engine/asset/asset.cpp b/engine/src/engine/asset/asset.cpp index bc8e1f8a..1f57a23d 100644 --- a/engine/src/engine/asset/asset.cpp +++ b/engine/src/engine/asset/asset.cpp @@ -40,6 +40,8 @@ namespace { std::mutex mutex; uint64_t uid = 0; struct Job { + typedef uf::stl::vector container_t; + uf::stl::string callback; uf::stl::string type; uf::Asset::Payload payload; @@ -49,37 +51,43 @@ namespace { uf::Asset uf::Asset::masterAssetLoader; bool uf::Asset::assertionLoad = true; +#define UF_ASSET_MULTITHREAD 1 + void uf::Asset::processQueue() { -// uf::thread::queue([&]{ - mutex.lock(); - auto jobs = std::move(this->getComponent>()); - while ( !jobs.empty() ) { - auto job = jobs.front(); - jobs.pop(); +#if UF_ASSET_MULTITHREAD + auto tasks = uf::thread::schedule(true, true); +#else + auto tasks = uf::thread::schedule(false, true); +#endif - uf::stl::string callback = job.callback; - uf::stl::string type = job.type; - uf::Asset::Payload payload = job.payload; + mutex.lock(); + auto jobs = std::move(this->getComponent()); + mutex.unlock(); - if ( payload.filename == "" || callback == "" ) continue; + for ( auto& job : jobs ) tasks.queue([=]{ + uf::stl::string callback = job.callback; + uf::stl::string type = job.type; + uf::Asset::Payload payload = job.payload; - uf::stl::string filename = type == "cache" ? this->cache(payload) : this->load(payload); + if ( payload.filename == "" || callback == "" ) return; + + uf::stl::string filename = type == "cache" ? this->cache(payload) : this->load(payload); - if ( callback != "" && filename != "" ) uf::hooks.call(callback, payload); - } - mutex.unlock(); -// }); + if ( callback != "" && filename != "" ) uf::hooks.call(callback, payload); + }); + + uf::thread::execute( tasks ); } void uf::Asset::cache( const uf::stl::string& callback, const uf::Asset::Payload& payload ) { mutex.lock(); - auto& jobs = this->getComponent>(); - jobs.push({ callback, "cache", payload }); + auto& jobs = this->getComponent(); + jobs.emplace_back(Job{ callback, "cache", payload }); mutex.unlock(); } void uf::Asset::load( const uf::stl::string& callback, const uf::Asset::Payload& payload ) { mutex.lock(); - auto& jobs = this->getComponent>(); - jobs.push({ callback, "load", payload }); + auto& jobs = this->getComponent(); + jobs.emplace_back(Job{ callback, "load", payload }); mutex.unlock(); } @@ -258,8 +266,8 @@ uf::stl::string uf::Asset::load(const uf::Asset::Payload& payload ) { #if UF_USE_OPENGL // combining mesh is only really a (negligent) gain on Vulkan // collision meshes still use separated meshes, so avoid having to duplicate a mesh for very little gains, if any - metadata[payload.filename]["flags"]["ATLAS"] = false; - metadata[payload.filename]["flags"]["SEPARATE"] = true; + metadata[payload.filename]["renderer"]["atlas"] = false; + metadata[payload.filename]["renderer"]["separate"] = true; #endif asset = uf::graph::load( filename, metadata[payload.filename] ); uf::graph::process( asset ); diff --git a/engine/src/engine/graph/decode.cpp b/engine/src/engine/graph/decode.cpp index 58352ed7..dde94ce9 100644 --- a/engine/src/engine/graph/decode.cpp +++ b/engine/src/engine/graph/decode.cpp @@ -225,27 +225,16 @@ namespace { }); // remove extraneous buffers - #if 0 + uf::stl::vector attributesKept = ext::json::vector(graph.metadata["decode"]["attributes"]); + #if 1 if ( !mesh.isInterleaved() ) { uf::stl::vector remove; remove.reserve(mesh.vertex.attributes.size()); for ( size_t i = 0; i < mesh.vertex.attributes.size(); ++i ) { auto& attribute = mesh.vertex.attributes[i]; - if ( attribute.descriptor.name == "position" ) continue; - if ( attribute.descriptor.name == "color" ) continue; - if ( attribute.descriptor.name == "uv" ) continue; - if ( attribute.descriptor.name == "st" ) continue; - - #if !UF_USE_OPENGL - if ( attribute.descriptor.name == "normal" ) continue; - if ( attribute.descriptor.name == "tangent" ) continue; - if ( graph.metadata["flags"]["SKINNED"].as() ) { - if ( attribute.descriptor.name == "joints" ) continue; - if ( attribute.descriptor.name == "weights" ) continue; - } - #endif - + if ( std::find( attributesKept.begin(), attributesKept.end(), attribute.descriptor.name ) != attributesKept.end() ) continue; remove.insert(remove.begin(), i); + // UF_MSG_DEBUG("Removing mesh attribute: {}", attribute.descriptor.name); } for ( auto& i : remove ) { mesh.buffers[mesh.vertex.attributes[i].buffer].clear(); @@ -258,7 +247,6 @@ namespace { #endif mesh.updateDescriptor(); - #if 0 // swap winding order if ( graph.metadata["decode"]["invert winding order"].as() ) { @@ -359,6 +347,14 @@ pod::Graph uf::graph::load( const uf::stl::string& filename, const uf::Serialize auto tasks = uf::thread::schedule(false); #endif + if ( !ext::json::isArray(graph.metadata["decode"]["attributes"]) ) { + #if UF_USE_OPENGL + graph.metadata["decode"]["attributes"] = uf::stl::vector({ "position", "uv", "st" }); + #else + graph.metadata["decode"]["attributes"] = uf::stl::vector({ "position", "color", "uv", "st", "tangent", "joints", "weights", "normal", "id" }); + #endif + } + tasks.queue([&]{ // load images UF_DEBUG_TIMER_MULTITRACE("Reading instances..."); diff --git a/engine/src/engine/graph/encode.cpp b/engine/src/engine/graph/encode.cpp index c851b83e..aa9e2854 100644 --- a/engine/src/engine/graph/encode.cpp +++ b/engine/src/engine/graph/encode.cpp @@ -154,7 +154,7 @@ namespace { if ( attribute.descriptor.name == "uv" ) continue; if ( attribute.descriptor.name == "st" ) continue; - if ( graph.metadata["flags"]["SKINNED"].as() ) { + if ( graph.metadata["renderer"]["skinned"].as() ) { if ( attribute.descriptor.name == "tangent" ) continue; if ( attribute.descriptor.name == "joints" ) continue; if ( attribute.descriptor.name == "weights" ) continue; diff --git a/engine/src/engine/graph/graph.cpp b/engine/src/engine/graph/graph.cpp index 64915bec..23ace1ac 100644 --- a/engine/src/engine/graph/graph.cpp +++ b/engine/src/engine/graph/graph.cpp @@ -88,8 +88,8 @@ void uf::graph::initializeGraphics( pod::Graph& graph, uf::Object& entity, uf::M graphic.device = &uf::renderer::device; graphic.material.device = &uf::renderer::device; - graphic.descriptor.frontFace = uf::renderer::enums::Face::CCW; - graphic.descriptor.cullMode = !(graph.metadata["flags"]["INVERT"].as()) ? uf::renderer::enums::CullMode::BACK : uf::renderer::enums::CullMode::FRONT; + graphic.descriptor.frontFace = graph.metadata["renderer"]["invert"].as(true) ? uf::renderer::enums::Face::CW : uf::renderer::enums::Face::CCW; + graphic.descriptor.cullMode = uf::renderer::enums::CullMode::BACK; auto tag = ::findTag( entity.getName(), graph ); if ( !ext::json::isObject( tag ) ) { @@ -100,6 +100,13 @@ void uf::graph::initializeGraphics( pod::Graph& graph, uf::Object& entity, uf::M const auto mode = uf::string::lowercase( tag["renderer"]["front face"].as() ); if ( mode == "cw" ) graphic.descriptor.frontFace = uf::renderer::enums::Face::CW; else if ( mode == "ccw" ) graphic.descriptor.frontFace = uf::renderer::enums::Face::CCW; + else if ( mode == "auto" ) { + if ( uf::matrix::reverseInfiniteProjection ) { + graphic.descriptor.frontFace = graph.metadata["renderer"]["invert"].as(true) ? uf::renderer::enums::Face::CW : uf::renderer::enums::Face::CCW; + } else { + graphic.descriptor.frontFace = graph.metadata["renderer"]["invert"].as(true) ? uf::renderer::enums::Face::CCW : uf::renderer::enums::Face::CW; + } + } else UF_MSG_WARNING("Invalid Face enum string specified: {}", mode); } if ( tag["renderer"]["cull mode"].is() ) { @@ -111,6 +118,15 @@ void uf::graph::initializeGraphics( pod::Graph& graph, uf::Object& entity, uf::M else UF_MSG_WARNING("Invalid CullMode enum string specified: {}", mode); } +/* +#if UF_USE_OPENGL + if ( !uf::matrix::reverseInfiniteProjection ) { + if ( graphic.descriptor.cullMode == uf::renderer::enums::CullMode::FRONT ) graphic.descriptor.cullMode = uf::renderer::enums::CullMode::BACK; + if ( graphic.descriptor.cullMode == uf::renderer::enums::CullMode::BACK ) graphic.descriptor.cullMode = uf::renderer::enums::CullMode::FRONT; + } +#endif +*/ + { // for ( auto& s : graph.samplers ) graphic.material.samplers.emplace_back( uf::graph::storage.samplers.map[s] ); // for ( auto pair : uf::graph::storage.samplers.map ) graphic.material.samplers.emplace_back( pair.second ); @@ -143,8 +159,8 @@ void uf::graph::initializeGraphics( pod::Graph& graph, uf::Object& entity, uf::M // standard pipeline uf::stl::string vertexShaderFilename = graph.metadata["shaders"]["vertex"].as("/graph/base.vert.spv"); { std::pair settings[] = { - { graph.metadata["flags"]["SKINNED"].as(), "skinned.vert" }, - { !graph.metadata["flags"]["SEPARATE"].as(), "instanced.vert" }, + { graph.metadata["renderer"]["skinned"].as(), "skinned.vert" }, + { !graph.metadata["renderer"]["separate"].as(), "instanced.vert" }, }; FOR_ARRAY(settings) if ( settings[i].first ) vertexShaderFilename = uf::string::replace( vertexShaderFilename, "vert", settings[i].second ); vertexShaderFilename = entity.resolveURI( vertexShaderFilename, root ); @@ -753,7 +769,7 @@ void uf::graph::process( pod::Graph& graph ) { uf::graph::reload(); // setup combined mesh if requested - if ( !(graph.metadata["flags"]["SEPARATE"].as()) ) { + if ( !(graph.metadata["renderer"]["separate"].as()) ) { graph.root.mesh = graph.meshes.size(); auto keyName = graph.name + "/" + graph.root.name; auto& mesh = uf::graph::storage.meshes[graph.meshes.emplace_back(keyName)]; @@ -974,7 +990,7 @@ void uf::graph::process( pod::Graph& graph, int32_t index, uf::Object& parent ) instance.model = model; instance.objectID = objectID; - instance.jointID = graph.metadata["flags"]["SKINNED"].as() ? 0 : -1; + instance.jointID = graph.metadata["renderer"]["skinned"].as() ? 0 : -1; bounds.min = uf::vector::min( bounds.min, instance.bounds.min ); bounds.max = uf::vector::max( bounds.max, instance.bounds.max ); @@ -987,7 +1003,7 @@ void uf::graph::process( pod::Graph& graph, int32_t index, uf::Object& parent ) drawCommand.instanceID = instanceID; } } - if ( (graph.metadata["flags"]["SEPARATE"].as()) && graph.metadata["flags"]["RENDER"].as() ) { + if ( (graph.metadata["renderer"]["separate"].as()) && graph.metadata["renderer"]["render"].as() ) { // uf::instantiator::bind("RenderBehavior", entity); uf::graph::initializeGraphics( graph, entity, mesh ); } @@ -1077,7 +1093,7 @@ void uf::graph::initialize( pod::Graph& graph ) { } void uf::graph::animate( pod::Graph& graph, const uf::stl::string& _name, float speed, bool immediate ) { - if ( !(graph.metadata["flags"]["SKINNED"].as()) ) return; + if ( !(graph.metadata["renderer"]["skinned"].as()) ) return; const uf::stl::string name = /*graph.name + "/" +*/ _name; // if ( graph.animations.count( name ) > 0 ) { if ( uf::graph::storage.animations.map.count( name ) > 0 ) { @@ -1119,7 +1135,7 @@ void uf::graph::update( pod::Graph& graph, float delta ) { #endif // no skins - if ( !(graph.metadata["flags"]["SKINNED"].as()) ) { + if ( !(graph.metadata["renderer"]["skinned"].as()) ) { return; } diff --git a/engine/src/engine/object/behaviors/graph.cpp b/engine/src/engine/object/behaviors/graph.cpp index 3c0d6f99..9c35b97d 100644 --- a/engine/src/engine/object/behaviors/graph.cpp +++ b/engine/src/engine/object/behaviors/graph.cpp @@ -61,7 +61,7 @@ void uf::GraphBehavior::initialize( uf::Object& self ) { uf::graph::initialize( graph ); - if ( graph.metadata["flags"]["SKINNED"].as() ) { + if ( graph.metadata["renderer"]["skinned"].as() ) { if ( metadata["model"]["animation"].is() ) { uf::graph::animate( graph, metadata["model"]["animation"].as() ); } @@ -79,7 +79,7 @@ void uf::GraphBehavior::tick( uf::Object& self ) { } /* Update animations */ if ( this->hasComponent() ) { auto& graph = this->getComponent(); - // if ( graph.metadata["flags"]["SKINNED"].as() ) uf::graph::update( graph ); + // if ( graph.metadata["renderer"]["skinned"].as() ) uf::graph::update( graph ); } if ( !this->hasComponent() ) return; @@ -106,7 +106,7 @@ void uf::GraphBehavior::tick( uf::Object& self ) { auto& shader = graphic.material.getShader("vertex"); auto& mesh = this->getComponent(); - if ( !(graph.metadata["flags"]["SEPARATE"].as()) ) { + if ( !(graph.metadata["renderer"]["separate"].as()) ) { uf::stl::vector instances( graph.nodes.size() ); for ( size_t i = 0; i < graph.nodes.size(); ++i ) { auto& node = graph.nodes[i]; @@ -114,7 +114,7 @@ void uf::GraphBehavior::tick( uf::Object& self ) { } shader.updateBuffer( (const void*) instances.data(), instances.size() * sizeof(pod::Matrix4f), graph.buffers.instance ); shader.execute( graphic, mesh.attributes.vertex.pointer ); - } else if ( graph.metadata["flags"]["SKINNED"].as() ) { + } else if ( graph.metadata["renderer"]["skinned"].as() ) { shader.execute( graphic, mesh.attributes.vertex.pointer ); } } @@ -122,7 +122,7 @@ void uf::GraphBehavior::tick( uf::Object& self ) { if ( graphic.material.hasShader("vertex") ) { auto& shader = graphic.material.getShader("vertex"); - if ( !(graph.metadata["flags"]["SEPARATE"].as()) ) { + if ( !(graph.metadata["renderer"]["separate"].as()) ) { uf::stl::vector instances( graph.nodes.size() ); for ( size_t i = 0; i < graph.nodes.size(); ++i ) { auto& node = graph.nodes[i]; @@ -151,7 +151,7 @@ void uf::GraphBehavior::tick( uf::Object& self ) { } } #if 0 - if ( graphic.material.hasShader("vertex") && !(graph.metadata["flags"]["SEPARATE"].as()) ) { + if ( graphic.material.hasShader("vertex") && !(graph.metadata["renderer"]["separate"].as()) ) { auto& shader = graphic.material.getShader("vertex"); uf::stl::vector instances( graph.nodes.size() ); for ( size_t i = 0; i < graph.nodes.size(); ++i ) { @@ -191,13 +191,13 @@ void uf::GraphBehavior::render( uf::Object& self ) { auto uniforms = graphic.getUniform(); pod::Uniform& uniform = *((pod::Uniform*) graphic.device->getBuffer(uniforms.buffer)); uniform = { - .modelView = !(graph.metadata["flags"]["SEPARATE"].as()) ? camera.getView() : camera.getView() * uf::transform::model( transform ), + .modelView = !(graph.metadata["renderer"]["separate"].as()) ? camera.getView() : camera.getView() * uf::transform::model( transform ), .projection = camera.getProjection(); }; graphic.updateUniform( (const void*) &uniform, sizeof(uniform) ); #else pod::Uniform uniform = { - .modelView = !(graph.metadata["flags"]["SEPARATE"].as()) ? camera.getView() : camera.getView() * uf::transform::model( transform ), + .modelView = !(graph.metadata["renderer"]["separate"].as()) ? camera.getView() : camera.getView() * uf::transform::model( transform ), .projection = camera.getProjection(), }; graphic.updateUniform( (const void*) &uniform, sizeof(uniform) ); diff --git a/engine/src/engine/object/object.cpp b/engine/src/engine/object/object.cpp index b162a758..cae5c983 100644 --- a/engine/src/engine/object/object.cpp +++ b/engine/src/engine/object/object.cpp @@ -257,9 +257,9 @@ bool uf::Object::load( const uf::Serializer& _json ) { uf::Asset::Payload payload = uf::Asset::resolveToPayload( filename, mime ); if ( !uf::Asset::isExpected( payload, assetType ) ) continue; payload.hash = isObject ? target[i]["hash"].as("") : ""; - payload.monoThreaded = isObject ? target[i]["single threaded"].as() : false; + payload.monoThreaded = isObject ? !target[i]["multithreaded"].as(true) : !true; this->queueHook( "asset:QueueLoad.%UID%", payload, isObject ? target[i]["delay"].as() : 0 ); - bool bind = isObject && target[i]["bind"].is() ? target[i]["bind"].as() : true; + bool bind = isObject ? target[i]["bind"].as(true) : true; switch ( assetType ) { case uf::Asset::Type::LUA: { @@ -274,64 +274,6 @@ bool uf::Object::load( const uf::Serializer& _json ) { } } } -/* - #define UF_OBJECT_LOAD_ASSET_HEADER(type)\ - uf::Asset::Type assetType = uf::Asset::Type::type;\ - uf::stl::string assetTypeString = uf::string::lowercase( #type );\ - uf::Serializer target;\ - bool override = false;\ - if ( ext::json::isObject( metadataJson["system"]["assets"] ) ) {\ - target = metadataJson["system"]["assets"];\ - } else if ( ext::json::isArray( json["assets"] ) ) {\ - target = json["assets"];\ - } else if ( ext::json::isObject( json["assets"] ) && !ext::json::isNull( json["assets"][assetTypeString] ) ) {\ - target = json["assets"][assetTypeString];\ - } - - #define UF_OBJECT_LOAD_ASSET()\ - bool isObject = ext::json::isObject( target[i] );\ - uf::stl::string f = isObject ? target[i]["filename"].as() : target[i].as();\ - uf::stl::string filename = uf::io::resolveURI( f, metadata.system.root );\ - uf::stl::string mime = isObject ? target[i]["mime"].as("") : "";\ - uf::Asset::Payload payload = uf::Asset::resolveToPayload( filename, mime );\ - if ( !uf::Asset::isExpected( payload, assetType ) ) continue;\ - payload.hash = isObject ? target[i]["hash"].as("") : "";\ - payload.monoThreaded = isObject ? target[i]["single threaded"].as() : false;\ - this->queueHook( "asset:QueueLoad.%UID%", payload, isObject ? target[i]["delay"].as() : 0 );\ - bool bind = isObject && target[i]["bind"].is() ? target[i]["bind"].as() : true;\ - - { - UF_OBJECT_LOAD_ASSET_HEADER(AUDIO) - for ( size_t i = 0; i < target.size(); ++i ) { - UF_OBJECT_LOAD_ASSET() - } - } - { - UF_OBJECT_LOAD_ASSET_HEADER(IMAGE) - for ( size_t i = 0; i < target.size(); ++i ) { - UF_OBJECT_LOAD_ASSET() - } - } - { - UF_OBJECT_LOAD_ASSET_HEADER(GRAPH) - for ( size_t i = 0; i < target.size(); ++i ) { - UF_OBJECT_LOAD_ASSET() - if ( bind ) uf::instantiator::bind("GraphBehavior", *this); - - auto& aMetadata = assetLoader.getComponent(); - aMetadata[filename] = json["metadata"]["model"]; - aMetadata[filename]["root"] = json["root"]; - } - } - { - UF_OBJECT_LOAD_ASSET_HEADER(LUA) - for ( size_t i = 0; i < target.size(); ++i ) { - UF_OBJECT_LOAD_ASSET() - if ( bind ) uf::instantiator::bind("LuaBehavior", *this); - } - } -*/ - // Bind behaviors { if ( json["type"].is() ) uf::instantiator::bind( json["type"].as(), *this ); diff --git a/engine/src/ext/gltf/gltf.cpp b/engine/src/ext/gltf/gltf.cpp index a3733991..088191d3 100644 --- a/engine/src/ext/gltf/gltf.cpp +++ b/engine/src/ext/gltf/gltf.cpp @@ -81,7 +81,7 @@ namespace { } else { transform.position = { 0, 0, 0 }; } - if ( !(graph.metadata["flags"]["INVERT"].as()) ) { + if ( graph.metadata["renderer"]["invert"].as(true) ) { transform.position.x *= -1; } if ( node.rotation.size() == 4 ) { @@ -155,11 +155,11 @@ pod::Graph ext::gltf::load( const uf::stl::string& filename, const uf::Serialize auto imageID = graph.images.size(); auto keyName = graph.images.emplace_back(/*filename + "/" +*/ i.name); auto& image = /*graph.storage*/uf::graph::storage.images[keyName]; - if ( graph.metadata["debug"]["print"]["image"].as() ) { + if ( graph.metadata["debug"]["print"]["images"].as() ) { UF_MSG_DEBUG("Image: {}", i.name ); } - image.loadFromBuffer( &i.image[0], {i.width, i.height}, 8, i.component, graph.metadata["flip textures"].as(true) ); + image.loadFromBuffer( &i.image[0], {i.width, i.height}, 8, i.component, graph.metadata["renderer"]["flip textures"].as(true) ); } } // load samplers @@ -169,7 +169,7 @@ pod::Graph ext::gltf::load( const uf::stl::string& filename, const uf::Serialize auto samplerID = graph.samplers.size(); auto keyName = graph.samplers.emplace_back(/*filename + "/" +*/ s.name); auto& sampler = /*graph.storage*/uf::graph::storage.samplers[keyName]; - if ( graph.metadata["debug"]["print"]["sampler"].as() ) { + if ( graph.metadata["debug"]["print"]["samplers"].as() ) { UF_MSG_DEBUG("Sampler: {}", s.name ); } @@ -189,7 +189,7 @@ pod::Graph ext::gltf::load( const uf::stl::string& filename, const uf::Serialize auto textureID = graph.textures.size(); auto keyName = graph.textures.emplace_back((t.name == "" ? graph.images[t.source] : (/*filename + "/" +*/ t.name))); auto& texture = /*graph.storage*/uf::graph::storage.textures[keyName]; - if ( graph.metadata["debug"]["print"]["texture"].as() ) { + if ( graph.metadata["debug"]["print"]["textures"].as() ) { UF_MSG_DEBUG("Texture: {}", t.name ); } @@ -206,7 +206,7 @@ pod::Graph ext::gltf::load( const uf::stl::string& filename, const uf::Serialize auto materialID = graph.materials.size(); auto keyName = graph.materials.emplace_back(/*filename + "/" +*/ m.name); auto& material = /*graph.storage*/uf::graph::storage.materials[keyName]; - if ( graph.metadata["debug"]["print"]["material"].as() ) { + if ( graph.metadata["debug"]["print"]["materials"].as() ) { UF_MSG_DEBUG("Material: {}", m.name ); } @@ -253,7 +253,7 @@ pod::Graph ext::gltf::load( const uf::stl::string& filename, const uf::Serialize for ( auto& m : model.meshes ) { auto meshID = graph.meshes.size(); auto keyName = graph.meshes.emplace_back(/*filename + "/" +*/ m.name); - if ( graph.metadata["debug"]["print"]["mesh"].as() ) { + if ( graph.metadata["debug"]["print"]["meshes"].as() ) { UF_MSG_DEBUG("Mesh: {}", m.name ); } @@ -295,7 +295,7 @@ pod::Graph ext::gltf::load( const uf::stl::string& filename, const uf::Serialize meshgrid.cleanup = meshgrid.metadata["cleanup"].as(meshgrid.cleanup); } - if ( graph.metadata["flags"]["SKINNED"].as() ) { + if ( graph.metadata["renderer"]["skinned"].as(true) ) { #define UF_GRAPH_MESH_FORMAT uf::graph::mesh::Skinned, uint32_t #define UF_GRAPH_PROCESS_PRIMITIVES_FULL 1 #define UF_GRAPH_GRID 1 @@ -320,7 +320,7 @@ pod::Graph ext::gltf::load( const uf::stl::string& filename, const uf::Serialize auto skinID = graph.skins.size(); auto keyName = graph.skins.emplace_back(/*filename + "/" +*/ s.name); auto& skin = /*graph.storage*/uf::graph::storage.skins[keyName]; - if ( graph.metadata["debug"]["print"]["skin"].as() ) { + if ( graph.metadata["debug"]["print"]["skins"].as() ) { UF_MSG_DEBUG("Skin: {}", s.name ); } @@ -357,7 +357,7 @@ pod::Graph ext::gltf::load( const uf::stl::string& filename, const uf::Serialize auto animationID = graph.animations.size(); auto keyName = graph.animations.emplace_back(/*filename + "/" +*/ a.name); auto& animation = /*graph.storage*/uf::graph::storage.animations[keyName]; - if ( graph.metadata["debug"]["print"]["animation"].as() ) { + if ( graph.metadata["debug"]["print"]["animations"].as() ) { UF_MSG_DEBUG("Animation: {}", a.name ); } @@ -417,7 +417,7 @@ pod::Graph ext::gltf::load( const uf::stl::string& filename, const uf::Serialize { for ( auto& l : model.lights ) { auto& light = graph.lights[l.name]; - if ( graph.metadata["debug"]["print"]["light"].as() ) { + if ( graph.metadata["debug"]["print"]["lights"].as() ) { UF_MSG_DEBUG("Light: {}", l.name ); } @@ -440,7 +440,7 @@ pod::Graph ext::gltf::load( const uf::stl::string& filename, const uf::Serialize } } // generate atlas - if ( graph.metadata["flags"]["ATLAS"].as() ) { + if ( graph.metadata["renderer"]["atlas"].as() ) { auto atlasName = filename + "/" + "atlas"; auto& atlas = /*graph.storage*/uf::graph::storage.atlases[atlasName]; auto atlasImageIndex = graph.images.size(); diff --git a/engine/src/ext/gltf/processPrimitives.inl b/engine/src/ext/gltf/processPrimitives.inl index 6e93b49e..b25b3175 100644 --- a/engine/src/ext/gltf/processPrimitives.inl +++ b/engine/src/ext/gltf/processPrimitives.inl @@ -6,7 +6,7 @@ struct { } windingOrder; } sanitizer; -if ( graph.metadata["sanitizer"]["winding order"].as(true) ) { +if ( graph.metadata["sanitizer"]["winding order"].as(true) || graph.metadata["renderer"]["invert"].as(true) ) { sanitizer.windingOrder.should = true; } @@ -55,7 +55,7 @@ for ( auto& p : m.primitives ) { meshlet.primitive.instance.bounds.min = pod::Vector3f{ accessor.minValues[0], accessor.minValues[1], accessor.minValues[2] }; meshlet.primitive.instance.bounds.max = pod::Vector3f{ accessor.maxValues[0], accessor.maxValues[1], accessor.maxValues[2] }; - if ( !(graph.metadata["flags"]["INVERT"].as()) ){ + if ( graph.metadata["renderer"]["invert"].as(true) ){ meshlet.primitive.instance.bounds.min.x = -meshlet.primitive.instance.bounds.min.x; meshlet.primitive.instance.bounds.max.x = -meshlet.primitive.instance.bounds.max.x; } @@ -129,7 +129,7 @@ for ( auto& p : m.primitives ) { // required due to reverse-Z projection matrix flipping the X axis as well // default is to proceed with this - if ( !(graph.metadata["flags"]["INVERT"].as()) ){ + if ( !(graph.metadata["renderer"].as(true)) ){ vertex.position.x = -vertex.position.x; vertex.normal.x = -vertex.normal.x; #if UF_GRAPH_PROCESS_PRIMITIVES_FULL @@ -234,10 +234,10 @@ for ( auto& p : m.primitives ) { } } -if ( sanitizer.windingOrder.should ) { +if ( sanitizer.windingOrder.should && !graph.metadata["renderer"]["invert"].as(true) ) { UF_MSG_DEBUG("Winding order correction: {:.3f}%", ( (float) sanitizer.windingOrder.corrected / (float) sanitizer.windingOrder.total ) * 100.0f ); if ( sanitizer.windingOrder.corrected * 2 > sanitizer.windingOrder.total ) { - UF_MSG_DEBUG("Consider inverting the front face settings for mesh: {}", m.name); + UF_MSG_DEBUG("Consider enablind renderer.invert for mesh: {}", m.name); } } diff --git a/engine/src/ext/lua/lua.cpp b/engine/src/ext/lua/lua.cpp index e16dc1db..5c532a15 100644 --- a/engine/src/ext/lua/lua.cpp +++ b/engine/src/ext/lua/lua.cpp @@ -15,6 +15,7 @@ uf::stl::unordered_map ext::lua::modules; #include #include #include +#include sol::table ext::lua::createTable() { return sol::table(ext::lua::state, sol::create); @@ -31,7 +32,7 @@ std::optional ext::lua::encode( sol::table table ) { auto result = fun( table ); if ( !result.valid() ) { sol::error err = result; - uf::iostream << err.what() << "\n"; + UF_MSG_ERROR("{}", err.what()) return "{}"; } return result; @@ -41,7 +42,7 @@ std::optional ext::lua::decode( const uf::stl::string& string ) { auto result = fun( string ); if ( !result.valid() ) { sol::error err = result; - uf::iostream << err.what() << "\n"; + UF_MSG_ERROR("{}", err.what()) return createTable(); } return result; @@ -65,7 +66,7 @@ namespace binds { auto result = function( table ); if ( !result.valid() ) { sol::error err = result; - uf::iostream << err.what() << "\n"; + UF_MSG_ERROR("{}", err.what()) } }); }; @@ -117,10 +118,11 @@ namespace binds { size_t count = va.size(); for ( auto value : va ) { uf::stl::string str = ext::lua::state["tostring"]( value ); - uf::iostream << str; - if ( --count != 0 ) uf::iostream << "\t"; + fmt::print("{}", str); + if ( --count != 0 ) fmt::print("\t"); } - uf::iostream << "\n"; + fmt::print("\n"); + std::cout.flush(); }; } namespace math { @@ -206,6 +208,9 @@ void ext::lua::initialize() { string["extension"] = UF_LUA_C_FUN(::binds::string::extension); string["resolveURI"] = UF_LUA_C_FUN(::binds::string::resolveURI); string["si"] = UF_LUA_C_FUN(::binds::string::si); + + string["match"] = UF_LUA_C_FUN(uf::string::match); + string["matched"] = UF_LUA_C_FUN(uf::string::matched); } // `io` table { @@ -240,6 +245,13 @@ void ext::lua::initialize() { auto os = state["os"].get_or_create(); os["arch"] = UF_LUA_C_FUN(::binds::os::arch); } + // `inputs` table + { + auto inputs = state["inputs"].get_or_create(); + inputs["key"] = UF_LUA_C_FUN(uf::inputs::key); + inputs["analog"] = UF_LUA_C_FUN(uf::inputs::analog); + inputs["analog2"] = UF_LUA_C_FUN(uf::inputs::analog2); + } run(main); } bool ext::lua::run( const uf::stl::string& s, bool safe ) { @@ -249,7 +261,7 @@ bool ext::lua::run( const uf::stl::string& s, bool safe ) { auto result = state.safe_script_file( uf::io::resolveURI( s ), sol::script_pass_on_error ); if ( !result.valid() ) { sol::error err = result; - uf::iostream << err.what() << "\n"; + UF_MSG_ERROR("{}", err.what()); return false; } } else { @@ -261,7 +273,7 @@ bool ext::lua::run( const uf::stl::string& s, bool safe ) { auto result = state.safe_script( s, sol::script_pass_on_error ); if ( !result.valid() ) { sol::error err = result; - uf::iostream << err.what() << "\n"; + UF_MSG_ERROR("{}", err.what()); return false; } } else { @@ -286,7 +298,7 @@ bool ext::lua::run( const pod::LuaScript& s, bool safe ) { auto result = state.safe_script_file( s.file, s.env, sol::script_pass_on_error ); if ( !result.valid() ) { sol::error err = result; - uf::iostream << err.what() << "\n"; + UF_MSG_ERROR("{}", err.what()); return false; } } else { @@ -298,7 +310,7 @@ bool ext::lua::run( const pod::LuaScript& s, bool safe ) { auto result = state.safe_script( s.file, s.env, sol::script_pass_on_error ); if ( !result.valid() ) { sol::error err = result; - uf::iostream << err.what() << "\n"; + UF_MSG_ERROR("{}", err.what()); return false; } } else { diff --git a/engine/src/ext/lua/usertypes/physics.cpp b/engine/src/ext/lua/usertypes/physics.cpp index 33e2e93f..bf30af24 100644 --- a/engine/src/ext/lua/usertypes/physics.cpp +++ b/engine/src/ext/lua/usertypes/physics.cpp @@ -8,6 +8,11 @@ namespace binds { void setLinearVelocity( pod::Physics& self, const pod::Vector3f& v ) { self.linear.velocity = v; } void setRotationalVelocity( pod::Physics& self, const pod::Quaternion<>& v ) { self.rotational.velocity = v; } + + void enableGravity( pod::PhysicsState& state, bool s ) { + if ( !state.body ) return; + state.body->enableGravity(s); + } } UF_LUA_REGISTER_USERTYPE(pod::Physics, @@ -20,10 +25,12 @@ UF_LUA_REGISTER_USERTYPE(pod::Physics, UF_LUA_REGISTER_USERTYPE(pod::PhysicsState, UF_LUA_REGISTER_USERTYPE_DEFINE( setVelocity, UF_LUA_C_FUN(uf::physics::impl::setVelocity) ), + UF_LUA_REGISTER_USERTYPE_DEFINE( setImpulse, UF_LUA_C_FUN(uf::physics::impl::setImpulse) ), UF_LUA_REGISTER_USERTYPE_DEFINE( applyImpulse, UF_LUA_C_FUN(uf::physics::impl::applyImpulse) ), UF_LUA_REGISTER_USERTYPE_DEFINE( applyMovement, UF_LUA_C_FUN(uf::physics::impl::applyMovement) ), UF_LUA_REGISTER_USERTYPE_DEFINE( applyVelocity, UF_LUA_C_FUN(uf::physics::impl::applyVelocity) ), // UF_LUA_REGISTER_USERTYPE_DEFINE( applyRotation, UF_LUA_C_FUN(uf::physics::impl::applyRotation) ), + UF_LUA_REGISTER_USERTYPE_DEFINE( enableGravity, UF_LUA_C_FUN(::binds::enableGravity) ), UF_LUA_REGISTER_USERTYPE_DEFINE( activateCollision, UF_LUA_C_FUN(uf::physics::impl::activateCollision) ) ) diff --git a/engine/src/ext/lua/usertypes/transform.cpp b/engine/src/ext/lua/usertypes/transform.cpp index aace7ddc..bbb7830e 100644 --- a/engine/src/ext/lua/usertypes/transform.cpp +++ b/engine/src/ext/lua/usertypes/transform.cpp @@ -37,6 +37,9 @@ namespace binds { void setReference( pod::Transform<>& self, pod::Transform<>& t ) { self.reference = &t; } + void unreference( pod::Transform<>& self ) { + self.reference = NULL; + } pod::Transform<> lookAt( const pod::Transform<>& t, pod::Vector3f& at ) { auto transform = t; return uf::transform::lookAt( transform, at ); @@ -61,6 +64,7 @@ UF_LUA_REGISTER_USERTYPE(pod::Transform<>, UF_LUA_REGISTER_USERTYPE_DEFINE(reorient, UF_LUA_C_FUN(::binds::reorient)), UF_LUA_REGISTER_USERTYPE_DEFINE(getReference, UF_LUA_C_FUN(::binds::getReference)), UF_LUA_REGISTER_USERTYPE_DEFINE(setReference, UF_LUA_C_FUN(::binds::setReference)), + UF_LUA_REGISTER_USERTYPE_DEFINE(unreference, UF_LUA_C_FUN(::binds::unreference)), UF_LUA_REGISTER_USERTYPE_DEFINE(lookAt, UF_LUA_C_FUN(::binds::lookAt)), UF_LUA_REGISTER_USERTYPE_DEFINE(getModel, UF_LUA_C_FUN(::binds::getModel)) ) diff --git a/engine/src/ext/lua/usertypes/vector.cpp b/engine/src/ext/lua/usertypes/vector.cpp index 0036ed8a..89645f1d 100644 --- a/engine/src/ext/lua/usertypes/vector.cpp +++ b/engine/src/ext/lua/usertypes/vector.cpp @@ -37,6 +37,9 @@ namespace binds { float magnitude( const pod::Vector3f& self ) { return uf::vector::magnitude( self ); } + float norm( const pod::Vector3f& self ) { + return uf::vector::norm( self ); + } float dot( const pod::Vector3f& left, const pod::Vector3f& right ) { return uf::vector::dot( left, right ); } @@ -78,6 +81,9 @@ namespace binds { float magnitude( const pod::Vector4f& self ) { return uf::vector::magnitude( self ); } + float norm( const pod::Vector4f& self ) { + return uf::vector::norm( self ); + } float dot( const pod::Vector4f& left, const pod::Vector4f& right ) { return uf::vector::dot( left, right ); } @@ -114,6 +120,7 @@ UF_LUA_REGISTER_USERTYPE(pod::Vector3f, UF_LUA_REGISTER_USERTYPE_DEFINE( lerp, UF_LUA_C_FUN(::binds::v3f::lerp) ), UF_LUA_REGISTER_USERTYPE_DEFINE( normalize, UF_LUA_C_FUN(::binds::v3f::normalize) ), UF_LUA_REGISTER_USERTYPE_DEFINE( magnitude, UF_LUA_C_FUN(::binds::v3f::magnitude) ), + UF_LUA_REGISTER_USERTYPE_DEFINE( norm, UF_LUA_C_FUN(::binds::v3f::norm) ), UF_LUA_REGISTER_USERTYPE_DEFINE( dot, UF_LUA_C_FUN(::binds::v3f::dot) ), UF_LUA_REGISTER_USERTYPE_DEFINE( __tostring, UF_LUA_C_FUN(::binds::v3f::toString) ) ) @@ -145,6 +152,7 @@ UF_LUA_REGISTER_USERTYPE(pod::Vector4f, UF_LUA_REGISTER_USERTYPE_DEFINE( lerp, UF_LUA_C_FUN(::binds::v4f::lerp) ), UF_LUA_REGISTER_USERTYPE_DEFINE( normalize, UF_LUA_C_FUN(::binds::v4f::normalize) ), UF_LUA_REGISTER_USERTYPE_DEFINE( magnitude, UF_LUA_C_FUN(::binds::v4f::magnitude) ), + UF_LUA_REGISTER_USERTYPE_DEFINE( norm, UF_LUA_C_FUN(::binds::v4f::norm) ), UF_LUA_REGISTER_USERTYPE_DEFINE( dot, UF_LUA_C_FUN(::binds::v4f::dot) ), UF_LUA_REGISTER_USERTYPE_DEFINE( __tostring, UF_LUA_C_FUN(::binds::v4f::toString) ) ) diff --git a/engine/src/ext/opengl/commands.cpp b/engine/src/ext/opengl/commands.cpp index f7c6fc6e..9f6bb99e 100644 --- a/engine/src/ext/opengl/commands.cpp +++ b/engine/src/ext/opengl/commands.cpp @@ -102,12 +102,10 @@ void ext::opengl::CommandBuffer::submit() { switch ( header->type ) { case ext::opengl::enums::Command::CLEAR: { InfoClear* info = (InfoClear*) header; - /* GL_ERROR_CHECK(glClearColor(info->color[0], info->color[1], info->color[2], info->color[3])); GL_ERROR_CHECK(glClearDepth(info->depth)); GL_ERROR_CHECK(glClear(info->bits)); GL_ERROR_CHECK(glLightModelfv(GL_LIGHT_MODEL_AMBIENT, &info->color[0])); - */ } break; case ext::opengl::enums::Command::VIEWPORT: { InfoViewport* info = (InfoViewport*) header; diff --git a/engine/src/ext/opengl/graphic.cpp b/engine/src/ext/opengl/graphic.cpp index 5f978b7c..6524b0d4 100644 --- a/engine/src/ext/opengl/graphic.cpp +++ b/engine/src/ext/opengl/graphic.cpp @@ -366,15 +366,13 @@ void ext::opengl::Graphic::record( CommandBuffer& commandBuffer, const GraphicDe CommandBuffer::InfoDraw drawCommandInfoBase = {}; drawCommandInfoBase.type = ext::opengl::enums::Command::DRAW; drawCommandInfoBase.descriptor = descriptor; - if ( descriptor.inputs.index.count ) { - drawCommandInfoBase.attributes.index = descriptor.inputs.index.attributes.front(); - } + if ( descriptor.inputs.index.count ) drawCommandInfoBase.attributes.index = descriptor.inputs.index.attributes.front(); for ( uf::Mesh::Attribute attribute : descriptor.inputs.vertex.attributes ) { if ( attribute.descriptor.name == "position" ) drawCommandInfoBase.attributes.position = attribute; else if ( attribute.descriptor.name == "uv" ) drawCommandInfoBase.attributes.uv = attribute; else if ( attribute.descriptor.name == "st" ) drawCommandInfoBase.attributes.st = attribute; - // else if ( attribute.descriptor.name == "normal" ) drawCommandInfoBase.attributes.normal = attribute; + else if ( attribute.descriptor.name == "normal" ) drawCommandInfoBase.attributes.normal = attribute; else if ( attribute.descriptor.name == "color" ) drawCommandInfoBase.attributes.color = attribute; } @@ -386,6 +384,11 @@ void ext::opengl::Graphic::record( CommandBuffer& commandBuffer, const GraphicDe drawCommandInfoBase.matrices.projection = &viewports2->projection; } + struct { + uf::stl::vector opaques; + uf::stl::vector translucents; + } drawCommandInfos; + if ( descriptor.inputs.indirect.count ) { auto& indirectAttribute = descriptor.inputs.indirect.attributes.front(); @@ -444,7 +447,10 @@ void ext::opengl::Graphic::record( CommandBuffer& commandBuffer, const GraphicDe auto texture2DID = textures[instance.lightmapID].index; drawCommandInfo.textures.secondary = this->material.textures.at(texture2DID).descriptor; } - commandBuffer.record(drawCommandInfo); + switch ( drawCommandInfo.blend.modeAlpha ) { + case 0: drawCommandInfos.opaques.emplace_back(drawCommandInfo); break; + default: drawCommandInfos.translucents.emplace_back(drawCommandInfo); break; + } } } else { CommandBuffer::InfoDraw drawCommandInfo = drawCommandInfoBase; @@ -468,9 +474,14 @@ void ext::opengl::Graphic::record( CommandBuffer& commandBuffer, const GraphicDe break; } } - - commandBuffer.record(drawCommandInfo); + + switch ( drawCommandInfo.blend.modeAlpha ) { + case 0: drawCommandInfos.opaques.emplace_back(drawCommandInfo); break; + default: drawCommandInfos.translucents.emplace_back(drawCommandInfo); break; + } } + for ( auto& drawCommandInfo : drawCommandInfos.opaques ) commandBuffer.record(drawCommandInfo); + for ( auto& drawCommandInfo : drawCommandInfos.translucents ) commandBuffer.record(drawCommandInfo); } void ext::opengl::Graphic::destroy() { for ( auto& pair : pipelines ) pair.second.destroy(); diff --git a/engine/src/ext/opengl/opengl.cpp b/engine/src/ext/opengl/opengl.cpp index dc5cf3df..3ee4001e 100644 --- a/engine/src/ext/opengl/opengl.cpp +++ b/engine/src/ext/opengl/opengl.cpp @@ -418,16 +418,15 @@ void UF_API ext::opengl::render(){ clearCommandInfo.bits = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT; clearCommandInfo.depth = uf::matrix::reverseInfiniteProjection ? 0.0f : 1.0f; - #if 1 if ( !ext::json::isNull( sceneMetadata["system"]["renderer"]["clear values"][0] ) ) { clearCommandInfo.color = uf::vector::decode( sceneMetadata["system"]["renderer"]["clear values"][0], pod::Vector4f{0,0,0,0} ); } if ( !ext::json::isNull( sceneMetadata["light"]["ambient"] ) ) { clearCommandInfo.color = uf::vector::decode( sceneMetadata["light"]["ambient"], pod::Vector4f{0,0,0,0} ); - // auto ambient = uf::vector::decode( sceneMetadata["light"]["ambient"], pod::Vector4f{1,1,1,1} ); - // GL_ERROR_CHECK(glLightfv(GL_LIGHT0, GL_AMBIENT, &ambient[0])); + + auto ambient = uf::vector::decode( sceneMetadata["light"]["ambient"], pod::Vector4f{1,1,1,1} ); + GL_ERROR_CHECK(glLightfv(GL_LIGHT0, GL_AMBIENT, &ambient[0])); } - #endif GL_ERROR_CHECK(glClearColor(clearCommandInfo.color[0], clearCommandInfo.color[1], clearCommandInfo.color[2], clearCommandInfo.color[3])); GL_ERROR_CHECK(glClearDepth(clearCommandInfo.depth)); diff --git a/engine/src/ext/reactphysics/reactphysics.cpp b/engine/src/ext/reactphysics/reactphysics.cpp index 4fd95a4a..461d711b 100644 --- a/engine/src/ext/reactphysics/reactphysics.cpp +++ b/engine/src/ext/reactphysics/reactphysics.cpp @@ -214,8 +214,8 @@ void ext::reactphysics::initialize() { // Select the contact points and contact normals to be displayed debugRenderer.setIsDebugItemDisplayed(rp3d::DebugRenderer::DebugItem::COLLIDER_AABB, true); debugRenderer.setIsDebugItemDisplayed(rp3d::DebugRenderer::DebugItem::COLLISION_SHAPE, true); - debugRenderer.setIsDebugItemDisplayed(rp3d::DebugRenderer::DebugItem::CONTACT_POINT, true); - debugRenderer.setIsDebugItemDisplayed(rp3d::DebugRenderer::DebugItem::CONTACT_NORMAL, true); + // debugRenderer.setIsDebugItemDisplayed(rp3d::DebugRenderer::DebugItem::CONTACT_POINT, true); + // debugRenderer.setIsDebugItemDisplayed(rp3d::DebugRenderer::DebugItem::CONTACT_NORMAL, true); } } void ext::reactphysics::tick( float delta ) { @@ -284,6 +284,8 @@ void ext::reactphysics::attach( pod::PhysicsState& state ) { state.body = ::world->createRigidBody( ::convert( *state.transform.reference ) ); auto* collider = state.body->addCollider(state.shape, colliderTransform); + collider->setCollisionCategoryBits(0xFF); + collider->setCollideWithMaskBits(0xFF); state.body->setUserData(state.object); state.body->setMass(state.stats.mass); @@ -509,7 +511,19 @@ void ext::reactphysics::syncFrom( float interp ) { } } // apply impulse +void ext::reactphysics::setImpulse( pod::PhysicsState& state, const pod::Vector3f& v ) { + if ( !state.body ) return; + + state.body->resetForce(); + state.body->resetTorque(); + state.body->setLinearVelocity( ::convert(pod::Vector3f{}) ); + state.body->setAngularVelocity( ::convert(pod::Vector3f{}) ); +// ext::reactphysics::applyImpulse( state, v ); +} void ext::reactphysics::applyImpulse( pod::PhysicsState& state, const pod::Vector3f& v ) { + if ( !state.body ) return; + + state.body->applyWorldForceAtCenterOfMass( ::convert(v) ); } // directly move a transform void ext::reactphysics::applyMovement( pod::PhysicsState& state, const pod::Vector3f& v ) { @@ -584,7 +598,14 @@ float ext::reactphysics::rayCast( const pod::Vector3f& center, const pod::Vector // allows noclip void ext::reactphysics::activateCollision( pod::PhysicsState& state, bool s ) { - + if ( !state.body ) return; +// state.body->setIsActive(s); + auto colliders = state.body->getNbColliders(); + for ( auto i = 0; i < colliders; ++i ) { + auto* collider = state.body->getCollider(i); + collider->setCollisionCategoryBits(s ? 0xFF : 0x00); + collider->setCollideWithMaskBits(s ? 0xFF : 0x00); + } } #endif \ No newline at end of file diff --git a/engine/src/ext/vulkan/buffer.cpp b/engine/src/ext/vulkan/buffer.cpp index 009e2f56..67d89c35 100644 --- a/engine/src/ext/vulkan/buffer.cpp +++ b/engine/src/ext/vulkan/buffer.cpp @@ -127,7 +127,8 @@ bool ext::vulkan::Buffer::update( const void* data, VkDeviceSize length, bool st if ( !length ) return false; if ( !buffer ) return false; if ( length > allocationInfo.size ) { - UF_MSG_DEBUG("LENGTH OF {} EXCEEDS BUFFER SIZE {}", length, allocationInfo.size ); + UF_MSG_WARNING("Buffer update of {} exceeds buffer size of {}", length, allocationInfo.size ); + Buffer& b = *const_cast(this); b.destroy(); b.initialize( data, length, usage, memoryProperties, stage ); diff --git a/engine/src/ext/vulkan/graphic.cpp b/engine/src/ext/vulkan/graphic.cpp index 7ef03efb..c913447a 100644 --- a/engine/src/ext/vulkan/graphic.cpp +++ b/engine/src/ext/vulkan/graphic.cpp @@ -1018,12 +1018,17 @@ void ext::vulkan::Graphic::initializeMesh( uf::Mesh& mesh, bool buffer ) { #define PARSE_INPUT(name, usage){\ if ( mesh.isInterleaved( mesh.name.interleaved ) ) {\ auto& buffer = mesh.buffers[mesh.name.interleaved];\ - if ( !buffer.empty() ) mesh.name.interleaved = initializeBuffer( (const void*) buffer.data(), buffer.size(), usage | baseUsage );\ - else mesh.name.interleaved = -1;\ - } else for ( auto& attribute : descriptor.inputs.name.attributes ) {\ + if ( !buffer.empty() ) {\ + descriptor.inputs.name.interleaved = initializeBuffer( (const void*) buffer.data(), buffer.size(), usage | baseUsage );\ + this->metadata.buffers[#name"[0]"] = descriptor.inputs.name.interleaved;\ + } else mesh.name.interleaved = -1;\ + } else for ( size_t i = 0; i < descriptor.inputs.name.attributes.size(); ++i ) {\ + auto& attribute = descriptor.inputs.name.attributes[i];\ auto& buffer = mesh.buffers[attribute.buffer];\ - if ( !buffer.empty() ) attribute.buffer = initializeBuffer( (const void*) buffer.data(), buffer.size(), usage | baseUsage );\ - else attribute.buffer = -1;\ + if ( !buffer.empty() ) {\ + attribute.buffer = initializeBuffer( (const void*) buffer.data(), buffer.size(), usage | baseUsage );\ + this->metadata.buffers[#name"["+std::to_string(i)+"]"] = attribute.buffer;\ + } else attribute.buffer = -1;\ }\ } // allocate buffers @@ -1042,8 +1047,6 @@ void ext::vulkan::Graphic::initializeMesh( uf::Mesh& mesh, bool buffer ) { } } bool ext::vulkan::Graphic::updateMesh( uf::Mesh& mesh ) { -// UF_MSG_ERROR("need to fix"); return false; - // generate indices if not found // if ( mesh.index.count == 0 ) mesh.generateIndices(); // generate indirect data if not found @@ -1051,7 +1054,27 @@ bool ext::vulkan::Graphic::updateMesh( uf::Mesh& mesh ) { // ensure our descriptors are proper mesh.updateDescriptor(); +/* // copy descriptors + #define UPDATE_DESCRIPTOR(N) {\ + for ( size_t i = 0; i < mesh.N.attributes.size(); ++i ) {\ + descriptor.inputs.N.attributes[i].descriptor = mesh.N.attributes[i].descriptor;\ + descriptor.inputs.N.attributes[i].offset = mesh.N.attributes[i].offset;\ + descriptor.inputs.N.attributes[i].stride = mesh.N.attributes[i].stride;\ + descriptor.inputs.N.attributes[i].length = mesh.N.attributes[i].length;\ + descriptor.inputs.N.attributes[i].pointer = mesh.N.attributes[i].pointer;\ + }\ + descriptor.inputs.N.count = mesh.N.count;\ + descriptor.inputs.N.first = mesh.N.first;\ + descriptor.inputs.N.size = mesh.N.size;\ + descriptor.inputs.N.offset = mesh.N.offset;\ + } + + UPDATE_DESCRIPTOR(vertex); + UPDATE_DESCRIPTOR(index); + UPDATE_DESCRIPTOR(instance); + UPDATE_DESCRIPTOR(indirect); +*/ descriptor.inputs.vertex = mesh.vertex; descriptor.inputs.index = mesh.index; descriptor.inputs.instance = mesh.instance; @@ -1076,6 +1099,7 @@ bool ext::vulkan::Graphic::updateMesh( uf::Mesh& mesh ) { else for ( auto& attribute : descriptor.inputs.name.attributes ) PARSE_ATTRIBUTE(attribute.buffer, usage)\ } */ +/* #define PARSE_INPUT(name, usage){\ if ( mesh.isInterleaved( mesh.name.interleaved ) ) {\ auto& buffer = mesh.buffers[mesh.name.interleaved];\ @@ -1085,6 +1109,28 @@ bool ext::vulkan::Graphic::updateMesh( uf::Mesh& mesh ) { if ( !buffer.empty() ) rebuild = rebuild || updateBuffer( (const void*) buffer.data(), buffer.size(), descriptor.inputs.name.attributes[i].buffer );\ }\ } +*/ + #define PARSE_INPUT(name, usage){\ + if ( mesh.isInterleaved( mesh.name.interleaved ) ) {\ + auto& buffer = mesh.buffers[mesh.name.interleaved];\ + if ( !buffer.empty() ) {\ + const uf::stl::string key = #name"[0]";\ + if ( this->metadata.buffers.count(key) > 0 ) {\ + descriptor.inputs.name.interleaved = this->metadata.buffers[key];\ + rebuild = rebuild || updateBuffer( (const void*) buffer.data(), buffer.size(), descriptor.inputs.name.interleaved );\ + }\ + } else mesh.name.interleaved = -1;\ + } else for ( size_t i = 0; i < descriptor.inputs.name.attributes.size(); ++i ) {\ + auto& attribute = descriptor.inputs.name.attributes[i];\ + auto& buffer = mesh.buffers[attribute.buffer];\ + if ( !buffer.empty() ) {\ + const uf::stl::string key = #name"["+std::to_string(i)+"]";\ + if ( this->metadata.buffers.count(key) == 0 ) continue;\ + attribute.buffer = this->metadata.buffers[key];\ + rebuild = rebuild || updateBuffer( (const void*) buffer.data(), buffer.size(), attribute.buffer );\ + } else attribute.buffer = -1;\ + }\ + } bool rebuild = false; auto previousRequestedAlignment = this->requestedAlignment; @@ -1288,6 +1334,7 @@ void ext::vulkan::Graphic::generateBottomAccelerationStructures() { // create BLAS buffer and handle size_t blasBufferIndex = this->initializeBuffer( NULL, totalBlasBufferSize, uf::renderer::enums::Buffer::ACCELERATION_STRUCTURE | uf::renderer::enums::Buffer::ADDRESS ); size_t blasBufferOffset = 0; + this->metadata.buffers["blasBuffer"] = blasBufferIndex; #endif scratchBuffer.alignment = acclerationStructureProperties.minAccelerationStructureScratchOffsetAlignment; @@ -1386,12 +1433,21 @@ void ext::vulkan::Graphic::generateTopAccelerationStructure( const uf::stl::vect size_t instanceIndex{}; size_t tlasBufferIndex{}; if ( !update ) { + const size_t EXTRANEOUS_SIZE = 2048; + size_t bufferSize = MAX( instancesVK.size(), EXTRANEOUS_SIZE ); + instanceIndex = this->initializeBuffer( - (const void*) instancesVK.data(), instancesVK.size() * sizeof(VkAccelerationStructureInstanceKHR), + NULL, bufferSize * sizeof(VkAccelerationStructureInstanceKHR), uf::renderer::enums::Buffer::ADDRESS | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR, false ); + + this->updateBuffer( (const void*) instancesVK.data(), instancesVK.size() * sizeof(VkAccelerationStructureInstanceKHR), instanceIndex, false ); + + this->metadata.buffers["tlasInstance"] = instanceIndex; } else { - for ( size_t i = 0; i < buffers.size(); ++i ) { + if ( this->metadata.buffers.count("tlasInstance") > 0 ) { + instanceIndex = this->metadata.buffers["tlasInstance"]; + } else for ( int i = 0; i < buffers.size(); ++i ) { if ( !(this->buffers[i].usage & (uf::renderer::enums::Buffer::ADDRESS | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR)) ) continue; instanceIndex = i; break; @@ -1431,9 +1487,15 @@ void ext::vulkan::Graphic::generateTopAccelerationStructure( const uf::stl::vect // create BLAS buffer and handle auto tlasBufferUsageFlags = uf::renderer::enums::Buffer::ACCELERATION_STRUCTURE | uf::renderer::enums::Buffer::ADDRESS; if ( !update ) { - tlasBufferIndex = this->initializeBuffer( NULL, sizeInfo.accelerationStructureSize, tlasBufferUsageFlags); + const size_t EXTRANEOUS_SIZE = 1024 * 1024; + size_t bufferSize = MAX( sizeInfo.accelerationStructureSize, EXTRANEOUS_SIZE ); + + tlasBufferIndex = this->initializeBuffer( NULL, bufferSize, tlasBufferUsageFlags); + this->metadata.buffers["tlasBuffer"] = tlasBufferIndex; } else { - for ( int i = buffers.size() - 1; i >= 0; --i ) { + if ( this->metadata.buffers.count("tlasBuffer") > 0 ) { + tlasBufferIndex = this->metadata.buffers["tlasBuffer"]; + } else for ( int i = buffers.size() - 1; i >= 0; --i ) { if ( !(this->buffers[i].usage & tlasBufferUsageFlags) ) continue; tlasBufferIndex = i; break; @@ -1481,6 +1543,7 @@ void ext::vulkan::Graphic::generateTopAccelerationStructure( const uf::stl::vect } if ( rebuild ) { + // uf::renderer::states::rebuild = true; auto& renderMode = ext::vulkan::getRenderMode( descriptor.renderMode, true ); renderMode.rebuild = true; } diff --git a/engine/src/spec/window/windows.cpp b/engine/src/spec/window/windows.cpp index 4c2b4b95..ccda3a68 100644 --- a/engine/src/spec/window/windows.cpp +++ b/engine/src/spec/window/windows.cpp @@ -192,6 +192,10 @@ namespace { if ( uf::inputs::kbm::states::Num8 ) keys.emplace_back('8'); if ( uf::inputs::kbm::states::Num9 ) keys.emplace_back('9'); if ( uf::inputs::kbm::states::Num0 ) keys.emplace_back('0'); + + if ( uf::inputs::kbm::states::Mouse1 ) keys.emplace_back(VK_LBUTTON); + if ( uf::inputs::kbm::states::Mouse2 ) keys.emplace_back(VK_RBUTTON); + if ( uf::inputs::kbm::states::Mouse3 ) keys.emplace_back(VK_MBUTTON); return keys; } @@ -424,13 +428,16 @@ namespace { else if ( name == "F14" ) return VK_F14; else if ( name == "F15" ) return VK_F15; else if ( name == "PAUSE" ) return VK_PAUSE; - else if ( name == "LEFTMOUSE" ) return VK_LBUTTON; - else if ( name == "RIGHTMOUSE" ) return VK_RBUTTON; - else if ( name == "MIDDLEMOUSE" ) return VK_MBUTTON; + + else if ( name == "MOUSE1" ) return VK_LBUTTON; + else if ( name == "MOUSE2" ) return VK_RBUTTON; + else if ( name == "MOUSE3" ) return VK_MBUTTON; else if ( name == "XBUTTON1" ) return VK_XBUTTON1; else if ( name == "XBUTTON2" ) return VK_XBUTTON2; return 0; } + + float lastMouseWheel; } UF_API_CALL spec::win32::Window::Window() : @@ -807,6 +814,13 @@ void UF_API_CALL spec::win32::Window::bufferInputs() { uf::inputs::kbm::states::Num8 = GetAsyncKeyState('8') & 0x8000; uf::inputs::kbm::states::Num9 = GetAsyncKeyState('9') & 0x8000; uf::inputs::kbm::states::Num0 = GetAsyncKeyState('0') & 0x8000; + + uf::inputs::kbm::states::Mouse1 = GetAsyncKeyState(VK_LBUTTON) & 0x8000; + uf::inputs::kbm::states::Mouse2 = GetAsyncKeyState(VK_RBUTTON) & 0x8000; + uf::inputs::kbm::states::Mouse3 = GetAsyncKeyState(VK_MBUTTON) & 0x8000; + + uf::inputs::kbm::states::MouseWheel = ::lastMouseWheel; + ::lastMouseWheel = 0; } void UF_API_CALL spec::win32::Window::processEvents() { if ( !this->m_callback ) { @@ -1215,7 +1229,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam, }, { pod::Vector2ui{ position.x, position.y }, - delta, + ::lastMouseWheel = delta, } }; #if UF_HOOK_USE_USERDATA diff --git a/engine/src/utils/io/inputs.cpp b/engine/src/utils/io/inputs.cpp index 3556ad84..6c5b839f 100644 --- a/engine/src/utils/io/inputs.cpp +++ b/engine/src/utils/io/inputs.cpp @@ -102,6 +102,12 @@ uf::inputs::state_t uf::inputs::kbm::states::Num8 = false; uf::inputs::state_t uf::inputs::kbm::states::Num9 = false; uf::inputs::state_t uf::inputs::kbm::states::Num0 = false; +uf::inputs::state_t uf::inputs::kbm::states::Mouse1 = false; +uf::inputs::state_t uf::inputs::kbm::states::Mouse2 = false; +uf::inputs::state_t uf::inputs::kbm::states::Mouse3 = false; + +uf::inputs::analog_t uf::inputs::kbm::states::MouseWheel = 0.0f; + uf::inputs::state_t uf::inputs::controller::states::R_DPAD_UP = false; uf::inputs::state_t uf::inputs::controller::states::R_DPAD_DOWN = false; uf::inputs::state_t uf::inputs::controller::states::R_DPAD_LEFT = false; @@ -136,4 +142,146 @@ uf::inputs::analog2_t uf::inputs::controller::states::R_JOYSTICK = {}; uf::inputs::analog_t uf::inputs::controller::states::L_TRIGGER = false; uf::inputs::analog_t uf::inputs::controller::states::R_TRIGGER = false; -uf::inputs::state_t uf::inputs::controller::states::START = false; \ No newline at end of file +uf::inputs::state_t uf::inputs::controller::states::START = false; + +uf::inputs::state_t uf::inputs::key( const uf::stl::string& key ) { + if ( key == uf::inputs::kbm::enums::LShift ) return uf::inputs::kbm::states::LShift; + else if ( key == uf::inputs::kbm::enums::RShift ) return uf::inputs::kbm::states::RShift; + else if ( key == uf::inputs::kbm::enums::LControl ) return uf::inputs::kbm::states::LControl; + else if ( key == uf::inputs::kbm::enums::RControl ) return uf::inputs::kbm::states::RControl; + else if ( key == uf::inputs::kbm::enums::LAlt ) return uf::inputs::kbm::states::LAlt; + else if ( key == uf::inputs::kbm::enums::RAlt ) return uf::inputs::kbm::states::RAlt; + else if ( key == uf::inputs::kbm::enums::LSystem ) return uf::inputs::kbm::states::LSystem; + else if ( key == uf::inputs::kbm::enums::RSystem ) return uf::inputs::kbm::states::RSystem; + else if ( key == uf::inputs::kbm::enums::Menu ) return uf::inputs::kbm::states::Menu; + else if ( key == uf::inputs::kbm::enums::SemiColon ) return uf::inputs::kbm::states::SemiColon; + else if ( key == uf::inputs::kbm::enums::Slash ) return uf::inputs::kbm::states::Slash; + else if ( key == uf::inputs::kbm::enums::Equal ) return uf::inputs::kbm::states::Equal; + else if ( key == uf::inputs::kbm::enums::Dash ) return uf::inputs::kbm::states::Dash; + else if ( key == uf::inputs::kbm::enums::LBracket ) return uf::inputs::kbm::states::LBracket; + else if ( key == uf::inputs::kbm::enums::RBracket ) return uf::inputs::kbm::states::RBracket; + else if ( key == uf::inputs::kbm::enums::Comma ) return uf::inputs::kbm::states::Comma; + else if ( key == uf::inputs::kbm::enums::Period ) return uf::inputs::kbm::states::Period; + else if ( key == uf::inputs::kbm::enums::Quote ) return uf::inputs::kbm::states::Quote; + else if ( key == uf::inputs::kbm::enums::BackSlash ) return uf::inputs::kbm::states::BackSlash; + else if ( key == uf::inputs::kbm::enums::Tilde ) return uf::inputs::kbm::states::Tilde; + else if ( key == uf::inputs::kbm::enums::Escape ) return uf::inputs::kbm::states::Escape; + else if ( key == uf::inputs::kbm::enums::Space ) return uf::inputs::kbm::states::Space; + else if ( key == uf::inputs::kbm::enums::Enter ) return uf::inputs::kbm::states::Enter; + else if ( key == uf::inputs::kbm::enums::BackSpace ) return uf::inputs::kbm::states::BackSpace; + else if ( key == uf::inputs::kbm::enums::Tab ) return uf::inputs::kbm::states::Tab; + else if ( key == uf::inputs::kbm::enums::PageUp ) return uf::inputs::kbm::states::PageUp; + else if ( key == uf::inputs::kbm::enums::PageDown ) return uf::inputs::kbm::states::PageDown; + else if ( key == uf::inputs::kbm::enums::End ) return uf::inputs::kbm::states::End; + else if ( key == uf::inputs::kbm::enums::Home ) return uf::inputs::kbm::states::Home; + else if ( key == uf::inputs::kbm::enums::Insert ) return uf::inputs::kbm::states::Insert; + else if ( key == uf::inputs::kbm::enums::Delete ) return uf::inputs::kbm::states::Delete; + else if ( key == uf::inputs::kbm::enums::Add ) return uf::inputs::kbm::states::Add; + else if ( key == uf::inputs::kbm::enums::Subtract ) return uf::inputs::kbm::states::Subtract; + else if ( key == uf::inputs::kbm::enums::Multiply ) return uf::inputs::kbm::states::Multiply; + else if ( key == uf::inputs::kbm::enums::Divide ) return uf::inputs::kbm::states::Divide; + else if ( key == uf::inputs::kbm::enums::Pause ) return uf::inputs::kbm::states::Pause; + else if ( key == uf::inputs::kbm::enums::F1 ) return uf::inputs::kbm::states::F1; + else if ( key == uf::inputs::kbm::enums::F2 ) return uf::inputs::kbm::states::F2; + else if ( key == uf::inputs::kbm::enums::F3 ) return uf::inputs::kbm::states::F3; + else if ( key == uf::inputs::kbm::enums::F4 ) return uf::inputs::kbm::states::F4; + else if ( key == uf::inputs::kbm::enums::F5 ) return uf::inputs::kbm::states::F5; + else if ( key == uf::inputs::kbm::enums::F6 ) return uf::inputs::kbm::states::F6; + else if ( key == uf::inputs::kbm::enums::F7 ) return uf::inputs::kbm::states::F7; + else if ( key == uf::inputs::kbm::enums::F8 ) return uf::inputs::kbm::states::F8; + else if ( key == uf::inputs::kbm::enums::F9 ) return uf::inputs::kbm::states::F9; + else if ( key == uf::inputs::kbm::enums::F10 ) return uf::inputs::kbm::states::F10; + else if ( key == uf::inputs::kbm::enums::F11 ) return uf::inputs::kbm::states::F11; + else if ( key == uf::inputs::kbm::enums::F12 ) return uf::inputs::kbm::states::F12; + else if ( key == uf::inputs::kbm::enums::F13 ) return uf::inputs::kbm::states::F13; + else if ( key == uf::inputs::kbm::enums::F14 ) return uf::inputs::kbm::states::F14; + else if ( key == uf::inputs::kbm::enums::F15 ) return uf::inputs::kbm::states::F15; + else if ( key == uf::inputs::kbm::enums::Left ) return uf::inputs::kbm::states::Left; + else if ( key == uf::inputs::kbm::enums::Right ) return uf::inputs::kbm::states::Right; + else if ( key == uf::inputs::kbm::enums::Up ) return uf::inputs::kbm::states::Up; + else if ( key == uf::inputs::kbm::enums::Down ) return uf::inputs::kbm::states::Down; + else if ( key == uf::inputs::kbm::enums::Numpad0 ) return uf::inputs::kbm::states::Numpad0; + else if ( key == uf::inputs::kbm::enums::Numpad1 ) return uf::inputs::kbm::states::Numpad1; + else if ( key == uf::inputs::kbm::enums::Numpad2 ) return uf::inputs::kbm::states::Numpad2; + else if ( key == uf::inputs::kbm::enums::Numpad3 ) return uf::inputs::kbm::states::Numpad3; + else if ( key == uf::inputs::kbm::enums::Numpad4 ) return uf::inputs::kbm::states::Numpad4; + else if ( key == uf::inputs::kbm::enums::Numpad5 ) return uf::inputs::kbm::states::Numpad5; + else if ( key == uf::inputs::kbm::enums::Numpad6 ) return uf::inputs::kbm::states::Numpad6; + else if ( key == uf::inputs::kbm::enums::Numpad7 ) return uf::inputs::kbm::states::Numpad7; + else if ( key == uf::inputs::kbm::enums::Numpad8 ) return uf::inputs::kbm::states::Numpad8; + else if ( key == uf::inputs::kbm::enums::Numpad9 ) return uf::inputs::kbm::states::Numpad9; + else if ( key == uf::inputs::kbm::enums::Q ) return uf::inputs::kbm::states::Q; + else if ( key == uf::inputs::kbm::enums::W ) return uf::inputs::kbm::states::W; + else if ( key == uf::inputs::kbm::enums::E ) return uf::inputs::kbm::states::E; + else if ( key == uf::inputs::kbm::enums::R ) return uf::inputs::kbm::states::R; + else if ( key == uf::inputs::kbm::enums::T ) return uf::inputs::kbm::states::T; + else if ( key == uf::inputs::kbm::enums::Y ) return uf::inputs::kbm::states::Y; + else if ( key == uf::inputs::kbm::enums::U ) return uf::inputs::kbm::states::U; + else if ( key == uf::inputs::kbm::enums::I ) return uf::inputs::kbm::states::I; + else if ( key == uf::inputs::kbm::enums::O ) return uf::inputs::kbm::states::O; + else if ( key == uf::inputs::kbm::enums::P ) return uf::inputs::kbm::states::P; + else if ( key == uf::inputs::kbm::enums::A ) return uf::inputs::kbm::states::A; + else if ( key == uf::inputs::kbm::enums::S ) return uf::inputs::kbm::states::S; + else if ( key == uf::inputs::kbm::enums::D ) return uf::inputs::kbm::states::D; + else if ( key == uf::inputs::kbm::enums::F ) return uf::inputs::kbm::states::F; + else if ( key == uf::inputs::kbm::enums::G ) return uf::inputs::kbm::states::G; + else if ( key == uf::inputs::kbm::enums::H ) return uf::inputs::kbm::states::H; + else if ( key == uf::inputs::kbm::enums::J ) return uf::inputs::kbm::states::J; + else if ( key == uf::inputs::kbm::enums::K ) return uf::inputs::kbm::states::K; + else if ( key == uf::inputs::kbm::enums::L ) return uf::inputs::kbm::states::L; + else if ( key == uf::inputs::kbm::enums::Z ) return uf::inputs::kbm::states::Z; + else if ( key == uf::inputs::kbm::enums::X ) return uf::inputs::kbm::states::X; + else if ( key == uf::inputs::kbm::enums::C ) return uf::inputs::kbm::states::C; + else if ( key == uf::inputs::kbm::enums::V ) return uf::inputs::kbm::states::V; + else if ( key == uf::inputs::kbm::enums::B ) return uf::inputs::kbm::states::B; + else if ( key == uf::inputs::kbm::enums::N ) return uf::inputs::kbm::states::N; + else if ( key == uf::inputs::kbm::enums::M ) return uf::inputs::kbm::states::M; + else if ( key == uf::inputs::kbm::enums::Num1 ) return uf::inputs::kbm::states::Num1; + else if ( key == uf::inputs::kbm::enums::Num2 ) return uf::inputs::kbm::states::Num2; + else if ( key == uf::inputs::kbm::enums::Num3 ) return uf::inputs::kbm::states::Num3; + else if ( key == uf::inputs::kbm::enums::Num4 ) return uf::inputs::kbm::states::Num4; + else if ( key == uf::inputs::kbm::enums::Num5 ) return uf::inputs::kbm::states::Num5; + else if ( key == uf::inputs::kbm::enums::Num6 ) return uf::inputs::kbm::states::Num6; + else if ( key == uf::inputs::kbm::enums::Num7 ) return uf::inputs::kbm::states::Num7; + else if ( key == uf::inputs::kbm::enums::Num8 ) return uf::inputs::kbm::states::Num8; + else if ( key == uf::inputs::kbm::enums::Num9 ) return uf::inputs::kbm::states::Num9; + else if ( key == uf::inputs::kbm::enums::Num0 ) return uf::inputs::kbm::states::Num0; + else if ( key == uf::inputs::kbm::enums::Mouse1 ) return uf::inputs::kbm::states::Mouse1; + else if ( key == uf::inputs::kbm::enums::Mouse2 ) return uf::inputs::kbm::states::Mouse2; + else if ( key == uf::inputs::kbm::enums::Mouse3 ) return uf::inputs::kbm::states::Mouse3; + + else if ( key == uf::inputs::controller::enums::R_DPAD_UP ) return uf::inputs::controller::states::R_DPAD_UP; + else if ( key == uf::inputs::controller::enums::R_DPAD_DOWN ) return uf::inputs::controller::states::R_DPAD_DOWN; + else if ( key == uf::inputs::controller::enums::R_DPAD_LEFT ) return uf::inputs::controller::states::R_DPAD_LEFT; + else if ( key == uf::inputs::controller::enums::R_DPAD_RIGHT ) return uf::inputs::controller::states::R_DPAD_RIGHT; + else if ( key == uf::inputs::controller::enums::R_A ) return uf::inputs::controller::states::R_A; + else if ( key == uf::inputs::controller::enums::L_DPAD_UP ) return uf::inputs::controller::states::L_DPAD_UP; + else if ( key == uf::inputs::controller::enums::L_DPAD_DOWN ) return uf::inputs::controller::states::L_DPAD_DOWN; + else if ( key == uf::inputs::controller::enums::L_DPAD_LEFT ) return uf::inputs::controller::states::L_DPAD_LEFT; + else if ( key == uf::inputs::controller::enums::L_DPAD_RIGHT ) return uf::inputs::controller::states::L_DPAD_RIGHT; + else if ( key == uf::inputs::controller::enums::L_A ) return uf::inputs::controller::states::L_A; + else if ( key == uf::inputs::controller::enums::DPAD_UP ) return uf::inputs::controller::states::DPAD_UP; + else if ( key == uf::inputs::controller::enums::DPAD_DOWN ) return uf::inputs::controller::states::DPAD_DOWN; + else if ( key == uf::inputs::controller::enums::DPAD_LEFT ) return uf::inputs::controller::states::DPAD_LEFT; + else if ( key == uf::inputs::controller::enums::DPAD_RIGHT ) return uf::inputs::controller::states::DPAD_RIGHT; + else if ( key == uf::inputs::controller::enums::A ) return uf::inputs::controller::states::A; + else if ( key == uf::inputs::controller::enums::B ) return uf::inputs::controller::states::B; + else if ( key == uf::inputs::controller::enums::X ) return uf::inputs::controller::states::X; + else if ( key == uf::inputs::controller::enums::Y ) return uf::inputs::controller::states::Y; + else if ( key == uf::inputs::controller::enums::START ) return uf::inputs::controller::states::START; + + return false; +} +uf::inputs::analog_t uf::inputs::analog( const uf::stl::string& key ) { + if ( key == uf::inputs::kbm::enums::MouseWheel ) return uf::inputs::kbm::states::MouseWheel; + else if ( key == uf::inputs::controller::enums::L_TRIGGER ) return uf::inputs::controller::states::L_TRIGGER; + else if ( key == uf::inputs::controller::enums::R_TRIGGER ) return uf::inputs::controller::states::R_TRIGGER; + + return 0.0; +} +uf::inputs::analog2_t uf::inputs::analog2( const uf::stl::string& key ) { + if ( key == uf::inputs::controller::enums::L_JOYSTICK ) return uf::inputs::controller::states::L_JOYSTICK; + else if ( key == uf::inputs::controller::enums::R_JOYSTICK ) return uf::inputs::controller::states::R_JOYSTICK; + + return {}; +} \ No newline at end of file diff --git a/engine/src/utils/string/ext.cpp b/engine/src/utils/string/ext.cpp index a2f5abcf..69b36dde 100644 --- a/engine/src/utils/string/ext.cpp +++ b/engine/src/utils/string/ext.cpp @@ -19,7 +19,7 @@ bool UF_API uf::string::isRegex( const uf::stl::string& str ) { return str.front() == '/' && str.back() == '/'; } uf::stl::vector UF_API uf::string::match( const uf::stl::string& str, const uf::stl::string& r ) { - std::regex regex(r.substr(1,r.length()-2)); + std::regex regex(uf::string::isRegex(r) ? r.substr(1,r.length()-2) : r); std::smatch match; uf::stl::vector matches; if ( std::regex_search( str, match, regex ) ) { @@ -31,7 +31,7 @@ uf::stl::vector UF_API uf::string::match( const uf::stl::string return matches; } bool UF_API uf::string::matched( const uf::stl::string& str, const uf::stl::string& r ) { - std::regex regex(r.substr(1,r.length()-2)); + std::regex regex(uf::string::isRegex(r) ? r.substr(1,r.length()-2) : r); std::smatch match; return std::regex_search( str, match, regex ); } diff --git a/ext/behaviors/player/behavior.cpp b/ext/behaviors/player/behavior.cpp index 9743e711..12bd13e4 100644 --- a/ext/behaviors/player/behavior.cpp +++ b/ext/behaviors/player/behavior.cpp @@ -203,7 +203,7 @@ void ext::PlayerBehavior::tick( uf::Object& self ) { stats.noclipped = metadata.system.noclipped; stats.floored = stats.noclipped; auto& collider = this->getComponent(); -// if ( !stats.floored && collider.body && uf::physics::impl::rayCast( transform.position, transform.position - pod::Vector3f{0,1,0} ) >= 0.0f ) stats.floored = true; + { uf::Object* hit = NULL; pod::Vector3f center = transform.position + metadata.movement.floored.feet; @@ -218,33 +218,41 @@ void ext::PlayerBehavior::tick( uf::Object& self ) { TIMER(0.25, keys.use && ) { size_t uid = 0; uf::Object* pointer = NULL; - float length = 4.0f; + float length = metadata.use.length; pod::Vector3f center = transform.position + cameraTransform.position; pod::Vector3f direction = uf::vector::normalize( transform.forward + pod::Vector3f{ 0, cameraTransform.forward.y, 0 } ) * length; float depth = uf::physics::impl::rayCast( center, direction, this, pointer ); + ext::json::Value payload; if ( pointer ) { - ext::json::Value payload; - payload["uid"] = this->getUid(); - payload["depth"] = depth; + payload["user"] = this->getUid(); + payload["uid"] = pointer->getUid(); + payload["depth"] = uf::vector::norm(direction * depth); pointer->callHook( "entity:Use.%UID%", payload ); } else { - auto& emitter = this->getComponent(); - uf::stl::string filename = "./ui/deny.ogg"; - uf::Audio& sfx = emitter.has(filename) ? emitter.get(filename) : emitter.load(filename); - - bool playing = false; - if ( !sfx.playing() ) { - #if UF_AUDIO_MAPPED_VOLUMES - sfx.setVolume(uf::audio::volumes.count("sfx") > 0 ? uf::audio::volumes.at("sfx") : 1.0); - #else - sfx.setVolume(uf::audio::volumes::sfx); - #endif - sfx.setPosition( transform.position ); - sfx.setTime( 0 ); - sfx.play(); - } + payload["user"] = this->getUid(); + payload["uid"] = 0; + payload["depth"] = -1; } + this->callHook( "entity:Use.%UID%", payload ); + + /* + auto& emitter = this->getComponent(); + uf::stl::string filename = pointer ? "./ui/select.ogg" : "./ui/deny.ogg"; + uf::Audio& sfx = emitter.has(filename) ? emitter.get(filename) : emitter.load(filename); + + bool playing = false; + if ( !sfx.playing() ) { + #if UF_AUDIO_MAPPED_VOLUMES + sfx.setVolume(uf::audio::volumes.count("sfx") > 0 ? uf::audio::volumes.at("sfx") : 1.0); + #else + sfx.setVolume(uf::audio::volumes::sfx); + #endif + sfx.setPosition( transform.position ); + sfx.setTime( 0 ); + sfx.play(); + } + */ } if ( collider.stats.gravity == pod::Vector3f{0,0,0} ) stats.noclipped = true; @@ -291,23 +299,6 @@ void ext::PlayerBehavior::tick( uf::Object& self ) { } metadata.system.menu = stats.menu; } -/* - { - uf::Object* guiManager = (uf::Object*) scene.globalFindByName("Gui Manager"); - bool menu = guiManager && !guiManager->getChildren().empty(); - if ( !menu ) stats.menu = ""; - if ( stats.menu == "" && keys.paused ) { - stats.menu = "paused"; - metadata.system.control = false; - pod::payloads::menuOpen payload; - payload.name = "pause"; - uf::hooks.call("menu:Open", payload); - } else { - metadata.system.control = stats.menu == ""; - } - metadata.system.menu = stats.menu; - } -*/ pod::Transform<> translator = transform; #if UF_USE_OPENVR @@ -339,23 +330,13 @@ void ext::PlayerBehavior::tick( uf::Object& self ) { TIMER(0.25, keys.vee && ) { bool state = !stats.noclipped; metadata.system.noclipped = state; - if ( collider.body ) collider.body->enableGravity(!state); - - UF_MSG_DEBUG( "{}abled noclip: {}", (state ? "En" : "Dis"), uf::vector::toString(transform.position)); - #if 0 - if ( state ) { - if ( collider.body ) { - collider.body->setGravity(btVector3(0,0.0,0)); - collider.body->setCollisionFlags(collider.body->getCollisionFlags() | btCollisionObject::CF_NO_CONTACT_RESPONSE); - } - } else { - if ( collider.body ) { - collider.body->setGravity(btVector3(0,-9.81,0)); - collider.body->setCollisionFlags(collider.body->getCollisionFlags() & ~btCollisionObject::CF_NO_CONTACT_RESPONSE); - } + if ( collider.body ) { + collider.body->enableGravity(!state); + uf::physics::impl::activateCollision(collider, !state); } - #endif + stats.noclipped = state; + UF_MSG_DEBUG( "{}abled noclip: {}", (state ? "En" : "Dis"), uf::vector::toString(transform.position)); } // movement handler // setup desired direction @@ -549,6 +530,8 @@ void ext::PlayerBehavior::Metadata::serialize( uf::Object& self, uf::Serializer& serializerCameraLimit["current"] = uf::vector::encode(/*this->*/camera.limit.current); serializerCameraLimit["minima"] = uf::vector::encode(/*this->*/camera.limit.min); serializerCameraLimit["maxima"] = uf::vector::encode(/*this->*/camera.limit.max); + + serializer["use"]["length"] = /*this->*/use.length; } void ext::PlayerBehavior::Metadata::deserialize( uf::Object& self, uf::Serializer& serializer ){ auto& serializerSystem = serializer["system"]; @@ -583,5 +566,7 @@ void ext::PlayerBehavior::Metadata::deserialize( uf::Object& self, uf::Serialize /*this->*/camera.limit.current = uf::vector::decode( serializerCameraLimit["current"], /*this->*/camera.limit.current ); /*this->*/camera.limit.min = uf::vector::decode( serializerCameraLimit["minima"], /*this->*/camera.limit.min ); /*this->*/camera.limit.max = uf::vector::decode( serializerCameraLimit["maxima"], /*this->*/camera.limit.max ); + + /*this->*/use.length = serializer["use"]["length"].as(/*this->*/use.length); } #undef this \ No newline at end of file diff --git a/ext/behaviors/player/behavior.h b/ext/behaviors/player/behavior.h index 22002f3a..bd9e672c 100644 --- a/ext/behaviors/player/behavior.h +++ b/ext/behaviors/player/behavior.h @@ -52,6 +52,9 @@ namespace ext { float volume; } footstep; } audio; + struct { + float length = 4.0f; + } use; ); } } \ No newline at end of file diff --git a/ext/behaviors/player/model/behavior.cpp b/ext/behaviors/player/model/behavior.cpp index f991365f..69e45e36 100644 --- a/ext/behaviors/player/model/behavior.cpp +++ b/ext/behaviors/player/model/behavior.cpp @@ -24,9 +24,8 @@ void ext::PlayerModelBehavior::initialize( uf::Object& self ) { auto& transform = this->getComponent>(); auto& metadata = this->getComponent(); auto& metadataJson = this->getComponent(); - transform.reference = &controllerTransform; - - metadata.reference = &controllerTransform; +// transform.reference = &controllerTransform; +// metadata.reference = &controllerTransform; this->addHook( "object:Serialize.%UID%", [&](ext::json::Value& json){ metadata.serialize(self, metadataJson); }); this->addHook( "object:Deserialize.%UID%", [&](ext::json::Value& json){ metadata.deserialize(self, metadataJson); }); @@ -34,6 +33,18 @@ void ext::PlayerModelBehavior::initialize( uf::Object& self ) { } void ext::PlayerModelBehavior::tick( uf::Object& self ) { auto& metadata = this->getComponent(); + + if ( metadata.track ) { + auto& scene = uf::scene::getCurrentScene(); + auto& controller = scene.getController(); + auto& controllerTransform = controller.getComponent>(); + + auto& transform = this->getComponent>(); + + transform.reference = &controllerTransform; + metadata.reference = &controllerTransform; + } + if ( !metadata.hide || metadata.set || this->getChildren().size() != 1 ) return; auto& metadataJson = this->getComponent(); #if UF_ENTITY_METADATA_USE_JSON diff --git a/ext/behaviors/scene/behavior.cpp b/ext/behaviors/scene/behavior.cpp index 0dbe3ba7..72496702 100644 --- a/ext/behaviors/scene/behavior.cpp +++ b/ext/behaviors/scene/behavior.cpp @@ -74,22 +74,6 @@ void ext::ExtSceneBehavior::initialize( uf::Object& self ) { uf::Serializer& metadataJson = gui.getComponent(); gui.initialize(); }; - /* - static uf::Timer timer(false); - if ( !timer.running() ) timer.start( uf::Time<>(-1000000) ); - if ( timer.elapsed().asDouble() < 1 ) return; - timer.reset(); - uf::Object* manager = (uf::Object*) this->globalFindByName("Gui Manager"); - if ( !manager ) return; - - ext::json::Value payload; - uf::stl::string config = metadataJson["menus"]["pause"].as("/entites/gui/pause/menu.json"); - uf::Object& gui = manager->loadChild(config, false); - payload["uid"] = gui.getUid(); - uf::Serializer& metadataJson = gui.getComponent(); - metadataJson["menu"] = payload.menu; - gui.initialize(); - */ }); this->addHook( "world:Entity.LoadAsset", [&](pod::payloads::assetLoad& payload){ assetLoader.load("asset:Load." + std::to_string(payload.uid), payload); @@ -109,6 +93,25 @@ void ext::ExtSceneBehavior::initialize( uf::Object& self ) { this->addHook( "window:Resized", [&](pod::payloads::windowResized& payload){ ext::gui::size.current = payload.window.size; }); + /* Spawn an entity */ + this->addHook( "entity:Spawn", [&](pod::payloads::entitySpawn& payload){ + if ( payload.parent.uid ) { + payload.parent.pointer = (uf::Object*) this->globalFindByUid(payload.parent.uid); + } + if ( !payload.parent.pointer ) payload.parent.pointer = this; + + uf::Object* child = NULL; + + if ( payload.filename != "" ) child = payload.parent.pointer->loadChildPointer( payload.filename ); + else child = payload.parent.pointer->loadChildPointer( payload.metadata ); + + + if ( !child ) return; + auto& transform = child->getComponent>(); + if ( payload.transform.position != pod::Vector3f{0,0,0} ) transform.position = payload.transform.position; + if ( payload.transform.orientation != uf::quaternion::identity() ) transform.orientation = payload.transform.orientation; + if ( !payload.transform.reference ) transform.reference = payload.transform.reference; + }); this->addHook( "object:Serialize.%UID%", [&](ext::json::Value& json){ metadata.serialize(self, metadataJson); }); this->addHook( "object:Deserialize.%UID%", [&](ext::json::Value& json){ metadata.deserialize(self, metadataJson); });