Commit for 2023.10.25 00-13-51.7z

This commit is contained in:
mrq 2023-10-25 00:13:00 -05:00
parent 1c8721f615
commit f1ab22c4a0
20 changed files with 236 additions and 85 deletions

View File

@ -44,8 +44,9 @@ EXT_LIB_NAME += ext
#VULKAN_SDK_PATH += /c/VulkanSDK/1.3.204.1/ #VULKAN_SDK_PATH += /c/VulkanSDK/1.3.204.1/
#VULKAN_SDK_PATH += /c/VulkanSDK/1.3.211.0/ #VULKAN_SDK_PATH += /c/VulkanSDK/1.3.211.0/
#VULKAN_SDK_PATH += /c/VulkanSDK/1.3.216.0/ #VULKAN_SDK_PATH += /c/VulkanSDK/1.3.216.0/
VULKAN_SDK_PATH += /c/VulkanSDK/1.3.224.1/ #VULKAN_SDK_PATH += /c/VulkanSDK/1.3.224.1/
#VULKAN_SDK_PATH += /c/VulkanSDK/1.3.231.1/ VULKAN_SDK_PATH += /c/VulkanSDK/1.3.231.1/
#VULKAN_SDK_PATH += /c/VulkanSDK/1.3.261.1/
GLSLC += $(VULKAN_SDK_PATH)/Bin/glslc GLSLC += $(VULKAN_SDK_PATH)/Bin/glslc
SPV_OPTIMIZER += $(VULKAN_SDK_PATH)/Bin/spirv-opt SPV_OPTIMIZER += $(VULKAN_SDK_PATH)/Bin/spirv-opt

View File

@ -5,7 +5,7 @@
"matrix": { "reverseInfinite": true }, "matrix": { "reverseInfinite": true },
"meshes": { "interleaved": false }, "meshes": { "interleaved": false },
"lights": { "enabled": true, "lights": { "enabled": true,
"useLightmaps": true, "useLightmaps": false,
"max": 32, "max": 32,
"shadows": { "shadows": {
"enabled": true, "enabled": true,
@ -29,9 +29,9 @@
} }
}, },
"vxgi": { "vxgi": {
// "limiter": 0,
"limiter": 0.125, "limiter": 0.125,
// "limiter": 0.125, "size": 256,
"size": 192,
"dispatch": 8, "dispatch": 8,
"cascades": 3, "cascades": 3,
"cascadePower": 1.5, "cascadePower": 1.5,
@ -41,8 +41,8 @@
"traceStartOffsetFactor": 1, "traceStartOffsetFactor": 1,
"shadows": 0, "shadows": 0,
"extents": { "extents": {
"min": [ -4, -4, -4 ], "min": [ -8, -8, -8 ],
"max": [ 4, 4, 4 ] "max": [ 8, 8, 8 ]
} }
}, },
"rt": { "rt": {
@ -91,8 +91,8 @@
// "size": [ 960, 540 ] // "size": [ 960, 540 ]
// "size": [ 640, 480 ] // "size": [ 640, 480 ]
}, },
"gpu": 7817, // 2060 // "gpu": 7817, // 2060
// "gpu": 29631, // 6800XT "gpu": 29631, // 6800XT
"experimental": { "experimental": {
"rebuild on tick begin": false, "rebuild on tick begin": false,
"batch queue submissions": true, "batch queue submissions": true,
@ -204,7 +204,7 @@
,"VK_KHR_ray_query" ,"VK_KHR_ray_query"
// ,"VK_AMD_shader_explicit_vertex_parameter" // ,"VK_AMD_shader_explicit_vertex_parameter"
// ,"VK_KHR_fragment_shader_barycentric" ,"VK_KHR_fragment_shader_barycentric"
] ]
}, },
"features": [ "features": [
@ -292,7 +292,7 @@
"debug draw": { "debug draw": {
"enabled": false, "enabled": false,
"line width": 8, "line width": 8,
// "layer": "Gui", "layer": "Gui",
"rate": 0.0125 "rate": 0.0125
} }
}, },

View File

