Commit for 2022.01.01 23-17-04.7z

This commit is contained in:
mrq 2022-01-01 23:17:00 -06:00
parent ae6bb02cdd
commit eef9cac83b
50 changed files with 325 additions and 369 deletions

View File

@ -3,7 +3,7 @@ CC = $(shell cat "./bin/exe/default.config")
TARGET_NAME = program
TARGET_EXTENSION = exe
TARGET_LIB_EXTENSION = dll
RENDERER = opengl
RENDERER = vulkan
include makefiles/$(ARCH).$(CC).make

View File

@ -24,7 +24,7 @@
},
"vxgi": {
"limiter": 0.5,
"size": 128,
"size": 96,
"dispatch": 8,
"cascades": 4,
"cascadePower": 2,
@ -72,9 +72,9 @@
"deferred alias output to swapchain": false,
"vsync": true,
"hdr": false,
"vxgi": false,
"vxgi": true,
"deferred sampling": false,
"culling": false,
"culling": true,
"bloom": true
},
"formats": {

View File

@ -1,7 +1,7 @@
{
"type": "Object",
"name": "Player: Model",
"ignore": true,
"ignore": false,
"assets": [
"/player/bear.glb"
// { "filename": "/player/bear/graph.json", "delay": 0, "single threaded": false, "category": "models" }

View File

@ -20,7 +20,7 @@
"metadata": {
"model": {
"baking": {
"enabled": true,
"enabled": false,
"resolution": 8192,
"shadows": 1024,
"trigger": { "mode": "rendered" },

View File

@ -72,11 +72,6 @@ void client::initialize() {
client::config["mouse"]["visible"] = payload.mouse.visible;
client::config["window"]["mouse"]["center"] = !payload.mouse.visible;
});
uf::hooks.addHook( "window:Mouse.Lock", [&]( ext::json::Value& json ){
if ( client::window.hasFocus() ) {
client::window.setMousePosition(client::window.getSize()/2);
}
});
uf::hooks.addHook( "window:Mouse.Lock", [&](){
if ( client::window.hasFocus() ) {
client::window.setMousePosition(client::window.getSize()/2);

View File

@ -81,7 +81,7 @@ int main(int argc, char** argv){
#endif
/*
static bool first = false; if ( !first ) { first = true;
uf::Serializer json;
ext::json::Value json;
uf::hooks.call("window:Resized", pod::payloads::windowResized{
{
"window:Resized",

View File

@ -17,11 +17,12 @@ namespace uf {
UF_BEHAVIOR_DEFINE_FUNCTIONS();
UF_BEHAVIOR_DEFINE_METADATA(
struct Queued {
uf::stl::string name;
pod::Hook::userdata_t userdata;
ext::json::Value json;
uf::stl::string name = "";
double timeout = 0;
int_fast8_t type = 0;
pod::Hook::userdata_t userdata{};
ext::json::Value json{};
};
struct {
size_t mtime = 0;

View File

@ -35,19 +35,18 @@ namespace uf {
uf::stl::string formatHookName( const uf::stl::string& name );
static uf::stl::string formatHookName( const uf::stl::string& name, size_t uid, bool fetch = true );
void queueHook( const uf::stl::string&, const ext::json::Value& = ext::json::null(), float = 0 );
template<typename T> size_t addHook( const uf::stl::string& name, T function );
uf::Hooks::return_t callHook( const uf::stl::string& );
uf::Hooks::return_t callHook( const uf::stl::string&, const pod::Hook::userdata_t& );
template<typename T> uf::Hooks::return_t callHook( const uf::stl::string& name, const T& payload );
void queueHook( const uf::stl::string&, float = 0 );
void queueHook( const uf::stl::string&, const ext::json::Value& json, float = 0 );
template<typename T>
void queueHook( const uf::stl::string&, const T&, float = 0 );
uf::Hooks::return_t callHook( const uf::stl::string& );
uf::Hooks::return_t callHook( const uf::stl::string&, const ext::json::Value& );
uf::Hooks::return_t callHook( const uf::stl::string&, const uf::Serializer& );
uf::Hooks::return_t callHook( const uf::stl::string&, const pod::Hook::userdata_t& );
template<typename T> size_t addHook( const uf::stl::string& name, T function );
template<typename T> uf::Hooks::return_t callHook( const uf::stl::string& name, const T& payload );
uf::stl::string grabURI( const uf::stl::string& filename, const uf::stl::string& root = "" );
};
}

View File

@ -20,19 +20,17 @@ template<typename T>
size_t uf::Object::addHook( const uf::stl::string& name, T callback ) {
uf::stl::string parsed = this->formatHookName( name );
std::size_t id = uf::hooks.addHook( parsed, callback );
#if UF_ENTITY_METADATA_USE_JSON
auto& metadata = this->getComponent<uf::Serializer>();
metadata["system"]["hooks"]["bound"][parsed].emplace_back(id);
#else
auto& metadata = this->getComponent<uf::ObjectBehavior::Metadata>();
metadata.hooks.bound[parsed].emplace_back(id);
#endif
return id;
}
template<typename T>
uf::Hooks::return_t uf::Object::callHook( const uf::stl::string& name, const T& p ) {
uf::Userdata payload;
pod::Hook::userdata_t payload;
payload.create<T>(p);
return uf::hooks.call( this->formatHookName( name ), payload );
}

View File

@ -16,6 +16,7 @@ namespace pod {
struct UF_API Physics {
size_t uid = 0;
uf::Object* object = NULL;
bool shared = false; // share control of the transform both in-engine and bullet, set to true if you're directly modifying the transform
rp3d::RigidBody* body = NULL;
rp3d::CollisionShape* shape = NULL;
@ -35,7 +36,6 @@ namespace pod {
struct {
uint32_t flags = 0;
float mass = 0.0f;
float friction = 0.8f;
float restitution = 0.0f;

View File

@ -101,17 +101,20 @@
#define UF_TIMER_MULTITRACE_END(X) UF_MSG_DEBUG(X);
#include <type_traits>
#define TYPE_SANITIZE(T) std::remove_cv_t<std::remove_reference_t<T>>
#if UF_CTTI
#include <ctti/type_id.hpp>
#define TYPE_INDEX_T ctti::type_id_t
#define TYPE_HASH_T ctti::detail::hash_t
#define TYPE(T) ctti::type_id<T>()
#define TYPE(T) ctti::type_id<TYPE_SANITIZE(T)>()
#define TYPE_HASH(T) TYPE(T).hash()
#define TYPE_NAME(T) ctti::nameof<T>()
#define TYPE_NAME(T) ctti::nameof<T>().str()
#else
#define TYPE_INDEX_T std::type_index
#define TYPE_HASH_T std::size_t
#define TYPE(T) typeid(T)
#define TYPE(T) typeid(TYPE_SANITIZE(T))
#define TYPE_HASH(T) TYPE(T).hash_code()
#define TYPE_NAME(T) TYPE(T).name()
#endif

View File

@ -13,8 +13,8 @@ namespace spec {
void UF_API terminate();
bool UF_API connected( size_t = 0 );
bool UF_API pressed( const uf::stl::string&, size_t = 0 );
float UF_API analog( const uf::stl::string&, size_t = 0 );
// bool UF_API pressed( const uf::stl::string&, size_t = 0 );
// float UF_API analog( const uf::stl::string&, size_t = 0 );
}
}
namespace controller = dreamcast::controller;

View File

@ -10,8 +10,8 @@ namespace spec {
void UF_API terminate();
bool UF_API connected( size_t = 0 );
bool UF_API pressed( const uf::stl::string&, size_t = 0 );
float UF_API analog( const uf::stl::string&, size_t = 0 );
// bool UF_API pressed( const uf::stl::string&, size_t = 0 );
// float UF_API analog( const uf::stl::string&, size_t = 0 );
};
};
}

View File

@ -13,8 +13,8 @@ namespace spec {
void UF_API terminate();
bool UF_API connected( size_t = 0 );
bool UF_API pressed( const uf::stl::string&, size_t = 0 );
float UF_API analog( const uf::stl::string&, size_t = 0 );
// bool UF_API pressed( const uf::stl::string&, size_t = 0 );
// float UF_API analog( const uf::stl::string&, size_t = 0 );
}
}
namespace controller = win32::controller;

View File

@ -49,22 +49,20 @@ namespace uf {
uf::Hooks::container_t m_container;
public:
bool exists( const name_t& name );
size_t addHook( const name_t& name, const pod::Hook::function_t& callback, const pod::Hook::Type& = {UF_USERDATA_CTTI(void), 0} );
void removeHook( const name_t& name, size_t uid );
return_t call( const name_t& name, const argument_t& payload );
return_t call( const name_t& name, const uf::stl::string& = "" );
return_t call( const name_t& name, const ext::json::Value& );
return_t call( const name_t& name, const uf::Serializer& );
size_t addHook( const name_t& name, const pod::Hook::function_t& callback, const pod::Hook::Type& = {UF_USERDATA_CTTI(void), 0} );
size_t addHook( const name_t& name, const std::function<void()>& callback );
template<typename Arg>
size_t addHook( const uf::Hooks::name_t& name, const std::function<void(Arg)>& callback );
template<typename R, typename Arg>
size_t addHook( const uf::Hooks::name_t& name, const std::function<R(Arg)>& callback );
template<typename Function>
size_t addHook( const uf::Hooks::name_t& name, const Function& lambda );
// return_t call( const name_t& name );
// return_t call( const name_t& name, const argument_t& payload );
return_t call( const name_t& name, const argument_t& payload = {} );
template<typename T>
return_t call( const name_t& name, const T& payload );
@ -72,14 +70,6 @@ namespace uf {
extern UF_API uf::Hooks hooks;
}
/*
namespace uf {
namespace HookHandler {
namespace Readable {
typedef std::function<uf::stl::string(const uf::stl::string&)> function_t;
}
}
}
*/
#include "function_traits.inl"
#include "hook.inl"

View File

@ -1,6 +1,6 @@
template<typename Arg>
size_t uf::Hooks::addHook( const uf::Hooks::name_t& name, const std::function<void(Arg)>& callback ) {
typedef typename std::remove_reference<Arg>::type Argument;
typedef TYPE_SANITIZE(Arg) Argument;
return addHook(name, [=]( const pod::Hook::userdata_t& userdata ){
pod::Hook::userdata_t ret;
@ -14,7 +14,7 @@ size_t uf::Hooks::addHook( const uf::Hooks::name_t& name, const std::function<vo
}
template<typename R, typename Arg>
size_t uf::Hooks::addHook( const uf::Hooks::name_t& name, const std::function<R(Arg)>& callback ) {
typedef typename std::remove_reference<Arg>::type Argument;
typedef TYPE_SANITIZE(Arg) Argument;
return addHook(name, [=]( const pod::Hook::userdata_t& userdata ){
pod::Hook::userdata_t ret;
@ -36,5 +36,6 @@ template<typename T>
uf::Hooks::return_t uf::Hooks::call( const uf::Hooks::name_t& name, const T& p ) {
pod::Hook::userdata_t payload;
payload.create<T>(p);
return call( name, payload );
}

View File

@ -2,7 +2,7 @@
#include <uf/config.h>
#include <uf/utils/string/string.h>
#include <uf/utils/math/vector.h>
namespace uf {
namespace inputs {
@ -13,7 +13,10 @@ namespace uf {
typedef const char* key_t;
#define UF_KEY(x) x
#endif
typedef bool state_t;
typedef float analog_t;
typedef pod::Vector2t<analog_t> analog2_t;
namespace kbm {
namespace enums {
@ -254,28 +257,42 @@ namespace uf {
constexpr key_t START = UF_KEY("START");
};
namespace states {
// L/R for index controllers
extern UF_API state_t R_DPAD_UP;
extern UF_API state_t R_DPAD_DOWN;
extern UF_API state_t R_DPAD_LEFT;
extern UF_API state_t R_DPAD_RIGHT;
extern UF_API state_t R_JOYSTICK;
extern UF_API state_t R_A;
extern UF_API state_t R_B;
extern UF_API state_t R_X;
extern UF_API state_t R_Y;
extern UF_API state_t L_DPAD_UP;
extern UF_API state_t L_DPAD_DOWN;
extern UF_API state_t L_DPAD_LEFT;
extern UF_API state_t L_DPAD_RIGHT;
extern UF_API state_t L_JOYSTICK;
extern UF_API state_t L_A;
extern UF_API state_t DPAD_UP;
extern UF_API state_t DPAD_DOWN;
extern UF_API state_t DPAD_LEFT;
extern UF_API state_t DPAD_RIGHT;
extern UF_API state_t A;
extern UF_API state_t B;
extern UF_API state_t X;
extern UF_API state_t Y;
extern UF_API state_t L_TRIGGER;
extern UF_API state_t R_TRIGGER;
extern UF_API state_t L_B;
extern UF_API state_t L_X;
extern UF_API state_t L_Y;
// default controller mappings, aliased to L/R sides
extern UF_API state_t& DPAD_UP; // = L_DPAD_UP;
extern UF_API state_t& DPAD_DOWN; // = L_DPAD_DOWN;
extern UF_API state_t& DPAD_LEFT; // = L_DPAD_LEFT;
extern UF_API state_t& DPAD_RIGHT; // = L_DPAD_RIGHT;
extern UF_API state_t& A; // = R_A;
extern UF_API state_t& B; // = R_B;
extern UF_API state_t& X; // = R_X;
extern UF_API state_t& Y; // = R_Y;
// analog inputs
extern UF_API analog_t L_TRIGGER;
extern UF_API analog_t R_TRIGGER;
extern UF_API analog2_t L_JOYSTICK;
extern UF_API analog2_t R_JOYSTICK;
extern UF_API state_t START;
};
}

View File

@ -15,7 +15,7 @@ namespace uf {
static Input UF_API_CALL decode( Input begin, Input end, Encoding::Literal& output, Encoding::Literal fallback = 0 );
template<typename Input>
inline static Encoding::Literal UF_API_CALL decode( Input begin, Input end, Encoding::Literal fallback = 0 ) {
Encoding::Literal literal;
Encoding::Literal literal{};
Utf8::decode(begin, end, literal, fallback);
return literal;
}

View File

@ -1,49 +1 @@
#pragma once
#if 0
#include <uf/config.h>
#include <typeindex>
#include <uf/utils/memory/unordered_map.h>
#define UF_TYPE_REGISTER 1
#include <uf/utils/memory/string.h>
namespace pod {
struct UF_API TypeInfo {
size_t hash;
size_t size;
struct {
uf::stl::string pretty;
uf::stl::string compiler;
} name;
};
}
namespace std {
template<> struct hash<pod::TypeInfo> {
size_t operator()(const pod::TypeInfo& type) const {
return type.hash;
}
};
}
namespace uf {
namespace typeInfo {
typedef TYPE_INDEX_T index_t;
typedef pod::TypeInfo type_t;
extern UF_API uf::stl::unordered_map<index_t, pod::TypeInfo>* types;
void UF_API registerType( const index_t&, size_t = 0, const uf::stl::string& = "" );
const pod::TypeInfo& UF_API getType( size_t );
const pod::TypeInfo& UF_API getType( const index_t& );
template<typename T>
const std::type_index getIndex();
template<typename T>
void registerType( const uf::stl::string& pretty = "" );
template<typename T>
const pod::TypeInfo& getType();
}
}
#include "type.inl"
#endif

View File

@ -1,12 +0,0 @@
template<typename T>
const uf::typeInfo::index_t uf::typeInfo::getIndex() {
return TYPE(T);
}
template<typename T>
void uf::typeInfo::registerType( const uf::stl::string& pretty ) {
return registerType(getIndex<T>(), sizeof(T), pretty);
}
template<typename T>
const pod::TypeInfo& uf::typeInfo::getType() {
return getType(getIndex<T>());
}

View File

@ -89,7 +89,7 @@ pod::PointeredUserdata uf::pointeredUserdata::create( const T& data ) {
}
template<typename T>
pod::PointeredUserdata uf::pointeredUserdata::create( uf::MemoryPool& requestedMemoryPool, const T& data ) {
// uf::MemoryPool& memoryPool = uf::memoryPool::global.size() > 0 ? uf::memoryPool::global : requestedMemoryPool;
// if ( std::is_reference<T>() ) return uf::pointeredUserdata::create<typename std::remove_reference<T>::type>( requestedMemoryPool, data );
pod::PointeredUserdata userdata = uf::pointeredUserdata::create( requestedMemoryPool, sizeof(data), nullptr );
userdata.type = UF_USERDATA_CTTI(T);
union {
@ -133,7 +133,7 @@ bool uf::pointeredUserdata::is( const pod::PointeredUserdata& userdata ) {
template<typename T>
pod::PointeredUserdata& uf::PointeredUserdata::create( const T& data ) {
this->destroy();
return this->m_pod = uf::pointeredUserdata::create(data);
return this->m_pod = uf::pointeredUserdata::create<T>(data);
}
// Easy way to get the userdata as a reference
template<typename T>

View File

@ -16,6 +16,8 @@
#define UF_USERDATA_CTTI_TYPE TYPE_HASH_T // size_t
#define UF_USERDATA_CTTI(T) TYPE_HASH(T)
#define DEBUG_PRINT_TYPE(name, T) UF_MSG_DEBUG(name << ": " << TYPE_NAME(T) << " | " << TYPE_HASH(T) << " | " << sizeof(T) );
namespace pod {
struct UF_API Userdata {
size_t len = 0;

View File

@ -7,6 +7,9 @@ pod::Userdata* uf::userdata::create( const T& data ) {
}
template<typename T>
pod::Userdata* uf::userdata::create( uf::MemoryPool& requestedMemoryPool, const T& data ) {
// CTTI information of a T& != T
// if ( std::is_reference<T>() ) return uf::userdata::create<typename std::remove_reference<T>::type>( requestedMemoryPool, data );
pod::Userdata* userdata = uf::userdata::create( requestedMemoryPool, sizeof(data), nullptr );
userdata->type = UF_USERDATA_CTTI(T);
union {
@ -50,7 +53,7 @@ bool uf::userdata::is( const pod::Userdata* userdata ) {
template<typename T>
pod::Userdata* uf::Userdata::create( const T& data ) {
this->destroy();
return this->m_pod = uf::userdata::create(data);
return this->m_pod = uf::userdata::create<T>(data);
}
// Easy way to get the userdata as a reference
template<typename T>

View File

@ -80,7 +80,7 @@ void uf::Asset::processQueue() {
tasks.emplace_back([=](){
auto filename = job.type == "cache" ? this->cache(job.uri, job.hash, job.mime) : this->load(job.uri, job.hash, job.mime);
if ( filename == "" ) return;
uf::Serializer payload;
ext::json::Value payload;
payload["filename"] = filename;
payload["hash"] = job.hash;
payload["mime"] = job.mime;
@ -105,7 +105,7 @@ void uf::Asset::processQueue() {
}
uf::stl::string filename = type == "cache" ? this->cache(uri, hash, mime) : this->load(uri, hash, mime);
if ( callback != "" && filename != "" ) {
uf::Serializer payload;
ext::json::Value payload;
payload["filename"] = filename;
payload["hash"] = hash;
payload["mime"] = mime;
@ -130,7 +130,7 @@ void uf::Asset::processQueue() {
}
uf::stl::string filename = type == "cache" ? this->cache(uri, hash, mime) : this->load(uri, hash, mime);
if ( callback != "" && filename != "" ) {
uf::Serializer payload;
ext::json::Value payload;
payload["filename"] = filename;
payload["hash"] = hash;
payload["mime"] = mime;
@ -152,7 +152,7 @@ void uf::Asset::processQueue() {
tasks.emplace_back([=](){
auto filename = job.type == "cache" ? this->cache(job.uri, job.hash, job.mime) : this->load(job.uri, job.hash, job.mime);
if ( filename == "" ) return;
uf::Serializer payload;
ext::json::Value payload;
payload["filename"] = filename;
payload["hash"] = job.hash;
payload["mime"] = job.mime;
@ -192,10 +192,11 @@ uf::Asset::Payload uf::Asset::resolveToPayload( const uf::stl::string& uri, cons
{ "json", uf::Asset::Type::JSON },
{ "lua", uf::Asset::Type::LUA },
#if !UF_ENV_DREAMCAST
{ "glb", uf::Asset::Type::GRAPH },
{ "gltf", uf::Asset::Type::GRAPH },
{ "mdl", uf::Asset::Type::GRAPH },
#endif
};
payload.filename = uri;

View File

@ -212,7 +212,6 @@ void uf::ObjectBehavior::tick( uf::Object& self ) {
if ( !uf::Object::timer.running() ) uf::Object::timer.start();
double curTime = uf::Object::timer.elapsed().asDouble();
#if 1
decltype(metadata.hooks.queue) unprocessed;
unprocessed.reserve( metadata.hooks.queue.size() );
@ -221,20 +220,11 @@ void uf::ObjectBehavior::tick( uf::Object& self ) {
for ( auto& q : queue ) if ( q.timeout < curTime ) executeQueue.emplace_back(q); else unprocessed.emplace_back(q);
for ( auto& q : executeQueue ) {
if ( q.type == 0 ) {
this->callHook( q.name, q.json );
} else {
this->callHook( q.name, q.userdata );
}
if ( q.type == 1 ) this->callHook( q.name, q.userdata );
else if ( q.type == -1 ) this->callHook( q.name, q.json );
else this->callHook( q.name );
}
queue = std::move(unprocessed);
#else
for ( auto it = queue.begin(); it != queue.end(); ) {
auto& q = *it;
if ( q.timeout < curTime ) { this->callHook( q.name, q.payload ); it = queue.erase( it ); }
else ++it;
}
#endif
#if UF_ENTITY_METADATA_USE_JSON
metadata.serialize(self, metadataJson);

View File

@ -17,7 +17,7 @@ UF_BEHAVIOR_TRAITS_CPP(uf::LoadingBehavior, ticks = true, renders = false, multi
#define this (&self)
void uf::LoadingBehavior::initialize( uf::Object& self ) {
auto& metadata = this->getComponent<uf::Serializer>();
this->addHook( "system:Load.Finished.%UID%", [&](ext::json::Value& json){
this->addHook( "system:Load.Finished.%UID%", [&](){
metadata["system"]["loaded"] = true;
// this->removeBehavior(pod::Behavior{.type = uf::LoadingBehavior::type});
this->removeBehavior(pod::Behavior{.type = TYPE(uf::LoadingBehavior::Metadata)});
@ -26,7 +26,7 @@ void uf::LoadingBehavior::initialize( uf::Object& self ) {
auto& scene = uf::scene::getCurrentScene();
if ( parent.getUid() != scene.getUid() ) {
scene.moveChild(*this);
uf::Serializer payload;
ext::json::Value payload;
payload["uid"] = parent.getUid();
parent.getParent().removeChild(parent);
parent.process([&]( uf::Entity* entity ) {

View File

@ -20,24 +20,35 @@ UF_OBJECT_REGISTER_BEGIN(uf::Object)
UF_OBJECT_REGISTER_BEHAVIOR(uf::ObjectBehavior)
UF_OBJECT_REGISTER_END()
uf::Object::Object() UF_BEHAVIOR_ENTITY_CPP_ATTACH(uf::Object)
void uf::Object::queueHook( const uf::stl::string& name, const ext::json::Value& json, float timeout ) {
uf::Hooks::return_t uf::Object::callHook( const uf::stl::string& name ) {
return uf::hooks.call( this->formatHookName( name ) );
}
uf::Hooks::return_t uf::Object::callHook( const uf::stl::string& name, const pod::Hook::userdata_t& payload ) {
return uf::hooks.call( this->formatHookName( name ), payload );
}
void uf::Object::queueHook( const uf::stl::string& name, float timeout ) {
if ( !uf::Object::timer.running() ) uf::Object::timer.start();
double start = uf::Object::timer.elapsed().asDouble();
#if UF_ENTITY_METADATA_USE_JSON
uf::Serializer queue;
queue["name"] = name;
queue["payload"] = json;
queue["timeout"] = start + timeout;
uf::Serializer& metadata = this->getComponent<uf::Serializer>();
metadata["system"]["hooks"]["queue"].emplace_back(queue);
#else
auto& metadata = this->getComponent<uf::ObjectBehavior::Metadata>();
auto& queue = metadata.hooks.queue.emplace_back(uf::ObjectBehavior::Metadata::Queued{
.name = name,
.json = json,
.timeout = start + timeout,
.type = 0,
});
#endif
}
void uf::Object::queueHook( const uf::stl::string& name, const ext::json::Value& payload, float timeout ) {
if ( !uf::Object::timer.running() ) uf::Object::timer.start();
double start = uf::Object::timer.elapsed().asDouble();
auto& metadata = this->getComponent<uf::ObjectBehavior::Metadata>();
auto& queue = metadata.hooks.queue.emplace_back(uf::ObjectBehavior::Metadata::Queued{
.name = name,
.timeout = start + timeout,
.type = -1,
});
queue.json = payload;
}
uf::stl::string uf::Object::formatHookName( const uf::stl::string& n, size_t uid, bool fetch ) {
if ( fetch ) {
@ -70,18 +81,6 @@ uf::stl::string uf::Object::formatHookName( const uf::stl::string& n ) {
return name;
}
uf::Hooks::return_t uf::Object::callHook( const uf::stl::string& name ) {
return uf::hooks.call( this->formatHookName( name ), ext::json::null() );
}
uf::Hooks::return_t uf::Object::callHook( const uf::stl::string& name, const ext::json::Value& json ) {
return uf::hooks.call( this->formatHookName( name ), json );
}
uf::Hooks::return_t uf::Object::callHook( const uf::stl::string& name, const uf::Serializer& serializer ) {
return uf::hooks.call( this->formatHookName( name ), (const ext::json::Value&) serializer );
}
uf::Hooks::return_t uf::Object::callHook( const uf::stl::string& name, const pod::Hook::userdata_t& payload ) {
return uf::hooks.call( this->formatHookName( name ), payload );
}
bool uf::Object::load( const uf::stl::string& f, bool inheritRoot ) {
uf::Serializer json;
uf::stl::string root = "";
@ -109,11 +108,11 @@ bool uf::Object::reload( bool hard ) {
uf::Serializer& metadata = this->getComponent<uf::Serializer>();
if ( !metadata["system"]["source"].is<uf::stl::string>() ) return false;
uf::Serializer json;
uf::Serializer payload;
uf::stl::string filename = metadata["system"]["source"].as<uf::stl::string>();
if ( !json.readFromFile( filename ) ) return false;
if ( hard ) return this->load(filename);
ext::json::Value payload;
payload["old"] = metadata;
ext::json::forEach( json["metadata"], [&]( const uf::stl::string& key, const ext::json::Value& value ){
metadata[key] = value;

View File

@ -198,11 +198,11 @@ void ext::bullet::syncTo() {
uf::Object* entity = (uf::Object*) body->getUserPointer();
if ( !entity || !entity->isValid() || !entity->hasComponent<pod::PhysicsState>() ) continue;
auto& collider = entity->getComponent<pod::PhysicsState>();
if ( !collider.shared ) continue;
auto& state = entity->getComponent<pod::PhysicsState>();
if ( !state.shared ) continue;
auto& physics = entity->getComponent<pod::Physics>();
auto model = uf::transform::model( collider.transform );
auto model = uf::transform::model( state.transform );
btTransform t = body->getWorldTransform();
t.setFromOpenGLMatrix(&model[0]);
@ -222,32 +222,34 @@ void ext::bullet::syncFrom() {
btTransform t = body->getWorldTransform();
// body->getMotionState()->getWorldTransform(t);
uf::Object* entity = (uf::Object*) body->getUserPointer();
if ( !entity || !entity->isValid() || !entity->hasComponent<pod::PhysicsState>() ) continue;
uf::Object* object = (uf::Object*) body->getUserPointer();
if ( !object || !object->isValid() || !object->hasComponent<pod::PhysicsState>() ) continue;
auto& collider = entity->getComponent<pod::PhysicsState>();
auto& state = object->getComponent<pod::PhysicsState>();;
auto& transform = object->getComponent<pod::Transform<>>();
auto& physics = object->getComponent<pod::Physics>();
auto& transform = entity->getComponent<pod::Transform<>>();
transform.position.x = t.getOrigin().getX();
transform.position.y = t.getOrigin().getY();
transform.position.z = t.getOrigin().getZ();
/*state.*/transform.position.x = t.getOrigin().getX();
/*state.*/transform.position.y = t.getOrigin().getY();
/*state.*/transform.position.z = t.getOrigin().getZ();
transform.orientation.x = t.getRotation().getX();
transform.orientation.y = t.getRotation().getY();
transform.orientation.z = t.getRotation().getZ();
transform.orientation.w = t.getRotation().getW();
{
auto& physics = entity->getComponent<pod::Physics>();
physics.linear.velocity.x = body->getLinearVelocity().getX();
physics.linear.velocity.y = body->getLinearVelocity().getY();
physics.linear.velocity.z = body->getLinearVelocity().getZ();
physics.rotational.velocity.x = body->getAngularVelocity().getX();
physics.rotational.velocity.y = body->getAngularVelocity().getY();
physics.rotational.velocity.z = body->getAngularVelocity().getZ();
// state transform is an offset, un-offset
if ( state.transform.reference ) {
transform.position -= state.transform.position;
}
/*state.*/transform.orientation.x = t.getRotation().getX();
/*state.*/transform.orientation.y = t.getRotation().getY();
/*state.*/transform.orientation.z = t.getRotation().getZ();
/*state.*/transform.orientation.w = t.getRotation().getW();
physics.linear.velocity.x = body->getLinearVelocity().getX();
physics.linear.velocity.y = body->getLinearVelocity().getY();
physics.linear.velocity.z = body->getLinearVelocity().getZ();
physics.rotational.velocity.x = body->getAngularVelocity().getX();
physics.rotational.velocity.y = body->getAngularVelocity().getY();
physics.rotational.velocity.z = body->getAngularVelocity().getZ();
transform = uf::transform::reorient( transform );
}
@ -377,9 +379,9 @@ pod::PhysicsState& ext::bullet::create( uf::Object& object, const uf::Mesh& mesh
*/
return collider;
}
pod::PhysicsState& ext::bullet::create( uf::Object& object, const pod::Vector3f& corner ) {
pod::PhysicsState& ext::bullet::create( uf::Object& object, const pod::Vector3f& extent ) {
auto& collider = ext::bullet::create( object );
collider.shape = new btBoxShape(btVector3(corner.x, corner.y, corner.z));
collider.shape = new btBoxShape(btVector3(abs(extent.x), abs(extent.y), abs(extent.z)));
ext::bullet::attach( collider );
auto& transform = object.getComponent<pod::Transform<>>();

View File

@ -70,8 +70,8 @@ namespace binds {
});
};
void call( const uf::stl::string& name, sol::table table = ext::lua::createTable() ) {
uf::Serializer payload = table;
uf::hooks.call( name, (ext::json::Value&) payload );
ext::json::Value payload = uf::Serializer(table);
uf::hooks.call( name, payload );
return;
};
}

View File

@ -140,12 +140,12 @@ namespace binds {
});
}
void callHook( uf::Object& self, const uf::stl::string& name, sol::table table = ext::lua::createTable() ) {
uf::Serializer payload = table;
self.callHook( name, (ext::json::Value&) payload );
ext::json::Value payload = uf::Serializer(table);
self.callHook( name, payload );
}
void queueHook( uf::Object& self, const uf::stl::string& name, sol::table table, float delay = 0.0f ) {
uf::Serializer payload = table;
self.queueHook( name, (ext::json::Value&) payload, delay );
ext::json::Value payload = uf::Serializer(table);
self.queueHook( name, payload, delay );
}
uf::stl::string toString( uf::Object& self ) {
return self.getName() + ": " + std::to_string( self.getUid() );

View File

@ -297,7 +297,7 @@ void ext::openvr::tick() {
texture.fromBuffers( (void*) queued.texture->rubTextureMapData, len, uf::renderer::enums::Format::R8G8B8A8_UNORM, queued.texture->unWidth, queued.texture->unHeight );
}
// call hook
uf::Serializer payload;
ext::json::Value payload;
payload["name"] = name;
uf::hooks.call( "VR:Model.Loaded", payload );
@ -340,7 +340,7 @@ void ext::openvr::tick() {
pod::Vector3f delta = { data.deltaX, data.deltaY, data.deltaZ };
pod::Vector3f position = { data.x, data.y, data.z };
if ( data.bActive ) {
uf::Serializer payload;
ext::json::Value payload;
uf::stl::vector<uf::stl::string> split = uf::string::split( name, "/" );
uf::stl::string shortname = split.back();
split = uf::string::split( shortname, "." );
@ -368,7 +368,7 @@ void ext::openvr::tick() {
vr::InputDigitalActionData_t data;
if ( vr::VRInputError_None == vr::VRInput()->GetDigitalActionData(handle, &data, sizeof(data), vr::k_ulInvalidInputValueHandle) ) {
if ( data.bActive ) {
uf::Serializer payload;
ext::json::Value payload;
uf::stl::vector<uf::stl::string> split = uf::string::split( name, "/" );
uf::stl::string shortname = split.back();
split = uf::string::split( shortname, "." );

View File

@ -309,6 +309,8 @@ void ext::reactphysics::syncFrom() {
physics.rotational.velocity.x = rotationalVelocity.x;
physics.rotational.velocity.y = rotationalVelocity.y;
physics.rotational.velocity.z = rotationalVelocity.z;
transform = uf::transform::reorient( transform );
}
}
// apply impulse

View File

@ -62,7 +62,7 @@ namespace {
}
void enableRequestedDeviceFeatures( ext::vulkan::Device& device ) {
uf::Serializer json;
ext::json::Value json;
#define CHECK_FEATURE( NAME )\
if ( feature == #NAME ) {\
@ -140,8 +140,8 @@ namespace {
}
#undef CHECK_FEATURE2
}
uf::Serializer retrieveDeviceFeatures( ext::vulkan::Device& device ) {
uf::Serializer json;
ext::json::Value retrieveDeviceFeatures( ext::vulkan::Device& device ) {
ext::json::Value json;
#define CHECK_FEATURE( NAME )\
json[#NAME]["supported"] = device.features.NAME;\
@ -783,12 +783,12 @@ void ext::vulkan::Device::initialize() {
UF_EXCEPTION("Vulkan error: failed to create logical device!");
}
{
uf::Serializer payload = ext::json::array();
ext::json::Value payload = ext::json::array();
for ( auto* c_str : deviceExtensions ) payload.emplace_back( uf::stl::string(c_str) );
uf::hooks.call("vulkan:Device.ExtensionsEnabled", payload);
}
{
uf::Serializer payload = retrieveDeviceFeatures( *this );
ext::json::Value payload = retrieveDeviceFeatures( *this );
if ( ext::vulkan::settings::validation ) uf::iostream << payload.dump() << "\n";
uf::hooks.call("vulkan:Device.FeaturesEnabled", payload);
}

View File

@ -72,79 +72,37 @@ void spec::dreamcast::controller::tick() {
if ( !::controller.state ) return;
// uf::inputs::controller::states::C = ::controller.state->buttons & CONT_C;
uf::inputs::controller::states::B = ::controller.state->buttons & CONT_B;
uf::inputs::controller::states::A = ::controller.state->buttons & CONT_A;
uf::inputs::controller::states::B = ::controller.state->buttons & CONT_B;
uf::inputs::controller::states::X = ::controller.state->buttons & CONT_X;
uf::inputs::controller::states::Y = ::controller.state->buttons & CONT_Y;
uf::inputs::controller::states::START = ::controller.state->buttons & CONT_START;
uf::inputs::controller::states::DPAD_UP = ::controller.state->buttons & CONT_DPAD_UP;
uf::inputs::controller::states::DPAD_DOWN = ::controller.state->buttons & CONT_DPAD_DOWN;
uf::inputs::controller::states::DPAD_LEFT = ::controller.state->buttons & CONT_DPAD_LEFT;
uf::inputs::controller::states::DPAD_RIGHT = ::controller.state->buttons & CONT_DPAD_RIGHT;
// uf::inputs::controller::states::Z = ::controller.state->buttons & CONT_Z;
uf::inputs::controller::states::Y = ::controller.state->buttons & CONT_Y;
uf::inputs::controller::states::X = ::controller.state->buttons & CONT_X;
// uf::inputs::controller::states::C = ::controller.state->buttons & CONT_C;
// uf::inputs::controller::states::D = ::controller.state->buttons & CONT_D;
// uf::inputs::controller::states::Z = ::controller.state->buttons & CONT_Z;
uf::inputs::controller::states::L_DPAD_UP = ::controller.state->buttons & CONT_DPAD_UP;
uf::inputs::controller::states::L_DPAD_DOWN = ::controller.state->buttons & CONT_DPAD_DOWN;
uf::inputs::controller::states::L_DPAD_LEFT = ::controller.state->buttons & CONT_DPAD_LEFT;
uf::inputs::controller::states::L_DPAD_RIGHT = ::controller.state->buttons & CONT_DPAD_RIGHT;
uf::inputs::controller::states::L_TRIGGER = NORMALIZE(::controller.state->ltrig);
uf::inputs::controller::states::R_TRIGGER = NORMALIZE(::controller.state->rtrig);
uf::inputs::controller::states::R_DPAD_UP = ::controller.state->buttons & CONT_DPAD2_UP;
uf::inputs::controller::states::R_DPAD_DOWN = ::controller.state->buttons & CONT_DPAD2_DOWN;
uf::inputs::controller::states::R_DPAD_LEFT = ::controller.state->buttons & CONT_DPAD2_LEFT;
uf::inputs::controller::states::R_DPAD_RIGHT = ::controller.state->buttons & CONT_DPAD2_RIGHT;
uf::inputs::controller::states::L_JOYSTICK.x = NORMALIZE(::controller.state->joyx);
uf::inputs::controller::states::L_JOYSTICK.y = NORMALIZE(::controller.state->joyy);
/*
if ( uf::inputs::controller::states::B ) UF_MSG_DEBUG("[Pressed] B");
if ( uf::inputs::controller::states::A ) UF_MSG_DEBUG("[Pressed] A");
if ( uf::inputs::controller::states::START ) UF_MSG_DEBUG("[Pressed] START");
if ( uf::inputs::controller::states::DPAD_UP ) UF_MSG_DEBUG("[Pressed] DPAD_UP");
if ( uf::inputs::controller::states::DPAD_DOWN ) UF_MSG_DEBUG("[Pressed] DPAD_DOWN");
if ( uf::inputs::controller::states::DPAD_LEFT ) UF_MSG_DEBUG("[Pressed] DPAD_LEFT");
if ( uf::inputs::controller::states::DPAD_RIGHT ) UF_MSG_DEBUG("[Pressed] DPAD_RIGHT");
if ( uf::inputs::controller::states::Y ) UF_MSG_DEBUG("[Pressed] Y");
if ( uf::inputs::controller::states::X ) UF_MSG_DEBUG("[Pressed] X");
if ( uf::inputs::controller::states::L_DPAD_UP ) UF_MSG_DEBUG("[Pressed] L_DPAD_UP");
if ( uf::inputs::controller::states::L_DPAD_DOWN ) UF_MSG_DEBUG("[Pressed] L_DPAD_DOWN");
if ( uf::inputs::controller::states::L_DPAD_LEFT ) UF_MSG_DEBUG("[Pressed] L_DPAD_LEFT");
if ( uf::inputs::controller::states::L_DPAD_RIGHT ) UF_MSG_DEBUG("[Pressed] L_DPAD_RIGHT");
if ( uf::inputs::controller::states::R_DPAD_UP ) UF_MSG_DEBUG("[Pressed] R_DPAD_UP");
if ( uf::inputs::controller::states::R_DPAD_DOWN ) UF_MSG_DEBUG("[Pressed] R_DPAD_DOWN");
if ( uf::inputs::controller::states::R_DPAD_LEFT ) UF_MSG_DEBUG("[Pressed] R_DPAD_LEFT");
if ( uf::inputs::controller::states::R_DPAD_RIGHT ) UF_MSG_DEBUG("[Pressed] R_DPAD_RIGHT");
*/
#if 0
uf::stl::vector<uf::stl::string> str;
pod::Vector2f joystick = { analog("L_JOYSTICK_X"), analog("L_JOYSTICK_Y") };
if ( joystick ) str.emplace_back("Joystick: " + uf::vector::toString(joystick));
if ( pressed("C") ) str.emplace_back("C");
if ( pressed("B") ) str.emplace_back("B");
if ( pressed("A") ) str.emplace_back("A");
if ( pressed("START") ) str.emplace_back("START");
if ( pressed("L_DPAD_UP") ) str.emplace_back("L_DPAD_UP");
if ( pressed("L_DPAD_DOWN") ) str.emplace_back("L_DPAD_DOWN");
if ( pressed("L_DPAD_LEFT") ) str.emplace_back("L_DPAD_LEFT");
if ( pressed("L_DPAD_RIGHT") ) str.emplace_back("L_DPAD_RIGHT");
if ( pressed("Z") ) str.emplace_back("Z");
if ( pressed("Y") ) str.emplace_back("Y");
if ( pressed("X") ) str.emplace_back("X");
if ( pressed("D") ) str.emplace_back("D");
if ( pressed("R_DPAD_UP") ) str.emplace_back("R_DPAD_UP");
if ( pressed("R_DPAD_DOWN") ) str.emplace_back("R_DPAD_DOWN");
if ( pressed("R_DPAD_LEFT") ) str.emplace_back("R_DPAD_LEFT");
if ( pressed("R_DPAD_RIGHT") ) str.emplace_back("R_DPAD_RIGHT");
if ( !str.empty() ) UF_MSG_DEBUG(uf::string::join( str, " | " ));
#endif
uf::inputs::controller::states::R_JOYSTICK.x = NORMALIZE(::controller.state->joy2x);
uf::inputs::controller::states::R_JOYSTICK.y = NORMALIZE(::controller.state->joy2y);
}
void spec::dreamcast::controller::terminate() {
}
bool spec::dreamcast::controller::connected( size_t i ) {
return ::controller.state;
}
/*
bool spec::dreamcast::controller::pressed( const uf::stl::string& str, size_t i ) {
if ( !::controller.state ) return false;
return ::controller.state->buttons & GetKeyCode( str );
@ -162,5 +120,5 @@ float spec::dreamcast::controller::analog( const uf::stl::string& str, size_t i
else if ( str == "R_JOYSTICK_Y" ) return NORMALIZE(::controller.state->joy2y);
return 0.0f;
}
*/
#endif

View File

@ -4,5 +4,7 @@ void spec::uni::controller::initialize() {}
void spec::uni::controller::tick() {}
void spec::uni::controller::terminate() {}
bool spec::uni::controller::connected( size_t ) { return false; }
/*
bool spec::uni::controller::pressed( const uf::stl::string&, size_t ) { return false; }
float spec::uni::controller::analog( const uf::stl::string&, size_t ) { return 0; }
float spec::uni::controller::analog( const uf::stl::string&, size_t ) { return 0; }
*/

View File

@ -7,7 +7,59 @@
#endif
void spec::win32::controller::initialize() {}
void spec::win32::controller::tick() {}
void spec::win32::controller::tick() {
#if 0 || UF_USE_OPENVR
if ( ext::openvr::context ) {
uf::stl::string key = "";
if ( name == "R_DPAD_UP" ) { i = vr::Controller_Hand::Hand_Right; key = "dpadUp"; }
else if ( name == "R_DPAD_DOWN" ) { i = vr::Controller_Hand::Hand_Right; key = "dpadDown"; }
else if ( name == "R_DPAD_LEFT" ) { i = vr::Controller_Hand::Hand_Right; key = "dpadLeft"; }
else if ( name == "R_DPAD_RIGHT" ) { i = vr::Controller_Hand::Hand_Right; key = "dpadRight"; }
else if ( name == "R_JOYSTICK" ) { i = vr::Controller_Hand::Hand_Right; key = "thumbclick"; }
else if ( name == "R_A" ) { i = vr::Controller_Hand::Hand_Right; key = "a"; }
else if ( name == "R_B" ) { i = vr::Controller_Hand::Hand_Right; key = "b"; }
else if ( name == "DPAD_UP" && i == vr::Controller_Hand::Hand_Right ) key = "dpadUp";
else if ( name == "DPAD_DOWN" && i == vr::Controller_Hand::Hand_Right ) key = "dpadDown";
else if ( name == "DPAD_LEFT" && i == vr::Controller_Hand::Hand_Right ) key = "dpadLeft";
else if ( name == "DPAD_RIGHT" && i == vr::Controller_Hand::Hand_Right ) key = "dpadRight";
else if ( name == "JOYSTICK" && i == vr::Controller_Hand::Hand_Right ) key = "thumbclick";
else if ( name == "A" && i == vr::Controller_Hand::Hand_Right ) key = "a";
else if ( name == "B" && i == vr::Controller_Hand::Hand_Right ) key = "b";
else if ( name == "L_DPAD_UP" ) { i = vr::Controller_Hand::Hand_Left; key = "dpadUp"; }
else if ( name == "L_DPAD_DOWN" ) { i = vr::Controller_Hand::Hand_Left; key = "dpadDown"; }
else if ( name == "L_DPAD_LEFT" ) { i = vr::Controller_Hand::Hand_Left; key = "dpadLeft"; }
else if ( name == "L_DPAD_RIGHT" ) { i = vr::Controller_Hand::Hand_Left; key = "dpadRight"; }
else if ( name == "L_JOYSTICK" ) { i = vr::Controller_Hand::Hand_Left; key = "thumbclick"; }
else if ( name == "L_A" ) { i = vr::Controller_Hand::Hand_Left; key = "a"; }
else if ( name == "L_B" ) { i = vr::Controller_Hand::Hand_Left; key = "b"; }
else if ( name == "DPAD_UP" && i == vr::Controller_Hand::Hand_Left ) key = "dpadUp";
else if ( name == "DPAD_DOWN" && i == vr::Controller_Hand::Hand_Left ) key = "dpadDown";
else if ( name == "DPAD_LEFT" && i == vr::Controller_Hand::Hand_Left ) key = "dpadLeft";
else if ( name == "DPAD_RIGHT" && i == vr::Controller_Hand::Hand_Left ) key = "dpadRight";
else if ( name == "JOYSTICK" && i == vr::Controller_Hand::Hand_Left ) key = "thumbclick";
else if ( name == "A" && i == vr::Controller_Hand::Hand_Left ) key = "a";
else if ( name == "B" && i == vr::Controller_Hand::Hand_Left ) key = "b";
if ( name != "" ) return ext::openvr::controllerState( i == 0 ? vr::Controller_Hand::Hand_Left : vr::Controller_Hand::Hand_Right, key )["state"].as<bool>();
}
if ( ext::openvr::context ) {
size_t offset = 0;
uf::stl::string key = "";
if ( name == "R_JOYSTICK_X" ) { i = vr::Controller_Hand::Hand_Right; key = "thumbstick"; offset = 0; }
else if ( name == "JOYSTICK_X" && i == vr::Controller_Hand::Hand_Right ) { key = "thumbstick"; offset = 0;}
else if ( name == "R_JOYSTICK_Y" ) { i = vr::Controller_Hand::Hand_Right; key = "thumbstick"; offset = 1; }
else if ( name == "JOYSTICK_Y" && i == vr::Controller_Hand::Hand_Right ) { key = "thumbstick"; offset = 1; }
else if ( name == "L_JOYSTICK_X" ) { i = vr::Controller_Hand::Hand_Left; key = "thumbstick"; offset = 0; }
else if ( name == "JOYSTICK_X" && i == vr::Controller_Hand::Hand_Left ) { key = "thumbstick"; offset = 0;}
else if ( name == "L_JOYSTICK_Y" ) { i = vr::Controller_Hand::Hand_Left; key = "thumbstick"; offset = 1; }
else if ( name == "JOYSTICK_Y" && i == vr::Controller_Hand::Hand_Left ) { key = "thumbstick"; offset = 1; }
if ( name != "" ) return ext::openvr::controllerState( i == 0 ? vr::Controller_Hand::Hand_Left : vr::Controller_Hand::Hand_Right, key )["analog"]["position"][offset].as<float>();
}
#endif
}
void spec::win32::controller::terminate() {}
bool spec::win32::controller::connected( size_t i ) {
#if UF_USE_OPENVR
@ -15,6 +67,7 @@ bool spec::win32::controller::connected( size_t i ) {
#endif
return false;
}
/*
bool spec::win32::controller::pressed( const uf::stl::string& _name, size_t i ) {
uf::stl::string name = uf::string::uppercase(_name);
#if UF_USE_OPENVR
@ -76,5 +129,5 @@ float spec::win32::controller::analog( const uf::stl::string& _name, size_t i )
#endif
return 0;
}
*/
#endif

View File

@ -19,6 +19,9 @@ INIT_MALLOCSTATS -- Enable a call to malloc_stats() right before shutdown
#include <kos.h>
#define UF_HOOK_USE_USERDATA 1
#define UF_HOOK_USE_JSON 0
extern uint8 romdisk[];
KOS_INIT_FLAGS(INIT_DEFAULT | INIT_MALLOCSTATS);
KOS_INIT_ROMDISK(romdisk);
@ -519,8 +522,8 @@ void UF_API_CALL spec::dreamcast::Window::processEvents() {
}
}
};
#if UF_USE_JSON
uf::Serializer json;
#if UF_HOOK_USE_JSON
ext::json::Value json;
json["type"] = event.type + "." + ((event.key.state == -1)?"Pressed":"Released");
json["invoker"] = event.invoker;
json["key"]["code"] = "";
@ -537,11 +540,11 @@ void UF_API_CALL spec::dreamcast::Window::processEvents() {
event.key.code = code;
event.key.raw = key;
#if UF_USE_USERDATA
#if UF_HOOK_USE_USERDATA
this->pushEvent(event.type, event);
this->pushEvent(event.type + "." + code, event);
#endif
#if UF_USE_JSON
#if UF_HOOK_USE_JSON
json["key"]["code"] = code;
json["key"]["raw"] = key;
this->pushEvent(event.type, json);
@ -559,7 +562,7 @@ bool UF_API_CALL spec::dreamcast::Window::pollEvents( bool block ) {
while ( !this->m_events.empty() ) {
auto& event = this->m_events.front();
if ( event.payload.is<uf::stl::string>() ) {
/*if ( event.payload.is<uf::stl::string>() ) {
ext::json::Value payload = uf::Serializer( event.payload.as<uf::stl::string>() );
uf::hooks.call( "window:Event", payload );
uf::hooks.call( event.name, payload );
@ -571,7 +574,7 @@ bool UF_API_CALL spec::dreamcast::Window::pollEvents( bool block ) {
ext::json::Value& payload = event.payload.as<ext::json::Value>();
uf::hooks.call( "window:Event", payload );
uf::hooks.call( event.name, payload );
} else {
} else */{
uf::hooks.call( "window:Event", event.payload );
uf::hooks.call( event.name, event.payload );
}

View File

@ -44,6 +44,7 @@ void UF_API_CALL spec::uni::Window::pushEvent( const uf::OptimalHook::argument_t
this->m_events.optimal.back().argument = userdata;
}
*/
/*
void UF_API_CALL spec::uni::Window::pushEvent( const uf::Hooks::name_t& name, const uf::stl::string& payload ) {
auto& event = this->m_events.emplace();
event.name = name;
@ -59,6 +60,7 @@ void UF_API_CALL spec::uni::Window::pushEvent( const uf::Hooks::name_t& name, co
event.name = name;
event.payload.create<ext::json::Value>( uf::Serializer(payload) );
}
*/
void UF_API_CALL spec::uni::Window::pushEvent( const uf::Hooks::name_t& name, const pod::Hook::userdata_t& payload ) {
auto& event = this->m_events.emplace();
event.name = name;
@ -88,6 +90,7 @@ bool UF_API_CALL spec::uni::Window::pollEvents( bool block ) {
// doesnt get used
while ( !this->m_events.empty() ) {
auto& event = this->m_events.front();
/*
if ( event.payload.is<uf::stl::string>() ) {
ext::json::Value payload = uf::Serializer( event.payload.as<uf::stl::string>() );
uf::hooks.call( "window:Event", payload );
@ -100,7 +103,7 @@ bool UF_API_CALL spec::uni::Window::pollEvents( bool block ) {
ext::json::Value& payload = event.payload.as<ext::json::Value>();
uf::hooks.call( "window:Event", payload );
uf::hooks.call( event.name, payload );
} else {
} else */ {
uf::hooks.call( "window:Event", event.payload );
uf::hooks.call( event.name, event.payload );
}

View File

@ -806,7 +806,7 @@ void UF_API_CALL spec::win32::Window::processEvents() {
}
};
#if UF_HOOK_USE_JSON
uf::Serializer json;
ext::json::Value json;
json["type"] = event.type + "." + ((event.key.state == -1)?"Pressed":"Released");
json["invoker"] = event.invoker;
json["key"]["code"] = "";
@ -845,6 +845,7 @@ bool UF_API_CALL spec::win32::Window::pollEvents( bool block ) {
while ( !this->m_events.empty() ) {
auto& event = this->m_events.front();
/*
if ( event.payload.is<uf::stl::string>() ) {
ext::json::Value payload = uf::Serializer( event.payload.as<uf::stl::string>() );
uf::hooks.call( "window:Event", payload );
@ -857,7 +858,7 @@ bool UF_API_CALL spec::win32::Window::pollEvents( bool block ) {
ext::json::Value& payload = event.payload.as<ext::json::Value>();
uf::hooks.call( "window:Event", payload );
uf::hooks.call( event.name, payload );
} else {
} else */ {
uf::hooks.call( "window:Event", event.payload );
uf::hooks.call( event.name, event.payload );
}
@ -935,7 +936,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam,
uf::stl::stringstream serializer;
bool labelAsDelta = true;
uf::Serializer json;
ext::json::Value json;
switch (message) {
case WM_DESTROY:
@ -953,7 +954,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam,
this->pushEvent(event.type, event);
#endif
#if UF_HOOK_USE_JSON
uf::Serializer json;
ext::json::Value json;
json["type"] = event.type;
json["invoker"] = event.invoker;
this->pushEvent(event.type, json);
@ -974,7 +975,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam,
this->pushEvent(event.type, event);
#endif
#if UF_HOOK_USE_JSON
uf::Serializer json;
ext::json::Value json;
json["type"] = event.type;
json["invoker"] = event.invoker;
json["window"]["size"] = uf::vector::encode(event.window.size);
@ -1002,7 +1003,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam,
this->pushEvent(event.type, event);
#endif
#if UF_HOOK_USE_JSON
uf::Serializer json;
ext::json::Value json;
json["type"] = event.type;
json["invoker"] = event.invoker;
json["window"]["size"] = uf::vector::encode(event.window.size);
@ -1017,7 +1018,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam,
this->pushEvent(event.type, event);
#endif
#if UF_HOOK_USE_JSON
uf::Serializer json;
ext::json::Value json;
json["type"] = event.type;
json["invoker"] = event.invoker;
this->pushEvent(event.type, json);
@ -1058,7 +1059,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam,
this->pushEvent(event.type, event);
#endif
#if UF_HOOK_USE_JSON
uf::Serializer json;
ext::json::Value json;
json["type"] = event.type;
json["invoker"] = event.invoker;
switch ( message ) {
@ -1104,7 +1105,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam,
this->pushEvent(event.type, event);
#endif
#if UF_HOOK_USE_JSON
uf::Serializer json;
ext::json::Value json;
json["type"] = event.type;
json["invoker"] = event.invoker;
json["text"]["uint32_t"] = event.text.utf32;
@ -1150,7 +1151,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam,
this->pushEvent(event.type + "." + event.key.code, event);
#endif
#if UF_HOOK_USE_JSON
uf::Serializer json;
ext::json::Value json;
json["type"] = event.type + "." + ((event.key.state == -1)?"Pressed":"Released");
json["invoker"] = event.invoker;
json["key"]["state"] = (event.key.state == -1) ? "Down" : "Up";
@ -1189,7 +1190,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam,
this->pushEvent(event.type, event);
#endif
#if UF_HOOK_USE_JSON
uf::Serializer json;
ext::json::Value json;
json["type"] = event.type;
json["invoker"] = event.invoker;
json["mouse"]["position"] = uf::vector::encode(event.mouse.position);
@ -1254,7 +1255,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam,
this->pushEvent(event.type, event);
#endif
#if UF_HOOK_USE_JSON
uf::Serializer json;
ext::json::Value json;
json["type"] = event.type;
json["invoker"] = event.invoker;
json["mouse"]["position"] = uf::vector::encode(event.mouse.position);
@ -1292,7 +1293,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam,
this->pushEvent(event.type, event);
#endif
#if UF_HOOK_USE_JSON
uf::Serializer json;
ext::json::Value json;
json["type"] = event.type;
json["invoker"] = event.invoker;
switch (event.mouse.state) {
@ -1359,7 +1360,7 @@ void UF_API_CALL spec::win32::Window::processEvent(UINT message, WPARAM wParam,
this->pushEvent(event.type, event);
#endif
#if UF_HOOK_USE_JSON
uf::Serializer json;
ext::json::Value json;
json["type"] = event.type;
json["invoker"] = event.invoker;

View File

@ -21,43 +21,31 @@ void uf::Hooks::removeHook( const uf::Hooks::name_t& name, size_t uid ) {
}
}
}
/*
uf::Hooks::return_t uf::Hooks::call( const uf::Hooks::name_t& name ) {
pod::Hook::userdata_t payload{};
return call( name, payload );
}
*/
uf::Hooks::return_t uf::Hooks::call( const uf::Hooks::name_t& name, const pod::Hook::userdata_t& payload ) {
auto& container = this->m_container[name];
uf::stl::vector<pod::Hook::userdata_t> results;
results.reserve( container.size() );
for ( auto& hook : container ) {
#if UF_USERDATA_USE_CTTI
// if ( payload.type() != hook.type.hash ) continue;
// UF_MSG_DEBUG( name << ": " << payload.type() << " == " << hook.type.hash << "\t\t" << payload.size() << " == " << hook.type.size );
if ( payload.type() != hook.type.hash ) continue;
#endif
if ( payload.size() != hook.type.size ) continue;
if ( payload.size() != hook.type.size && hook.type.size > 0 ) continue;
pod::Hook::userdata_t& unconst_payload = const_cast<pod::Hook::userdata_t&>(payload);
pod::Hook::userdata_t hookResult = hook.callback(unconst_payload);
auto& returnResult = results.emplace_back();
returnResult.move( hookResult );
}
return results;
}
uf::Hooks::return_t uf::Hooks::call( const uf::Hooks::name_t& name, const uf::stl::string& s ) {
pod::Hook::userdata_t payload;
payload.create<ext::json::Value>();
auto& value = payload.get<ext::json::Value>();
value = uf::Serializer(s);
return call(name, payload);
}
uf::Hooks::return_t uf::Hooks::call( const uf::Hooks::name_t& name, const ext::json::Value& s ) {
pod::Hook::userdata_t payload;
payload.create<ext::json::Value>( s );
return call(name, payload);
}
uf::Hooks::return_t uf::Hooks::call( const uf::Hooks::name_t& name, const uf::Serializer& s ) {
pod::Hook::userdata_t payload;
payload.create<ext::json::Value>( (const ext::json::Value&) s );
return call(name, payload);
}
// specialization: void function
size_t uf::Hooks::addHook( const uf::Hooks::name_t& name, const std::function<void()>& callback ) {
return addHook( name, [=]( const pod::Hook::userdata_t& userdata ){

View File

@ -106,22 +106,34 @@ 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;
uf::inputs::state_t uf::inputs::controller::states::R_DPAD_RIGHT = false;
uf::inputs::state_t uf::inputs::controller::states::R_JOYSTICK = false;
uf::inputs::state_t uf::inputs::controller::states::R_A = false;
uf::inputs::state_t uf::inputs::controller::states::R_B = false;
uf::inputs::state_t uf::inputs::controller::states::R_X = false;
uf::inputs::state_t uf::inputs::controller::states::R_Y = false;
uf::inputs::state_t uf::inputs::controller::states::L_DPAD_UP = false;
uf::inputs::state_t uf::inputs::controller::states::L_DPAD_DOWN = false;
uf::inputs::state_t uf::inputs::controller::states::L_DPAD_LEFT = false;
uf::inputs::state_t uf::inputs::controller::states::L_DPAD_RIGHT = false;
uf::inputs::state_t uf::inputs::controller::states::L_JOYSTICK = false;
uf::inputs::state_t uf::inputs::controller::states::L_A = false;
uf::inputs::state_t uf::inputs::controller::states::DPAD_UP = false;
uf::inputs::state_t uf::inputs::controller::states::DPAD_DOWN = false;
uf::inputs::state_t uf::inputs::controller::states::DPAD_LEFT = false;
uf::inputs::state_t uf::inputs::controller::states::DPAD_RIGHT = false;
uf::inputs::state_t uf::inputs::controller::states::A = false;
uf::inputs::state_t uf::inputs::controller::states::B = false;
uf::inputs::state_t uf::inputs::controller::states::X = false;
uf::inputs::state_t uf::inputs::controller::states::Y = false;
uf::inputs::state_t uf::inputs::controller::states::L_TRIGGER = false;
uf::inputs::state_t uf::inputs::controller::states::R_TRIGGER = false;
uf::inputs::state_t uf::inputs::controller::states::L_B = false;
uf::inputs::state_t uf::inputs::controller::states::L_X = false;
uf::inputs::state_t uf::inputs::controller::states::L_Y = false;
uf::inputs::state_t& uf::inputs::controller::states::DPAD_UP = uf::inputs::controller::states::L_DPAD_UP;
uf::inputs::state_t& uf::inputs::controller::states::DPAD_DOWN = uf::inputs::controller::states::L_DPAD_DOWN;
uf::inputs::state_t& uf::inputs::controller::states::DPAD_LEFT = uf::inputs::controller::states::L_DPAD_LEFT;
uf::inputs::state_t& uf::inputs::controller::states::DPAD_RIGHT = uf::inputs::controller::states::L_DPAD_RIGHT;
uf::inputs::state_t& uf::inputs::controller::states::A = uf::inputs::controller::states::R_A;
uf::inputs::state_t& uf::inputs::controller::states::B = uf::inputs::controller::states::R_B;
uf::inputs::state_t& uf::inputs::controller::states::X = uf::inputs::controller::states::R_X;
uf::inputs::state_t& uf::inputs::controller::states::Y = uf::inputs::controller::states::R_Y;
uf::inputs::analog2_t uf::inputs::controller::states::L_JOYSTICK = {};
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;

View File

@ -104,7 +104,7 @@ void uf::Mesh::insert( const uf::Mesh& mesh ) {
void uf::Mesh::generateIndices() {
// deduce type
size_t size = sizeof(uint32_t);
uf::renderer::enums::Type::type_t type;
uf::renderer::enums::Type::type_t type{};
/*if ( vertex.count <= std::numeric_limits<uint8_t>::max() ) { size = sizeof(uint8_t); type = uf::renderer::typeToEnum<uint8_t>(); }
else*/ if ( vertex.count <= std::numeric_limits<uint16_t>::max() ) { size = sizeof(uint16_t); type = uf::renderer::typeToEnum<uint16_t>(); }
else if ( vertex.count <= std::numeric_limits<uint32_t>::max() ) { size = sizeof(uint32_t); type = uf::renderer::typeToEnum<uint32_t>(); }

View File

@ -77,7 +77,7 @@ void UF_API_CALL uf::Window::setTitle( const spec::uni::Window::title_t& title )
if ( !this->m_window ) return;
this->m_window->setTitle(title);
uf::Serializer json;
ext::json::Value json;
uf::stl::string hook = "window:Title.Changed";
json["type"] = hook;
json["invoker"] = "os";

View File

@ -128,7 +128,7 @@ SAVE: {
UF_MSG_DEBUG("Reverted shadow limits");
uf::Serializer payload;
ext::json::Value payload;
payload["uid"] = this->getUid();
uf::scene::getCurrentScene().queueHook("system:Destroy", payload);
#endif

View File

@ -111,7 +111,7 @@ void ext::PlayerBehavior::initialize( uf::Object& self ) {
uf::Serializer charaData = masterDataGet("Chara", cardData["character_id"].as<uf::stl::string>());
uf::stl::string leader = charaData["name"].as<uf::stl::string>();
uf::Serializer payload = json;
ext::json::Value payload = json;
payload["details"] = "Leader: " + leader;
uf::hooks.call( "discord:Activity.Update", payload );
});
@ -212,8 +212,8 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
stats.noclipped = metadata.system.noclipped;
stats.floored = stats.noclipped;
auto& collider = this->getComponent<pod::PhysicsState>();
if ( !stats.floored && collider.body && uf::physics::impl::rayCast( transform.position, transform.position - pod::Vector3f{0,1,0} ) >= 0.0f ) stats.floored = true; else
stats.floored |= fabs(physics.linear.velocity.y) < 0.01f;
if ( !stats.floored && collider.body && uf::physics::impl::rayCast( transform.position, transform.position - pod::Vector3f{0,1,0} ) >= 0.0f ) stats.floored = true;
else stats.floored |= fabs(physics.linear.velocity.y) < 0.01f;
TIMER(0.125, keys.use && ) {
size_t uid = 0;
@ -224,7 +224,7 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
float depth = uf::physics::impl::rayCast( pos, pos + dir, pointer );
if ( pointer ) {
uf::Serializer payload;
ext::json::Value payload;
payload["uid"] = this->getUid();
payload["depth"] = depth;
pointer->callHook( "entity:Use.%UID%", payload );
@ -256,9 +256,6 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
float air = 1.0f;
} speed; {
float scale = 1;
#if UF_USE_OPENGL
scale = 10;
#endif
speed.rotate = metadata.movement.rotate * uf::physics::time::delta;
speed.move = metadata.movement.move * scale;
@ -286,13 +283,10 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
pod::payloads::menuOpen payload;
payload.name = "pause";
uf::hooks.call("menu:Open", payload);
}
else if ( !metadata.system.control ) {
} else if ( !metadata.system.control ) {
stats.menu = "menu";
} else if ( stats.menu == "" ) {
metadata.system.control = true;
} else {
metadata.system.control = false;
} else {
metadata.system.control = stats.menu == "";
}
metadata.system.menu = stats.menu;
@ -461,7 +455,7 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
TRACK_ORIENTATION(camera.getTransform().orientation);
float magnitude = uf::quaternion::magnitude( combinedDeltaOrientation );
if ( magnitude > 0.0001f ) {
uf::Serializer payload;
ext::json::Value payload;
payload["delta"] = uf::vector::encode( combinedDeltaOrientation );
payload["angle"]["pitch"] = combinedDeltaAngles.x;
payload["angle"]["yaw"] = combinedDeltaAngles.y;
@ -517,7 +511,7 @@ void ext::PlayerBehavior::Metadata::deserialize( uf::Object& self, uf::Serialize
auto& serializerCameraLimit = serializerCamera["limit"];
/*this->*/system.menu = serializerSystem["menu"].as<uf::stl::string>();
/*this->*/system.control = serializerSystem["control"].as<bool>();
/*this->*/system.control = serializerSystem["control"].as<bool>(true);
/*this->*/system.crouching = serializerSystem["crouching"].as<bool>();
/*this->*/system.noclipped = serializerSystem["noclipped"].as<bool>();
/*this->*/movement.friction = serializerSystemPhysics["friction"].as<float>();

View File

@ -81,7 +81,7 @@ void ext::ExtSceneBehavior::initialize( uf::Object& self ) {
uf::Object* manager = (uf::Object*) this->globalFindByName("Gui Manager");
if ( !manager ) return;
uf::Serializer payload;
ext::json::Value payload;
uf::stl::string config = metadataJson["menus"]["pause"].as<uf::stl::string>("/entites/gui/pause/menu.json");
uf::Object& gui = manager->loadChild(config, false);
payload["uid"] = gui.getUid();

View File

@ -84,7 +84,7 @@ void ext::SoundEmitterBehavior::initialize( uf::Object& self ) {
if ( !assetLoader.has<uf::Audio>(payload.filename) ) return;
uf::Serializer json = metadata["audio"];
ext::json::Value json = metadata["audio"];
json["filename"] = payload.filename;
this->callHook("sound:Emit.%UID%", json);
});

View File

@ -488,11 +488,10 @@ void ext::GuiBehavior::initialize( uf::Object& self ) {
this->callHook("gui:Mouse.Clicked.%UID%", payload);
} );
this->addHook( "gui:Clicked.%UID%", [&](pod::payloads::windowMouseClick& payload){
UF_MSG_DEBUG("CLICKED");
this->addHook( "gui:Clicked.%UID%", [&](pod::payloads::windowMouseClick& payload){
if ( ext::json::isObject( metadataJson["events"]["click"] ) ) {
uf::Serializer event = metadataJson["events"]["click"];
ext::json::Value event = metadataJson["events"]["click"];
metadataJson["events"]["click"] = ext::json::array();
metadataJson["events"]["click"][0] = event;
} else if ( !ext::json::isArray( metadataJson["events"]["click"] ) ) {
@ -500,8 +499,8 @@ void ext::GuiBehavior::initialize( uf::Object& self ) {
return;
}
for ( int i = 0; i < metadataJson["events"]["click"].size(); ++i ) {
uf::Serializer event = metadataJson["events"]["click"][i];
uf::Serializer payload = event["payload"];
ext::json::Value event = metadataJson["events"]["click"][i];
ext::json::Value payload = event["payload"];
if ( event["delay"].is<float>() ) {
this->queueHook(event["name"].as<uf::stl::string>(), payload, event["delay"].as<float>());
} else {
@ -552,7 +551,7 @@ void ext::GuiBehavior::initialize( uf::Object& self ) {
this->addHook( "gui:Hovered.%UID%", [&](ext::json::Value& json){
if ( ext::json::isObject( metadataJson["events"]["hover"] ) ) {
uf::Serializer event = metadataJson["events"]["hover"];
ext::json::Value event = metadataJson["events"]["hover"];
metadataJson["events"]["hover"] = ext::json::array(); //Json::arrayValue;
metadataJson["events"]["hover"][0] = event;
} else if ( !ext::json::isArray( metadataJson["events"]["hover"] ) ) {
@ -560,8 +559,8 @@ void ext::GuiBehavior::initialize( uf::Object& self ) {
return;
}
for ( int i = 0; i < metadataJson["events"]["hover"].size(); ++i ) {
uf::Serializer event = metadataJson["events"]["hover"][i];
uf::Serializer payload = event["payload"];
ext::json::Value event = metadataJson["events"]["hover"][i];
ext::json::Value payload = event["payload"];
float delay = event["delay"].as<float>();
if ( event["delay"].is<double>() ) {
this->queueHook(event["name"].as<uf::stl::string>(), payload, event["delay"].as<float>());
@ -589,7 +588,7 @@ void ext::GuiBehavior::initialize( uf::Object& self ) {
this->addHook( "object:Reload.%UID%", [&](ext::json::Value& json){
if ( json["old"]["text settings"]["string"] == json["new"]["text settings"]["string"] ) return;
this->queueHook( "gui:UpdateString.%UID%");
this->queueHook( "gui:UpdateString.%UID%", ext::json::Value{});
});
this->addHook( "gui:UpdateString.%UID%", [&](ext::json::Value& json){
ext::json::forEach(::defaultSettings["metadata"]["text settings"], [&]( const uf::stl::string& key, ext::json::Value& value ){
@ -708,7 +707,7 @@ void ext::GuiBehavior::initialize( uf::Object& self ) {
graphic.getPipeline().update( graphic );
}
});
this->callHook("gui:UpdateString.%UID%");
this->callHook("gui:UpdateString.%UID%", ext::json::Value{});
}
#endif
}

View File

@ -17,7 +17,7 @@
}
/* Update window size */ {
uf::Serializer json;
ext::json::Value json;
uf::stl::string hook = "window:Resized";
json["type"] = hook;
json["invoker"] = "ext";
@ -28,7 +28,7 @@
uf::hooks.call(hook, json);
}
/* Update window title */ {
uf::Serializer json;
ext::json::Value json;
uf::stl::string hook = "window:Title.Changed";
json["type"] = hook;
json["invoker"] = "ext";

View File

@ -524,7 +524,7 @@ void EXT_API ext::initialize() {
}
/* Initialize root scene*/ {
uf::Serializer payload;
ext::json::Value payload;
payload["scene"] = ::config["engine"]["scenes"]["start"];
payload["immediate"] = true;
uf::hooks.call("game:Scene.Load", payload);