@ -61,7 +61,7 @@
"renderer": { "renderer": {
"front face": "auto", "front face": "auto",
"cull mode": "back", "cull mode": "back",
"filter": "linear", "filter": "nearest",
"atlas": false, "atlas": false,
"invert": true, "invert": true,

View File

@ -6,7 +6,7 @@
"SoundEmitterBehavior" "SoundEmitterBehavior"
], ],
"ignore": false, "ignore": false,
/* /*
"transform": { "transform": {
"position": [ 0, 0, 0 ], "position": [ 0, 0, 0 ],
"rotation": { "rotation": {
@ -15,7 +15,7 @@
}, },
"scale": [ 1, 1, 1 ] "scale": [ 1, 1, 1 ]
}, },
*/ */
"assets": [ "assets": [
// { "filename": "./playerModel.json", "delay": 0 }, // { "filename": "./playerModel.json", "delay": 0 },
"./playerModel.json", "./playerModel.json",
@ -55,10 +55,11 @@
} }
}, },
"movement": { "movement": {
"walk": 1, "walk": 8,
"move": 4, "move": 8,
"run": 16, "run": 16,
"rotate": 1.5, // "rotate": 1.5,
"rotate": 4,
"air": 0.1, "air": 0.1,
"crouch": 1, "crouch": 1,
@ -69,7 +70,8 @@
// "floor": [ 0, -0.5, 0 ], // "floor": [ 0, -0.5, 0 ],
"floor": [ 0, -1.0, 0 ], "floor": [ 0, -1.0, 0 ],
"print": false "print": false
} },
"strafe": false
}, },
"physics": { "physics": {
"gravity": [ 0, -9.81, 0 ], "gravity": [ 0, -9.81, 0 ],
@ -86,19 +88,18 @@
"shared": false "shared": false
}, },
"camera": { "camera": {
"offset": [ 0, 0, 0 ], "offset": [ 0, 5, 3 ],
"orientation": [ 0, 0.894427, -0.447214, 0 ],
"position" : [ 0, 1.8, 0 ], "position" : [ 0, 1.8, 0 ],
"scale": [ 1, 1, 1 ], "scale": [ 1, 1, 1 ],
"invert": [ false, false, false ], "invert": [ false, false, false ],
"limit": { "limit": {
// "minima": [ null, -1.57079633, null ],
// "maxima": [ null, 1.57079633, null ],
"minima": [ null, -1.0, null ], "minima": [ null, -1.0, null ],
"maxima": [ null, 1.0, null ], "maxima": [ null, 1.0, null ],
"current":[ null, 0, null ] "current":[ null, 0, null ]
}, },
"settings": { "settings": {
"fixed": true,
"fov" : 90.0, "fov" : 90.0,
"clip" : [ 0.1, 64.0 ], "clip" : [ 0.1, 64.0 ],
"size" : [ 0, 0 ] "size" : [ 0, 0 ]

View File

@ -1,7 +1,7 @@
{ {
"type": "Object", "type": "Object",
"name": "Player: Model", "name": "Player: Model",
"ignore": true, "ignore": false,
"import": "/model.json", "import": "/model.json",
"assets": [ "assets": [
"/player/bear.glb" "/player/bear.glb"
@ -27,7 +27,7 @@
}, },
"metadata": { "metadata": {
"track": true, "track": true,
"hide": true, "hide": false,
"graph": { "graph": {
"debug": { "debug": {
"print": { "print": {
@ -42,14 +42,12 @@
"baking": { "baking": {
"enabled": false "enabled": false
}, },
"renderer": {
"cull mode": "back",
"filter": "linear"
},
"lights": { "lights": {
"lightmap": false "lightmap": false
}, },
"renderer": { "renderer": {
"cull mode": "front",
"filter": "linear",
"flip textures": false, "flip textures": false,
"invert": false, "invert": false,
"skinned": true "skinned": true

View File

@ -0,0 +1,53 @@
{
"import": "./base_sourceengine.json",
"assets": [
// { "filename": "./models/animal_crossing.glb" }
{ "filename": "./models/animal_crossing/graph.json" }
// { "filename": "/burger.json", "delay": 1 }
],
"metadata": {
"graph": {
"assets": [
"./audio/music/5pm.ogg"
],
"tags": {
// exact matches
// "func_door_rotating_5473": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [1,0,0] } } },
// "func_door_rotating_5509": { "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_5584": { "action": "load", "payload": { "import": "/door.json", "metadata": { "angle":-1.570795, "normal": [1,0,0] } } },
// regex matches
// "/^prop_physics_override/": { "action": "load", "payload": { "import": "/prop.json", "metadata": { "physics": { "gravity": [ 0, 0, 0 ] } } } },
// "/^prop_physics_[^o]/": { "action": "load", "payload": { "import": "/prop.json" } },
"light_environment": { "ignore": false,
"transform": {
"position": [250.3781, 148.704, 202.286]
},
"light": {
"color": [0.95, 0.25, 0.25],
"power": 1000000,
"global": true,
"bias": {
"constant": 0,
"slope": 5,
"shader": 0.0000175
},
"radius": [0.9999999, 0],
"resolution": 4096
}
},
"/^tools\\/toolsnodraw/": { "material": {
"base": [ 1.0, 1.0, 1.0, 1.0 ],
"emissive": [ 0.0, 0.0, 0.0, 0.0 ],
"fMetallic": 0.0,
"fRoughness": 0.10000000149011612,
"fOcclusion": 1.0,
"fAlphaCutoff": 0.5,
"iAlbedo": 27,
"modeAlpha": 1
} }
}
}
}
}

View File

@ -18,17 +18,17 @@
"optimize mesh": { "simplify": 0 } "optimize mesh": { "simplify": 0 }
}, },
"info_player_spawn": { "action": "attach", "filename": "./player.json", "transform": { "orientation": [ 0, 1, 0, 0 ] } }, "info_player_spawn": { "action": "attach", "filename": "./player.json", "transform": { "orientation": [ 0, 1, 0, 0 ] } },
"light_environment": { "ignore": true, "transform": { "orientation": [0,0,0,1] }, "light": { "light_environment": { "ignore": false, "light": {
// "color": [0.1, 0.1, 0.1], // "color": [0.1, 0.1, 0.1],
"power": 10000, "power": 1000000,
"global": true, "global": true,
"bias": { "bias": {
"constant": 1.25, "constant": 0,
"slope": 1.75, "slope": 5,
"shader": 0.000000000005 "shader": 0.000025
}, },
"radius": [8, 0], "radius": [0.9999999, 0],
"resolution": 1024 "resolution": 4096
} }, } },
// "/^light_[^e]/": { "ignore": true }, // "/^light_[^e]/": { "ignore": true },

View File

@ -6,9 +6,9 @@
], ],
"metadata": { "metadata": {
"light": { "light": {
"ambient": [ 0, 0, 0 ], // "ambient": [ 0, 0, 0 ],
// "ambient": [ 0.05, 0.05, 0.05 ], // "ambient": [ 0.05, 0.05, 0.05 ],
// "ambient": [ 0.15, 0.15, 0.15 ], "ambient": [ 0.15, 0.15, 0.15 ],
// "ambient": [ 0.5, 0.5, 0.5 ], // "ambient": [ 0.5, 0.5, 0.5 ],
// "ambient": [ 0.8, 0.8, 0.8 ], // "ambient": [ 0.8, 0.8, 0.8 ],
// "ambient": [ 0.1, 0.1, 0.2 ], // "ambient": [ 0.1, 0.1, 0.2 ],
@ -24,13 +24,13 @@
"samples": 4 "samples": 4
}, },
"fog-": { "fog": {
// "color": [ 0.1, 0.1, 0.1 ], // "color": [ 0.1, 0.1, 0.1 ],
// "color": [ 0.2, 0.2, 0.2 ], // "color": [ 0.2, 0.2, 0.2 ],
"color": [ 0.3, 0.3, 0.3 ], "color": [ 0.3, 0.3, 0.3 ],
"range": [ 64, 256 ], "range": [ 64, 256 ],
"step scale": 4, "step scale": 4,
"absorbtion": 0.0125, "absorbtion": 0.125,
"density": { "density": {
"threshold": 0.35, "threshold": 0.35,
"multiplier": 2.0, "multiplier": 2.0,

View File

@ -1,7 +1,8 @@
{ {
// "import": "./rp_downtown_v2.json" // "import": "./rp_downtown_v2.json"
"import": "./ss2_medsci1.json" // "import": "./ss2_medsci1.json"
// "import": "./sh2_mcdonalds.json" // "import": "./sh2_mcdonalds.json"
"import": "./animal_crossing.json"
// "import": "./mds_mcdonalds.json" // "import": "./mds_mcdonalds.json"
// "import": "./gm_construct.json" // "import": "./gm_construct.json"
} }

View File

@ -75,12 +75,15 @@
// easy and accessible in one place // easy and accessible in one place
#ifndef BARYCENTRIC #ifndef BARYCENTRIC
#define BARYCENTRIC 0 #define BARYCENTRIC 1
#endif #endif
#if BARYCENTRIC #if BARYCENTRIC
#ifndef BARYCENTRIC_CALCULATE #ifndef BARYCENTRIC_CALCULATE
#define BARYCENTRIC_CALCULATE 0 #define BARYCENTRIC_CALCULATE 0
#endif #endif
#ifndef BUFFER_REFERENCE
#define BUFFER_REFERENCE 1
#endif
#endif #endif
#if BUFFER_REFERENCE #if BUFFER_REFERENCE

View File

@ -141,8 +141,9 @@ namespace uf {
template<typename T> T /*UF_API*/ round( const T& vector ); // template<typename T> T /*UF_API*/ round( const T& vector ); //
// Complex arithmetic // Complex arithmetic
template<typename T> typename T::type_t /*UF_API*/ dot( const T& left, const T& right ); // Compute the dot product between two vectors template<typename T> typename T::type_t /*UF_API*/ dot( const T& left, const T& right ); // Compute the dot product between two vectors
template<typename T> pod::Angle /*UF_API*/ angle( const T& a, const T& b ); // Compute the angle between two vectors template<typename T> float /*UF_API*/ angle( const T& a, const T& b ); // Compute the angle between two vectors
template<typename T> T /*UF_API*/ cross( const T& a, const T& b ); // Compute the angle between two vectors template<typename T> float /*UF_API*/ signedAngle( const T& a, const T& b, const T& axis ); // Compute the signed angle between two vectors
template<typename T> T /*UF_API*/ cross( const T& a, const T& b ); // Compute the cross product between two vectors
template<typename T> T /*UF_API*/ lerp( const T& from, const T& to, double, bool = true ); // Linearly interpolate between two vectors template<typename T> T /*UF_API*/ lerp( const T& from, const T& to, double, bool = true ); // Linearly interpolate between two vectors
template<typename T> T /*UF_API*/ lerp( const T& from, const T& to, const T&, bool = true ); // Linearly interpolate between two vectors template<typename T> T /*UF_API*/ lerp( const T& from, const T& to, const T&, bool = true ); // Linearly interpolate between two vectors
@ -220,7 +221,7 @@ namespace uf {
inline uf::Vector<T,N>& negate(); // Flip sign of all components inline uf::Vector<T,N>& negate(); // Flip sign of all components
// Complex arithmetic // Complex arithmetic
inline T dot( const Vector<T,N> right ) const; // Compute the dot product between two vectors inline T dot( const Vector<T,N> right ) const; // Compute the dot product between two vectors
inline pod::Angle angle( const Vector<T,N>& b ) const; // Compute the angle between two vectors inline float angle( const Vector<T,N>& b ) const; // Compute the angle between two vectors
inline uf::Vector<T,N> lerp( const Vector<T,N> to, double delta ) const; // Linearly interpolate between two vectors inline uf::Vector<T,N> lerp( const Vector<T,N> to, double delta ) const; // Linearly interpolate between two vectors
inline uf::Vector<T,N> slerp( const Vector<T,N> to, double delta ) const; // Spherically interpolate between two vectors inline uf::Vector<T,N> slerp( const Vector<T,N> to, double delta ) const; // Spherically interpolate between two vectors

View File

@ -111,7 +111,7 @@ inline T uf::Vector<T,N>::dot( const Vector<T,N> right ) const {
return uf::vector::dot( this->m_pod, right ); return uf::vector::dot( this->m_pod, right );
} }
template<typename T, std::size_t N> // Compute the angle between two vectors template<typename T, std::size_t N> // Compute the angle between two vectors
inline pod::Angle uf::Vector<T,N>::angle( const Vector<T,N>& b ) const { inline float uf::Vector<T,N>::angle( const Vector<T,N>& b ) const {
return uf::vector::angle( this->m_pod, b ); return uf::vector::angle( this->m_pod, b );
} }

View File

@ -314,8 +314,20 @@ typename T::type_t /*UF_API*/ uf::vector::dot( const T& left, const T& right ) {
return uf::vector::sum(uf::vector::multiply(left, right)); return uf::vector::sum(uf::vector::multiply(left, right));
} }
template<typename T> // Compute the angle between two vectors template<typename T> // Compute the angle between two vectors
pod::Angle /*UF_API*/ uf::vector::angle( const T& a, const T& b ) { float /*UF_API*/ uf::vector::angle( const T& a, const T& b ) {
return acos(uf::vector::dot(a, b)); auto dot = uf::vector::dot(a, b);
if ( dot < -1.0f ) dot = -1.0f;
if ( dot > 1.0f ) dot = 1.0f;
return acos(dot);
}
template<typename T> // Compute the angle between two vectors
float /*UF_API*/ uf::vector::signedAngle( const T& a, const T& b, const T& axis ) {
auto unsignedAngle = uf::vector::angle(a, b);
float cross_x = a.y * b.z - a.z * b.y;
float cross_y = a.z * b.x - a.x * b.z;
float cross_z = a.x * b.y - a.y * b.x;
float sign = (axis.x * cross_x + axis.y * cross_y + axis.z * cross_z) >= 0.0f ? 1.0f : -1.0f;
return unsignedAngle * sign;
} }
template<typename T> // Linearly interpolate between two vectors template<typename T> // Linearly interpolate between two vectors
T /*UF_API*/ uf::vector::lerp( const T& from, const T& to, double delta, bool clamp ) { T /*UF_API*/ uf::vector::lerp( const T& from, const T& to, double delta, bool clamp ) {

View File

@ -15,7 +15,7 @@
#include <uf/engine/graph/graph.h> #include <uf/engine/graph/graph.h>
#include <uf/ext/ext.h> #include <uf/ext/ext.h>
#define BARYCENTRIC 0 #define BARYCENTRIC 1
#if BARYCENTRIC #if BARYCENTRIC
#ifndef BARYCENTRIC_CALCULATE #ifndef BARYCENTRIC_CALCULATE
#define BARYCENTRIC_CALCULATE 0 #define BARYCENTRIC_CALCULATE 0

View File

@ -309,6 +309,7 @@ void ext::vulkan::Shader::initialize( ext::vulkan::Device& device, const uf::stl
moduleCreateInfo.pCode = (uint32_t*) spirv.data(); moduleCreateInfo.pCode = (uint32_t*) spirv.data();
VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &module)); VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &module));
//UF_MSG_DEBUG("Shader: {}", filename);
} }
{ {

View File

@ -92,9 +92,9 @@ void ext::LightBehavior::initialize( uf::Object& self ) {
} else { } else {
size = pod::Vector2ui{ uf::renderer::settings::width, uf::renderer::settings::height }; size = pod::Vector2ui{ uf::renderer::settings::width, uf::renderer::settings::height };
} }
if ( radius.y < radius.x ) radius.y = 256; if ( radius.y < radius.x ) radius.y = 2048;
camera.setProjection( uf::matrix::perspective( fov, (float) size.x / (float) size.y, radius.x, radius.y ) ); camera.setProjection( uf::matrix::perspective( fov, (float) size.x / (float) size.y, radius.x, radius.y ) );
// camera.update(true); camera.update(true);
uf::stl::string name = "RT:" + std::to_string((int) this->getUid()); uf::stl::string name = "RT:" + std::to_string((int) this->getUid());
renderMode.blitter.process = false; renderMode.blitter.process = false;

View File

@ -39,10 +39,14 @@ void ext::PlayerBehavior::initialize( uf::Object& self ) {
cameraTransform.position = uf::vector::decode( metadataJson["camera"]["position"], cameraTransform.position ); cameraTransform.position = uf::vector::decode( metadataJson["camera"]["position"], cameraTransform.position );
cameraTransform.scale = uf::vector::decode( metadataJson["camera"]["scale"], cameraTransform.scale ); cameraTransform.scale = uf::vector::decode( metadataJson["camera"]["scale"], cameraTransform.scale );
cameraTransform.reference = &transform; cameraTransform.orientation = uf::vector::decode( metadataJson["camera"]["orientation"], cameraTransform.orientation );
cameraTransform.reference = metadata.camera.fixed ? NULL : &transform;
auto cameraSettingsJson = metadataJson["camera"]["settings"]; auto cameraSettingsJson = metadataJson["camera"]["settings"];
metadata.camera.offset = uf::vector::decode( metadataJson["camera"]["offset"], metadata.camera.offset );
if ( metadataJson["camera"]["ortho"].as<bool>() ) { if ( metadataJson["camera"]["ortho"].as<bool>() ) {
float l = cameraSettingsJson["left"].as<float>(); float l = cameraSettingsJson["left"].as<float>();
float r = cameraSettingsJson["right"].as<float>(); float r = cameraSettingsJson["right"].as<float>();
@ -124,6 +128,14 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
auto& physics = this->getComponent<pod::Physics>(); auto& physics = this->getComponent<pod::Physics>();
auto& scene = uf::scene::getCurrentScene(); auto& scene = uf::scene::getCurrentScene();
{
static bool first = false;
if ( !first ) {
first = true;
uf::transform::rotate( transform, {0, 1, 0}, 3.1415926f );
}
}
struct { struct {
bool forward = false; bool forward = false;
bool backwards = false; bool backwards = false;
@ -132,6 +144,8 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
bool lookLeft = false; bool lookLeft = false;
bool lookRight = false; bool lookRight = false;
bool lookUp = false;
bool lookDown = false;
bool running = false; bool running = false;
bool walk = false; bool walk = false;
bool jump = false; bool jump = false;
@ -150,6 +164,8 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
.right = uf::inputs::kbm::states::D, .right = uf::inputs::kbm::states::D,
.lookLeft = uf::inputs::kbm::states::Left, .lookLeft = uf::inputs::kbm::states::Left,
.lookRight = uf::inputs::kbm::states::Right, .lookRight = uf::inputs::kbm::states::Right,
.lookUp = uf::inputs::kbm::states::Up,
.lookDown = uf::inputs::kbm::states::Down,
.running = uf::inputs::kbm::states::LShift, .running = uf::inputs::kbm::states::LShift,
.walk = uf::inputs::kbm::states::LAlt, .walk = uf::inputs::kbm::states::LAlt,
.jump = uf::inputs::kbm::states::Space, .jump = uf::inputs::kbm::states::Space,
@ -345,7 +361,11 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
#endif #endif
// un-flatted if noclipped // un-flatted if noclipped
if ( stats.noclipped || collider.stats.gravity == pod::Vector3f{0,0,0} ){ if ( metadata.camera.fixed ) {
translator = cameraTransform;
translator.forward.y = 0;
translator.forward = uf::vector::normalize( translator.forward );
} else if ( stats.noclipped || collider.stats.gravity == pod::Vector3f{0,0,0} ){
translator.forward.y += cameraTransform.forward.y; translator.forward.y += cameraTransform.forward.y;
translator.forward = uf::vector::normalize( translator.forward ); translator.forward = uf::vector::normalize( translator.forward );
} }
@ -373,15 +393,24 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
physics.linear.velocity *= { speed.friction, 1, speed.friction }; physics.linear.velocity *= { speed.friction, 1, speed.friction };
stats.walking = (keys.forward ^ keys.backwards) || (keys.left ^ keys.right); stats.walking = (keys.forward ^ keys.backwards) || (keys.left ^ keys.right);
if ( stats.walking ) { if ( stats.walking ) {
float factor = stats.floored ? 1.0f : speed.air; float factor = stats.floored ? 1.0f : speed.air;
if ( stats.noclipped ) { if ( stats.noclipped ) {
physics.linear.velocity += target * speed.move; physics.linear.velocity += target * speed.move;
} else { } else {
// float delta = collider.body ? uf::physics::impl::timescale : uf::physics::time::delta; physics.linear.velocity += target * std::clamp( speed.move * factor - uf::vector::dot( physics.linear.velocity, target ), 0.0f, speed.move * 10 * uf::physics::time::delta );
float delta = uf::physics::time::delta; }
physics.linear.velocity += target * std::clamp( speed.move * factor - uf::vector::dot( physics.linear.velocity, target ), 0.0f, speed.move * 10 * delta ); auto dot = uf::vector::dot( transform.forward, target );
if ( !metadata.movement.strafe && dot < 1.0f ) {
// auto cross = uf::vector::normalize( uf::vector::cross( transform.forward, target ) );
// auto axis = cross == pod::Vector3f{0, 0, 0} ? transform.up : cross;
auto axis = transform.up;
float angle = uf::vector::signedAngle( transform.forward, target, axis ) * uf::physics::time::delta * 4; // speed.rotate;
if ( collider.body ) uf::physics::impl::applyRotation( collider, axis, angle ); else
uf::transform::rotate( transform, axis, angle );
} }
} }
if ( !stats.floored ) stats.walking = false; if ( !stats.floored ) stats.walking = false;
@ -406,7 +435,7 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
{ {
const pod::Vector2ui deadZone{0, 0}; const pod::Vector2ui deadZone{0, 0};
const auto& mouseDelta = uf::inputs::kbm::states::Mouse; const auto& mouseDelta = uf::inputs::kbm::states::Mouse;
bool shouldnt = (mouseDelta.x == 0 && mouseDelta.y == 0) || !metadata.system.control; bool shouldnt = (mouseDelta.x == 0 && mouseDelta.y == 0) || !metadata.system.control || metadata.camera.fixed;
if ( !shouldnt ) { if ( !shouldnt ) {
pod::Vector2f delta = { pod::Vector2f delta = {
(float) metadata.mouse.sensitivity.x * (abs(mouseDelta.x) < deadZone.x ? 0 : mouseDelta.x), (float) metadata.mouse.sensitivity.x * (abs(mouseDelta.x) < deadZone.x ? 0 : mouseDelta.x),
@ -417,30 +446,50 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
} }
#endif #endif
if ( metadata.camera.queued.x != 0 || metadata.camera.queued.y != 0 ) { if ( !metadata.camera.fixed ) {
auto lookDelta = metadata.camera.queued; if ( metadata.camera.queued.x != 0 || metadata.camera.queued.y != 0 ) {
if ( abs(lookDelta.x) > uf::physics::time::delta / metadata.mouse.smoothing.x ) lookDelta.x *= uf::physics::time::delta * metadata.mouse.smoothing.x; auto lookDelta = metadata.camera.queued;
if ( abs(lookDelta.y) > uf::physics::time::delta / metadata.mouse.smoothing.y ) lookDelta.y *= uf::physics::time::delta * metadata.mouse.smoothing.y; if ( abs(lookDelta.x) > uf::physics::time::delta / metadata.mouse.smoothing.x ) lookDelta.x *= uf::physics::time::delta * metadata.mouse.smoothing.x;
metadata.camera.queued -= lookDelta; if ( abs(lookDelta.y) > uf::physics::time::delta / metadata.mouse.smoothing.y ) lookDelta.y *= uf::physics::time::delta * metadata.mouse.smoothing.y;
if ( lookDelta.x != 0 ) { metadata.camera.queued -= lookDelta;
if ( metadata.camera.invert.x ) lookDelta.x *= -1; if ( lookDelta.x != 0 ) {
metadata.camera.limit.current.x += lookDelta.x; if ( metadata.camera.invert.x ) lookDelta.x *= -1;
if ( metadata.camera.limit.current.x != metadata.camera.limit.current.x || ( metadata.camera.limit.current.x < metadata.camera.limit.max.x && metadata.camera.limit.current.x > metadata.camera.limit.min.x ) ) { metadata.camera.limit.current.x += lookDelta.x;
if ( collider.body ) uf::physics::impl::applyRotation( collider, transform.up, lookDelta.x ); else if ( metadata.camera.limit.current.x != metadata.camera.limit.current.x || ( metadata.camera.limit.current.x < metadata.camera.limit.max.x && metadata.camera.limit.current.x > metadata.camera.limit.min.x ) ) {
uf::transform::rotate( transform, transform.up, lookDelta.x ); if ( collider.body ) uf::physics::impl::applyRotation( collider, transform.up, lookDelta.x ); else
} else metadata.camera.limit.current.x -= lookDelta.x; uf::transform::rotate( transform, transform.up, lookDelta.x );
} else metadata.camera.limit.current.x -= lookDelta.x;
}
if ( lookDelta.y != 0 ) {
if ( metadata.camera.invert.y ) lookDelta.y *= -1;
metadata.camera.limit.current.y += lookDelta.y;
if ( metadata.camera.limit.current.y != metadata.camera.limit.current.y || ( metadata.camera.limit.current.y < metadata.camera.limit.max.y && metadata.camera.limit.current.y > metadata.camera.limit.min.y ) ) {
// if ( collider.body && !collider.shared ) uf::physics::impl::applyRotation( collider, cameraTransform.right, lookDelta.y ); else
uf::transform::rotate( cameraTransform, cameraTransform.right, lookDelta.y );
} else metadata.camera.limit.current.y -= lookDelta.y;
}
} else {
if ( keys.lookRight ^ keys.lookLeft ) {
if ( collider.body ) uf::physics::impl::applyRotation( collider, transform.up, speed.rotate * (keys.lookRight ? 1 : -1) ); else
uf::transform::rotate( transform, transform.up, speed.rotate * (keys.lookRight ? 1 : -1) );
}
if ( keys.lookUp ^ keys.lookDown ) {
float direction = keys.lookUp ? 1 : -1;
if ( metadata.camera.invert.y ) direction *= -1;
uf::transform::rotate( cameraTransform, cameraTransform.right, speed.rotate * direction );
}
}
} else {
if ( keys.lookRight ^ keys.lookLeft ) {
// auto rotation = uf::quaternion::axisAngle( cameraTransform.up, uf::physics::time::delta * (keys.lookRight ? 1 : -1) );
// cameraTransform.position = uf::quaternion::rotate( rotation, cameraTransform.position - transform.position );
} }
if ( lookDelta.y != 0 ) { if ( keys.lookUp ^ keys.lookDown ) {
if ( metadata.camera.invert.y ) lookDelta.y *= -1; // if ( collider.body && !collider.shared ) uf::physics::impl::applyRotation( collider, cameraTransform.right, lookDelta.y ); else
metadata.camera.limit.current.y += lookDelta.y; float direction = keys.lookUp ? 1 : -1;
if ( metadata.camera.limit.current.y != metadata.camera.limit.current.y || ( metadata.camera.limit.current.y < metadata.camera.limit.max.y && metadata.camera.limit.current.y > metadata.camera.limit.min.y ) ) { if ( metadata.camera.invert.y ) direction *= -1;
// if ( collider.body && !collider.shared ) uf::physics::impl::applyRotation( collider, cameraTransform.right, lookDelta.y ); else uf::transform::rotate( cameraTransform, cameraTransform.right, speed.rotate * direction );
uf::transform::rotate( cameraTransform, cameraTransform.right, lookDelta.y );
} else metadata.camera.limit.current.y -= lookDelta.y;
} }
} else if ( keys.lookRight ^ keys.lookLeft ) {
if ( collider.body ) uf::physics::impl::applyRotation( collider, transform.up, speed.rotate * (keys.lookRight ? 1 : -1) ); else
uf::transform::rotate( transform, transform.up, speed.rotate * (keys.lookRight ? 1 : -1) );
} }
{ {
if ( collider.body ) uf::physics::impl::setVelocity( collider, physics.linear.velocity ); else if ( collider.body ) uf::physics::impl::setVelocity( collider, physics.linear.velocity ); else
@ -448,10 +497,25 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
} }
if ( stats.deltaCrouch ) { if ( metadata.camera.fixed ) {
float delta = metadata.movement.crouch; cameraTransform.reference = NULL;
if ( metadata.system.crouching ) cameraTransform.position.y -= delta; cameraTransform.position = transform.position + metadata.camera.offset;
else cameraTransform.position.y += delta; // cameraTransform.orientation = uf::vector::decode( metadataJson["camera"]["orientation"], uf::quaternion::identity() );
cameraTransform = uf::transform::reorient( cameraTransform );
} else {
if ( metadata.camera.offset != pod::Vector3f{0,0,0} ) {
//auto flattened = uf::transform::flatten( cameraTransform );
auto& flattened = transform;
metadata.camera.intermediary.position = uf::quaternion::rotate( flattened.orientation, metadata.camera.offset );
metadata.camera.intermediary.reference = &transform;
cameraTransform.reference = &metadata.camera.intermediary;
}
if ( stats.deltaCrouch ) {
float delta = metadata.movement.crouch;
if ( metadata.system.crouching ) cameraTransform.position.y -= delta;
else cameraTransform.position.y += delta;
}
} }
#if UF_USE_OPENAL #if UF_USE_OPENAL
@ -550,6 +614,7 @@ void ext::PlayerBehavior::Metadata::serialize( uf::Object& self, uf::Serializer&
auto& serializerAudioFootstep = serializer["audio"]["footstep"]; auto& serializerAudioFootstep = serializer["audio"]["footstep"];
auto& serializerCamera = serializer["camera"]; auto& serializerCamera = serializer["camera"];
auto& serializerCameraLimit = serializerCamera["limit"]; auto& serializerCameraLimit = serializerCamera["limit"];
auto& serializerCameraSettings = serializerCamera["settings"];
serializerSystem["menu"] = /*this->*/system.menu; serializerSystem["menu"] = /*this->*/system.menu;
serializerSystem["control"] = /*this->*/system.control; serializerSystem["control"] = /*this->*/system.control;
@ -561,6 +626,7 @@ void ext::PlayerBehavior::Metadata::serialize( uf::Object& self, uf::Serializer&
serializerMovement["run"] = /*this->*/movement.run; serializerMovement["run"] = /*this->*/movement.run;
serializerMovement["walk"] = /*this->*/movement.walk; serializerMovement["walk"] = /*this->*/movement.walk;
serializerMovement["air"] = /*this->*/movement.air; serializerMovement["air"] = /*this->*/movement.air;
serializerMovement["strafe"] = /*this->*/movement.strafe;
serializerMovement["jump"] = uf::vector::encode(/*this->*/movement.jump); serializerMovement["jump"] = uf::vector::encode(/*this->*/movement.jump);
serializerMovement["floored"]["feet"] = uf::vector::encode(/*this->*/movement.floored.feet); serializerMovement["floored"]["feet"] = uf::vector::encode(/*this->*/movement.floored.feet);
serializerMovement["floored"]["floor"] = uf::vector::encode(/*this->*/movement.floored.floor); serializerMovement["floored"]["floor"] = uf::vector::encode(/*this->*/movement.floored.floor);
@ -573,6 +639,7 @@ void ext::PlayerBehavior::Metadata::serialize( uf::Object& self, uf::Serializer&
serializerCameraLimit["current"] = uf::vector::encode(/*this->*/camera.limit.current); serializerCameraLimit["current"] = uf::vector::encode(/*this->*/camera.limit.current);
serializerCameraLimit["minima"] = uf::vector::encode(/*this->*/camera.limit.min); serializerCameraLimit["minima"] = uf::vector::encode(/*this->*/camera.limit.min);
serializerCameraLimit["maxima"] = uf::vector::encode(/*this->*/camera.limit.max); serializerCameraLimit["maxima"] = uf::vector::encode(/*this->*/camera.limit.max);
serializerCameraSettings["fixed"] = camera.fixed;
serializer["use"]["length"] = /*this->*/use.length; serializer["use"]["length"] = /*this->*/use.length;
} }
@ -583,6 +650,7 @@ void ext::PlayerBehavior::Metadata::deserialize( uf::Object& self, uf::Serialize
auto& serializerMovement = serializer["movement"]; auto& serializerMovement = serializer["movement"];
auto& serializerCamera = serializer["camera"]; auto& serializerCamera = serializer["camera"];
auto& serializerCameraLimit = serializerCamera["limit"]; auto& serializerCameraLimit = serializerCamera["limit"];
auto& serializerCameraSettings = serializerCamera["settings"];
/*this->*/system.menu = serializerSystem["menu"].as(/*this->*/system.menu); /*this->*/system.menu = serializerSystem["menu"].as(/*this->*/system.menu);
/*this->*/system.control = serializerSystem["control"].as(/*this->*/system.control); /*this->*/system.control = serializerSystem["control"].as(/*this->*/system.control);
@ -594,6 +662,7 @@ void ext::PlayerBehavior::Metadata::deserialize( uf::Object& self, uf::Serialize
/*this->*/movement.run = serializerMovement["run"].as(/*this->*/movement.run); /*this->*/movement.run = serializerMovement["run"].as(/*this->*/movement.run);
/*this->*/movement.walk = serializerMovement["walk"].as(/*this->*/movement.walk); /*this->*/movement.walk = serializerMovement["walk"].as(/*this->*/movement.walk);
/*this->*/movement.air = serializerMovement["air"].as(/*this->*/movement.air); /*this->*/movement.air = serializerMovement["air"].as(/*this->*/movement.air);
/*this->*/movement.strafe = serializerMovement["strafe"].as(/*this->*/movement.strafe);
/*this->*/movement.jump = uf::vector::decode(serializerMovement["jump"], /*this->*/movement.jump); /*this->*/movement.jump = uf::vector::decode(serializerMovement["jump"], /*this->*/movement.jump);
/*this->*/movement.floored.feet = uf::vector::decode(serializerMovement["floored"]["feet"], /*this->*/movement.floored.feet); /*this->*/movement.floored.feet = uf::vector::decode(serializerMovement["floored"]["feet"], /*this->*/movement.floored.feet);
/*this->*/movement.floored.floor = uf::vector::decode(serializerMovement["floored"]["floor"], /*this->*/movement.floored.floor); /*this->*/movement.floored.floor = uf::vector::decode(serializerMovement["floored"]["floor"], /*this->*/movement.floored.floor);
@ -609,6 +678,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.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.min = uf::vector::decode( serializerCameraLimit["minima"], /*this->*/camera.limit.min );
/*this->*/camera.limit.max = uf::vector::decode( serializerCameraLimit["maxima"], /*this->*/camera.limit.max ); /*this->*/camera.limit.max = uf::vector::decode( serializerCameraLimit["maxima"], /*this->*/camera.limit.max );
/*this->*/camera.fixed = serializerCameraSettings["fixed"].as( /*this->*/camera.fixed );
/*this->*/use.length = serializer["use"]["length"].as(/*this->*/use.length); /*this->*/use.length = serializer["use"]["length"].as(/*this->*/use.length);
} }

View File

@ -26,6 +26,7 @@ namespace ext {
float walk = 1.0f; float walk = 1.0f;
float friction = 0.8f; float friction = 0.8f;
float air = 1.0f; float air = 1.0f;
bool strafe = true;
pod::Vector3f jump = {0,8,0}; pod::Vector3f jump = {0,8,0};
struct { struct {
pod::Vector3f feet = {0,-1.5,0}; pod::Vector3f feet = {0,-1.5,0};
@ -41,6 +42,11 @@ namespace ext {
} limit; } limit;
pod::Vector3t<bool> invert; pod::Vector3t<bool> invert;
pod::Vector2f queued; pod::Vector2f queued;
pod::Vector3f offset;
pod::Transform<> intermediary;
bool fixed = false;
} camera; } camera;
struct { struct {
pod::Vector2f sensitivity = {1,1}; pod::Vector2f sensitivity = {1,1};

View File

@ -343,9 +343,13 @@ void ext::ExtSceneBehavior::tick( uf::Object& self ) {
pod::Transform<> transform = controller.getComponent<pod::Transform<>>(); pod::Transform<> transform = controller.getComponent<pod::Transform<>>();
if ( controller.hasComponent<uf::Camera>() ) { if ( controller.hasComponent<uf::Camera>() ) {
auto& camera = controller.getComponent<uf::Camera>(); auto& camera = controller.getComponent<uf::Camera>();
transform = camera.getTransform();
/*
transform.position += camera.getTransform().position; transform.position += camera.getTransform().position;
transform = uf::transform::reorient( transform ); transform = uf::transform::reorient( transform );
*/
} }
transform = uf::transform::flatten( transform );
transform.forward *= -1; transform.forward *= -1;
ext::al::listener( transform ); ext::al::listener( transform );

View File

@ -885,12 +885,12 @@ void EXT_API ext::tick() {
/* Update physics timer */ { /* Update physics timer */ {
uf::physics::tick(); uf::physics::tick();
} }
/* Update graph */ {
uf::graph::tick();
}
/* Update entities */ { /* Update entities */ {
uf::scene::tick(); uf::scene::tick();
} }
/* Update graph */ {
uf::graph::tick();
}
/* Tick Main Thread Queue */ { /* Tick Main Thread Queue */ {
uf::thread::process( uf::thread::get(uf::thread::mainThreadName) ); uf::thread::process( uf::thread::get(uf::thread::mainThreadName) );