Commit for 2021.12.29 23-43-26.7z

This commit is contained in:
mrq 2021-12-29 23:43:00 -06:00
parent 3bd7dc76b4
commit ae6bb02cdd
16 changed files with 295 additions and 62 deletions

View File

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

View File

@ -9,7 +9,7 @@
"position": [ 0, 0, 0 ], "position": [ 0, 0, 0 ],
"rotation": { "rotation": {
"axis": [ 0, 1, 0 ], "axis": [ 0, 1, 0 ],
"angle": 0.0 "angle": 3.1415926
}, },
"scale": [ 1, 1, 1 ] "scale": [ 1, 1, 1 ]
}, },

View File

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

View File

@ -1,10 +1,13 @@
{ {
"import": "/model.json", "import": "/model.json",
"assets": [ "assets": [
// { "filename": "./models/tiny_msci.glb", "delay": 0, "single threaded": false, "category": "models" }
{ "filename": "./models/tiny_msci/graph.json.gz", "delay": 0, "single threaded": false, "category": "models" }
// { "filename": "./models/micro_sci.glb", "delay": 0, "single threaded": false, "category": "models" } // { "filename": "./models/micro_sci.glb", "delay": 0, "single threaded": false, "category": "models" }
// { "filename": "./models/micro_sci/graph.json", "delay": 0, "single threaded": false, "category": "models" } // { "filename": "./models/micro_sci/graph.json", "delay": 0, "single threaded": false, "category": "models" }
{ "filename": "./models/micro_sci/graph.json.gz", "delay": 0, "single threaded": false, "category": "models" }, // { "filename": "./models/micro_sci/graph.json.gz", "delay": 0, "single threaded": false, "category": "models" }
{ "filename": "./craeture.json", "delay": 1 } // { "filename": "./craeture.json", "delay": 1 }
// { "filename": "./models/msci.glb", "delay": 0, "single threaded": false, "category": "models" } // { "filename": "./models/msci.glb", "delay": 0, "single threaded": false, "category": "models" }
// { "filename": "./models/msci/graph.json", "delay": 0, "single threaded": false, "category": "models" } // { "filename": "./models/msci/graph.json", "delay": 0, "single threaded": false, "category": "models" }
@ -16,6 +19,13 @@
], ],
"metadata": { "metadata": {
"model": { "model": {
"baking": {
"enabled": true,
"resolution": 8192,
"shadows": 1024,
"trigger": { "mode": "rendered" },
"output": "./lightmap.png"
},
"tags": { "tags": {
"worldspawn": { "physics": { "type": "mesh", "static": true } }, "worldspawn": { "physics": { "type": "mesh", "static": true } },
// "worldspawn": { "physics": { "type": "bounding boxes", "static": true } }, // "worldspawn": { "physics": { "type": "bounding boxes", "static": true } },

View File

@ -149,6 +149,7 @@
"mode" : "windowed", "mode" : "windowed",
"icon" : "./data/textures/icon.png", "icon" : "./data/textures/icon.png",
"size" : [ 640, 480 ], "size" : [ 640, 480 ],
// "size" : [ 320, 240 ],
"title" : "Grimgram", "title" : "Grimgram",
"visible" : true "visible" : true
} }

View File

@ -63,6 +63,7 @@ int main(int argc, char** argv){
client::initialize(); client::initialize();
ext::initialize(); ext::initialize();
// For Multithreaded initialization // For Multithreaded initialization
while ( !client::ready || !ext::ready ) { while ( !client::ready || !ext::ready ) {
static uf::Timer<long long> timer(false); static uf::Timer<long long> timer(false);

View File

@ -4,10 +4,12 @@
#define UF_NS_GET_LAST(name) uf::string::replace( uf::string::split( #name, "::" ).back(), "<>", "" ) #define UF_NS_GET_LAST(name) uf::string::replace( uf::string::split( #name, "::" ).back(), "<>", "" )
/* /*
-x * 1000, uf::Time<long long>::milliseconds
#define TIMER(x, ...) auto TOKEN_PASTE(TIMER, __LINE__) = []( uf::physics::num_t every = 1 ) {\ #define TIMER(x, ...) auto TOKEN_PASTE(TIMER, __LINE__) = []( uf::physics::num_t every = 1 ) {\
static uf::Timer<long long> timer(false);\ static uf::Timer<long long> timer(false);\
if ( !timer.running() ) {\ if ( !timer.running() ) {\
timer.start(uf::Time<long long>(-x * 1000, uf::Time<long long>::milliseconds));\ timer.start(uf::Time<long long>(-1000000));\
}\ }\
uf::physics::num_t time = 0;\ uf::physics::num_t time = 0;\
if ( (time = timer.elapsed()) >= every ) {\ if ( (time = timer.elapsed()) >= every ) {\
@ -21,7 +23,7 @@
*/ */
#define TIMER_LAMBDA(x) []() {\ #define TIMER_LAMBDA(x) []() {\
static uf::Timer<long long> timer(false);\ static uf::Timer<long long> timer(false);\
if ( !timer.running() ) timer.start(uf::Time<long long>(-x * 1000, uf::Time<long long>::milliseconds));\ if ( !timer.running() ) timer.start(uf::Time<long long>(-1000000));\
uf::physics::num_t time = timer.elapsed();\ uf::physics::num_t time = timer.elapsed();\
if ( time >= every ) timer.reset();\ if ( time >= every ) timer.reset();\
static bool first = true; if ( first ) { first = false; return every; }\ static bool first = true; if ( first ) { first = false; return every; }\
@ -30,7 +32,7 @@
#define TIMER(x, ...)\ #define TIMER(x, ...)\
static uf::Timer<long long> timer(false);\ static uf::Timer<long long> timer(false);\
if ( !timer.running() ) timer.start(uf::Time<long long>(-x * 1000, uf::Time<long long>::milliseconds));\ if ( !timer.running() ) timer.start(uf::Time<long long>(-1000000));\
uf::physics::num_t time = timer.elapsed();\ uf::physics::num_t time = timer.elapsed();\
if ( time >= x ) timer.reset();\ if ( time >= x ) timer.reset();\
if ( __VA_ARGS__ time >= x ) if ( __VA_ARGS__ time >= x )

View File

@ -183,17 +183,19 @@ uf::Asset::Payload uf::Asset::resolveToPayload( const uf::stl::string& uri, cons
uf::Asset::Payload payload; uf::Asset::Payload payload;
static uf::stl::unordered_map<uf::stl::string,uf::Asset::Type> typemap = { static uf::stl::unordered_map<uf::stl::string,uf::Asset::Type> typemap = {
{ "jpg", uf::Asset::Type::IMAGE }, { "jpg", uf::Asset::Type::IMAGE },
{ "jpeg", uf::Asset::Type::IMAGE }, { "jpeg", uf::Asset::Type::IMAGE },
{ "png", uf::Asset::Type::IMAGE }, { "png", uf::Asset::Type::IMAGE },
{ "ogg", uf::Asset::Type::AUDIO }, { "ogg", uf::Asset::Type::AUDIO },
{ "json", uf::Asset::Type::JSON }, { "json", uf::Asset::Type::JSON },
{ "lua", uf::Asset::Type::LUA }, { "lua", uf::Asset::Type::LUA },
{ "mdl", uf::Asset::Type::GRAPH }, { "glb", uf::Asset::Type::GRAPH },
{ "gltf", uf::Asset::Type::GRAPH },
{ "mdl", uf::Asset::Type::GRAPH },
}; };
payload.filename = uri; payload.filename = uri;
@ -274,7 +276,7 @@ uf::stl::string uf::Asset::load(const uf::Asset::Payload& payload ) {
} break; } break;
case uf::Asset::Type::AUDIO: { case uf::Asset::Type::AUDIO: {
UF_ASSET_REGISTER(uf::Audio) UF_ASSET_REGISTER(uf::Audio)
asset.stream(filename); asset.open(filename, true);
} break; } break;
case uf::Asset::Type::JSON: { case uf::Asset::Type::JSON: {
UF_ASSET_REGISTER(uf::Serializer) UF_ASSET_REGISTER(uf::Serializer)

View File

@ -13,8 +13,8 @@
#include <fstream> #include <fstream>
#include <atomic> #include <atomic>
uint32_t ext::opengl::settings::width = 1280; uint32_t ext::opengl::settings::width = 640;
uint32_t ext::opengl::settings::height = 720; uint32_t ext::opengl::settings::height = 480;
uint8_t ext::opengl::settings::msaa = 1; uint8_t ext::opengl::settings::msaa = 1;
bool ext::opengl::settings::validation = true; bool ext::opengl::settings::validation = true;
// constexpr size_t ext::opengl::settings::maxViews = 6; // constexpr size_t ext::opengl::settings::maxViews = 6;

View File

@ -109,31 +109,16 @@ void ext::opengl::Shader::destroy() {
bool ext::opengl::Shader::validate() { bool ext::opengl::Shader::validate() {
// check if uniforms match buffer size // check if uniforms match buffer size
bool valid = true; bool valid = true;
#if 0
{
auto it = uniforms.begin();
for ( auto& buffer : buffers ) {
if ( !(buffer.usage & uf::renderer::enums::Buffer::UNIFORM) ) continue;
if ( it == uniforms.end() ) break;
auto& uniform = *(it++);
if ( uniform.data().len != buffer.allocationInfo.size ) {
GL_DEBUG_VALIDATION_MESSAGE("Uniform size mismatch: Expected " << buffer.allocationInfo.size << ", got " << uniform.data().len << "; fixing...");
uniform.destroy();
uniform.create(buffer.allocationInfo.size);
valid = false;
}
}
}
#endif
return valid; return valid;
} }
bool ext::opengl::Shader::hasUniform( const uf::stl::string& name ) const { bool ext::opengl::Shader::hasUniform( const uf::stl::string& name ) const {
// return !ext::json::isNull(metadata.json["definitions"]["uniforms"][name]); // return metadata.definitions.uniforms.count(name) > 0;
return metadata.definitions.uniforms.count(name) > 0; return true;
} }
ext::opengl::Buffer& ext::opengl::Shader::getUniformBuffer( const uf::stl::string& name ) { ext::opengl::Buffer& ext::opengl::Shader::getUniformBuffer( const uf::stl::string& name ) {
UF_ASSERT( hasUniform(name) ); UF_ASSERT( hasUniform(name) );
size_t uniformIndex = metadata.definitions.uniforms[name].index; size_t uniformIndex = 0; // metadata.definitions.uniforms[name].index;
for ( size_t bufferIndex = 0, uniformCounter = 0; bufferIndex < buffers.size(); ++bufferIndex ) { for ( size_t bufferIndex = 0, uniformCounter = 0; bufferIndex < buffers.size(); ++bufferIndex ) {
if ( !(buffers[bufferIndex].usage & uf::renderer::enums::Buffer::UNIFORM) ) continue; if ( !(buffers[bufferIndex].usage & uf::renderer::enums::Buffer::UNIFORM) ) continue;
if ( uniformCounter++ != uniformIndex ) continue; if ( uniformCounter++ != uniformIndex ) continue;
@ -143,7 +128,7 @@ ext::opengl::Buffer& ext::opengl::Shader::getUniformBuffer( const uf::stl::strin
} }
const ext::opengl::Buffer& ext::opengl::Shader::getUniformBuffer( const uf::stl::string& name ) const { const ext::opengl::Buffer& ext::opengl::Shader::getUniformBuffer( const uf::stl::string& name ) const {
UF_ASSERT( hasUniform(name) ); UF_ASSERT( hasUniform(name) );
size_t uniformIndex = metadata.definitions.uniforms.at(name).index; size_t uniformIndex = 0; // metadata.definitions.uniforms.at(name).index;
for ( size_t bufferIndex = 0, uniformCounter = 0; bufferIndex < buffers.size(); ++bufferIndex ) { for ( size_t bufferIndex = 0, uniformCounter = 0; bufferIndex < buffers.size(); ++bufferIndex ) {
if ( !(buffers.at(bufferIndex).usage & uf::renderer::enums::Buffer::UNIFORM) ) continue; if ( !(buffers.at(bufferIndex).usage & uf::renderer::enums::Buffer::UNIFORM) ) continue;
if ( uniformCounter++ != uniformIndex ) continue; if ( uniformCounter++ != uniformIndex ) continue;
@ -153,28 +138,28 @@ const ext::opengl::Buffer& ext::opengl::Shader::getUniformBuffer( const uf::stl:
} }
ext::opengl::userdata_t& ext::opengl::Shader::getUniform( const uf::stl::string& name ) { ext::opengl::userdata_t& ext::opengl::Shader::getUniform( const uf::stl::string& name ) {
UF_ASSERT( hasUniform(name) ); UF_ASSERT( hasUniform(name) );
return uniforms[metadata.definitions.uniforms[name].index]; return uniforms[0/*metadata.definitions.uniforms[name].index*/];
} }
const ext::opengl::userdata_t& ext::opengl::Shader::getUniform( const uf::stl::string& name ) const { const ext::opengl::userdata_t& ext::opengl::Shader::getUniform( const uf::stl::string& name ) const {
UF_ASSERT( hasUniform(name) ); UF_ASSERT( hasUniform(name) );
return uniforms.at(metadata.definitions.uniforms.at(name).index); return uniforms.at(0/*metadata.definitions.uniforms.at(name).index*/);
} }
bool ext::opengl::Shader::updateUniform( const uf::stl::string& name, const void* data, size_t size ) const { bool ext::opengl::Shader::updateUniform( const uf::stl::string& name, const void* data, size_t size ) const {
if ( !hasUniform(name) ) return false; if ( !hasUniform(name) ) return false;
auto& bufferObject = getUniformBuffer(name); auto& bufferObject = getUniformBuffer(name);
size = MAX(metadata.definitions.uniforms.at(name).size, bufferObject.allocationInfo.size); // size = MAX(metadata.definitions.uniforms.at(name).size, bufferObject.allocationInfo.size);
updateBuffer( data, size, bufferObject ); updateBuffer( data, size, bufferObject );
return true; return true;
} }
bool ext::opengl::Shader::hasStorage( const uf::stl::string& name ) const { bool ext::opengl::Shader::hasStorage( const uf::stl::string& name ) const {
// return !ext::json::isNull(metadata["definitions"]["storage"][name]); // return metadata.definitions.storage.count(name) > 0;
return metadata.definitions.storage.count(name) > 0; return true;
} }
ext::opengl::Buffer& ext::opengl::Shader::getStorageBuffer( const uf::stl::string& name ) { ext::opengl::Buffer& ext::opengl::Shader::getStorageBuffer( const uf::stl::string& name ) {
UF_ASSERT( hasStorage(name) ); UF_ASSERT( hasStorage(name) );
size_t storageIndex = metadata.definitions.storage[name].index; size_t storageIndex = 0; // metadata.definitions.storage[name].index;
for ( size_t bufferIndex = 0, storageCounter = 0; bufferIndex < buffers.size(); ++bufferIndex ) { for ( size_t bufferIndex = 0, storageCounter = 0; bufferIndex < buffers.size(); ++bufferIndex ) {
if ( !(buffers[bufferIndex].usage & uf::renderer::enums::Buffer::STORAGE) ) continue; if ( !(buffers[bufferIndex].usage & uf::renderer::enums::Buffer::STORAGE) ) continue;
if ( storageCounter++ != storageIndex ) continue; if ( storageCounter++ != storageIndex ) continue;
@ -184,7 +169,7 @@ ext::opengl::Buffer& ext::opengl::Shader::getStorageBuffer( const uf::stl::strin
} }
const ext::opengl::Buffer& ext::opengl::Shader::getStorageBuffer( const uf::stl::string& name ) const { const ext::opengl::Buffer& ext::opengl::Shader::getStorageBuffer( const uf::stl::string& name ) const {
UF_ASSERT( hasStorage(name) ); UF_ASSERT( hasStorage(name) );
size_t storageIndex = metadata.definitions.storage.at(name).index; size_t storageIndex = 0; // metadata.definitions.storage.at(name).index;
for ( size_t bufferIndex = 0, storageCounter = 0; bufferIndex < buffers.size(); ++bufferIndex ) { for ( size_t bufferIndex = 0, storageCounter = 0; bufferIndex < buffers.size(); ++bufferIndex ) {
if ( !(buffers.at(bufferIndex).usage & uf::renderer::enums::Buffer::STORAGE) ) continue; if ( !(buffers.at(bufferIndex).usage & uf::renderer::enums::Buffer::STORAGE) ) continue;
if ( storageCounter++ != storageIndex ) continue; if ( storageCounter++ != storageIndex ) continue;

View File

@ -5,6 +5,11 @@
#include <limits> #include <limits>
#include <uf/utils/string/ext.h> #include <uf/utils/string/ext.h>
#include <uf/utils/math/vector.h> #include <uf/utils/math/vector.h>
#include <uf/utils/io/inputs.h>
#define NORMALIZE(X) ((float) (X) / (float) std::numeric_limits<decltype(X)>::max())
namespace { namespace {
struct { struct {
maple_device_t* device = NULL; maple_device_t* device = NULL;
@ -64,6 +69,54 @@ void spec::dreamcast::controller::initialize() {
void spec::dreamcast::controller::tick() { void spec::dreamcast::controller::tick() {
if ( !::controller.device ) ::controller.device = maple_enum_type(0, MAPLE_FUNC_CONTROLLER); if ( !::controller.device ) ::controller.device = maple_enum_type(0, MAPLE_FUNC_CONTROLLER);
if ( ::controller.device ) ::controller.state = (cont_state_t*) maple_dev_status(::controller.device); if ( ::controller.device ) ::controller.state = (cont_state_t*) maple_dev_status(::controller.device);
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::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::D = ::controller.state->buttons & CONT_D;
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::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;
/*
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 #if 0
uf::stl::vector<uf::stl::string> str; uf::stl::vector<uf::stl::string> str;
pod::Vector2f joystick = { analog("L_JOYSTICK_X"), analog("L_JOYSTICK_Y") }; pod::Vector2f joystick = { analog("L_JOYSTICK_X"), analog("L_JOYSTICK_Y") };
@ -97,7 +150,6 @@ bool spec::dreamcast::controller::pressed( const uf::stl::string& str, size_t i
return ::controller.state->buttons & GetKeyCode( str ); return ::controller.state->buttons & GetKeyCode( str );
} }
float spec::dreamcast::controller::analog( const uf::stl::string& str, size_t i ) { float spec::dreamcast::controller::analog( const uf::stl::string& str, size_t i ) {
#define NORMALIZE(X) ((float) (X) / (float) std::numeric_limits<decltype(X)>::max())
if ( !::controller.state ) return false; if ( !::controller.state ) return false;
if ( str == "L_TRIGGER" ) return NORMALIZE(::controller.state->ltrig); if ( str == "L_TRIGGER" ) return NORMALIZE(::controller.state->ltrig);

View File

@ -3,6 +3,7 @@
#include <uf/utils/string/utf.h> #include <uf/utils/string/utf.h>
#include <uf/utils/string/ext.h> #include <uf/utils/string/ext.h>
#include <uf/utils/window/payloads.h> #include <uf/utils/window/payloads.h>
#include <uf/utils/io/inputs.h>
#if UF_ENV_DREAMCAST #if UF_ENV_DREAMCAST
@ -32,6 +33,8 @@ namespace {
mouse_state_t* state = NULL; mouse_state_t* state = NULL;
} mouse; } mouse;
pod::Vector2ui resolution = { 640, 480 };
bool GetModifier( uint8_t modifier ) { bool GetModifier( uint8_t modifier ) {
if ( !::keyboard.state ) return false; if ( !::keyboard.state ) return false;
return ::keyboard.state->cond.modifiers & modifier; return ::keyboard.state->cond.modifiers & modifier;
@ -303,6 +306,8 @@ UF_API_CALL spec::dreamcast::Window::Window( const spec::dreamcast::Window::vect
} }
void UF_API_CALL spec::dreamcast::Window::create( const spec::dreamcast::Window::vector_t& _size, const spec::dreamcast::Window::title_t& title ) { void UF_API_CALL spec::dreamcast::Window::create( const spec::dreamcast::Window::vector_t& _size, const spec::dreamcast::Window::title_t& title ) {
::keyboard.device = maple_enum_type(1, MAPLE_FUNC_KEYBOARD); ::keyboard.device = maple_enum_type(1, MAPLE_FUNC_KEYBOARD);
this->setSize(_size);
} }
spec::dreamcast::Window::~Window() { spec::dreamcast::Window::~Window() {
@ -317,7 +322,7 @@ spec::dreamcast::Window::vector_t UF_API_CALL spec::dreamcast::Window::getPositi
return { 0, 0 }; return { 0, 0 };
} }
spec::dreamcast::Window::vector_t UF_API_CALL spec::dreamcast::Window::getSize() const { spec::dreamcast::Window::vector_t UF_API_CALL spec::dreamcast::Window::getSize() const {
return { 640, 480 }; return ::resolution;
} }
size_t UF_API_CALL spec::dreamcast::Window::getRefreshRate() const { size_t UF_API_CALL spec::dreamcast::Window::getRefreshRate() const {
return 60; return 60;
@ -330,9 +335,27 @@ void UF_API_CALL spec::dreamcast::Window::setPosition( const spec::dreamcast::Wi
void UF_API_CALL spec::dreamcast::Window::setMousePosition( const spec::dreamcast::Window::vector_t& position ) { void UF_API_CALL spec::dreamcast::Window::setMousePosition( const spec::dreamcast::Window::vector_t& position ) {
} }
spec::dreamcast::Window::vector_t UF_API_CALL spec::dreamcast::Window::getMousePosition( ) { spec::dreamcast::Window::vector_t UF_API_CALL spec::dreamcast::Window::getMousePosition( ) {
return { 320, 240 }; return { ::resolution.x / 2, ::resolution.y / 2 };
} }
void UF_API_CALL spec::dreamcast::Window::setSize( const spec::dreamcast::Window::vector_t& size ) { void UF_API_CALL spec::dreamcast::Window::setSize( const spec::dreamcast::Window::vector_t& size ) {
int e = 0;
int p = PM_RGB565;
if ( size.x == 320 && size.y == 240 ) e = DM_320x240;
else if ( size.x == 640 && size.y == 480 ) e = DM_640x480;
else if ( size.x == 800 && size.y == 608 ) e = DM_800x608;
else if ( size.x == 256 && size.y == 256 ) e = DM_256x256;
else if ( size.x == 768 && size.y == 480 ) e = DM_768x480;
else if ( size.x == 768 && size.y == 576 ) e = DM_768x576;
if ( !e ) {
UF_MSG_ERROR("invalid resolution set");
return;
}
::resolution = size;
vid_set_mode(e, p);
UF_MSG_DEBUG("Changing resolution to " << uf::vector::toString( size ));
} }
void UF_API_CALL spec::dreamcast::Window::setTitle( const spec::dreamcast::Window::title_t& title ) { void UF_API_CALL spec::dreamcast::Window::setTitle( const spec::dreamcast::Window::title_t& title ) {
@ -356,7 +379,119 @@ bool UF_API_CALL spec::dreamcast::Window::hasFocus() const {
#include <uf/utils/serialize/serializer.h> #include <uf/utils/serialize/serializer.h>
void UF_API_CALL spec::dreamcast::Window::bufferInputs() { void UF_API_CALL spec::dreamcast::Window::bufferInputs() {
uf::inputs::kbm::states::LShift = GetModifier(KBD_MOD_LSHIFT);
uf::inputs::kbm::states::RShift = GetModifier(KBD_MOD_RSHIFT);
uf::inputs::kbm::states::LAlt = GetModifier(KBD_MOD_LALT);
uf::inputs::kbm::states::RAlt = GetModifier(KBD_MOD_RALT);
uf::inputs::kbm::states::LControl = GetModifier(KBD_MOD_LCTRL);
uf::inputs::kbm::states::RControl = GetModifier(KBD_MOD_RCTRL);
uf::inputs::kbm::states::LSystem = GetModifier(KBD_MOD_S1);
uf::inputs::kbm::states::RSystem = GetModifier(KBD_MOD_S2);
// uf::inputs::kbm::states::Menu = KBD_KEY_APPS;
uf::inputs::kbm::states::SemiColon = KBD_KEY_SEMICOLON;
uf::inputs::kbm::states::Slash = KBD_KEY_SLASH;
// uf::inputs::kbm::states::Equal = KBD_KEY_EQUAL;
uf::inputs::kbm::states::Dash = KBD_KEY_MINUS;
uf::inputs::kbm::states::LBracket = KBD_KEY_LBRACKET;
uf::inputs::kbm::states::RBracket = KBD_KEY_RBRACKET;
uf::inputs::kbm::states::Comma = KBD_KEY_COMMA;
uf::inputs::kbm::states::Period = KBD_KEY_PERIOD;
uf::inputs::kbm::states::Quote = KBD_KEY_QUOTE;
uf::inputs::kbm::states::BackSlash = KBD_KEY_BACKSLASH;
uf::inputs::kbm::states::Tilde = KBD_KEY_TILDE;
uf::inputs::kbm::states::Escape = KBD_KEY_ESCAPE;
uf::inputs::kbm::states::Space = KBD_KEY_SPACE;
uf::inputs::kbm::states::Enter = KBD_KEY_ENTER;
uf::inputs::kbm::states::BackSpace = KBD_KEY_BACKSPACE;
uf::inputs::kbm::states::Tab = KBD_KEY_TAB;
uf::inputs::kbm::states::PageUp = KBD_KEY_PGUP;
uf::inputs::kbm::states::PageDown = KBD_KEY_PGDOWN;
uf::inputs::kbm::states::End = KBD_KEY_END;
uf::inputs::kbm::states::Home = KBD_KEY_HOME;
uf::inputs::kbm::states::Insert = KBD_KEY_INSERT;
uf::inputs::kbm::states::Delete = KBD_KEY_DEL;
uf::inputs::kbm::states::Add = KBD_KEY_PAD_PLUS;
uf::inputs::kbm::states::Subtract = KBD_KEY_PAD_MINUS;
uf::inputs::kbm::states::Multiply = KBD_KEY_PAD_MULTIPLY;
uf::inputs::kbm::states::Divide = KBD_KEY_PAD_DIVIDE;
uf::inputs::kbm::states::Pause = KBD_KEY_PAUSE;
uf::inputs::kbm::states::F1 = KBD_KEY_F1;
uf::inputs::kbm::states::F2 = KBD_KEY_F2;
uf::inputs::kbm::states::F3 = KBD_KEY_F3;
uf::inputs::kbm::states::F4 = KBD_KEY_F4;
uf::inputs::kbm::states::F5 = KBD_KEY_F5;
uf::inputs::kbm::states::F6 = KBD_KEY_F6;
uf::inputs::kbm::states::F7 = KBD_KEY_F7;
uf::inputs::kbm::states::F8 = KBD_KEY_F8;
uf::inputs::kbm::states::F9 = KBD_KEY_F9;
uf::inputs::kbm::states::F10 = KBD_KEY_F10;
uf::inputs::kbm::states::F11 = KBD_KEY_F11;
uf::inputs::kbm::states::F12 = KBD_KEY_F12;
// uf::inputs::kbm::states::F13 = KBD_KEY_F13;
// uf::inputs::kbm::states::F14 = KBD_KEY_F14;
// uf::inputs::kbm::states::F15 = KBD_KEY_F15;
uf::inputs::kbm::states::Left = KBD_KEY_LEFT;
uf::inputs::kbm::states::Right = KBD_KEY_RIGHT;
uf::inputs::kbm::states::Up = KBD_KEY_UP;
uf::inputs::kbm::states::Down = KBD_KEY_DOWN;
uf::inputs::kbm::states::Numpad0 = KBD_KEY_PAD_0;
uf::inputs::kbm::states::Numpad1 = KBD_KEY_PAD_1;
uf::inputs::kbm::states::Numpad2 = KBD_KEY_PAD_2;
uf::inputs::kbm::states::Numpad3 = KBD_KEY_PAD_3;
uf::inputs::kbm::states::Numpad4 = KBD_KEY_PAD_4;
uf::inputs::kbm::states::Numpad5 = KBD_KEY_PAD_5;
uf::inputs::kbm::states::Numpad6 = KBD_KEY_PAD_6;
uf::inputs::kbm::states::Numpad7 = KBD_KEY_PAD_7;
uf::inputs::kbm::states::Numpad8 = KBD_KEY_PAD_8;
uf::inputs::kbm::states::Numpad9 = KBD_KEY_PAD_9;
uf::inputs::kbm::states::Q = KBD_KEY_Q;
uf::inputs::kbm::states::W = KBD_KEY_W;
uf::inputs::kbm::states::E = KBD_KEY_E;
uf::inputs::kbm::states::R = KBD_KEY_R;
uf::inputs::kbm::states::T = KBD_KEY_T;
uf::inputs::kbm::states::Y = KBD_KEY_Y;
uf::inputs::kbm::states::U = KBD_KEY_U;
uf::inputs::kbm::states::I = KBD_KEY_I;
uf::inputs::kbm::states::O = KBD_KEY_O;
uf::inputs::kbm::states::P = KBD_KEY_P;
uf::inputs::kbm::states::A = KBD_KEY_A;
uf::inputs::kbm::states::S = KBD_KEY_S;
uf::inputs::kbm::states::D = KBD_KEY_D;
uf::inputs::kbm::states::F = KBD_KEY_F;
uf::inputs::kbm::states::G = KBD_KEY_G;
uf::inputs::kbm::states::H = KBD_KEY_H;
uf::inputs::kbm::states::J = KBD_KEY_J;
uf::inputs::kbm::states::K = KBD_KEY_K;
uf::inputs::kbm::states::L = KBD_KEY_L;
uf::inputs::kbm::states::Z = KBD_KEY_Z;
uf::inputs::kbm::states::X = KBD_KEY_X;
uf::inputs::kbm::states::C = KBD_KEY_C;
uf::inputs::kbm::states::V = KBD_KEY_V;
uf::inputs::kbm::states::B = KBD_KEY_B;
uf::inputs::kbm::states::N = KBD_KEY_N;
uf::inputs::kbm::states::M = KBD_KEY_M;
uf::inputs::kbm::states::Num1 = KBD_KEY_1;
uf::inputs::kbm::states::Num2 = KBD_KEY_2;
uf::inputs::kbm::states::Num3 = KBD_KEY_3;
uf::inputs::kbm::states::Num4 = KBD_KEY_4;
uf::inputs::kbm::states::Num5 = KBD_KEY_5;
uf::inputs::kbm::states::Num6 = KBD_KEY_6;
uf::inputs::kbm::states::Num7 = KBD_KEY_7;
uf::inputs::kbm::states::Num8 = KBD_KEY_8;
uf::inputs::kbm::states::Num9 = KBD_KEY_9;
uf::inputs::kbm::states::Num0 = KBD_KEY_0;
} }
void UF_API_CALL spec::dreamcast::Window::processEvents() { void UF_API_CALL spec::dreamcast::Window::processEvents() {
if ( !::keyboard.device ) ::keyboard.device = maple_enum_type(0, MAPLE_FUNC_KEYBOARD); if ( !::keyboard.device ) ::keyboard.device = maple_enum_type(0, MAPLE_FUNC_KEYBOARD);
@ -426,24 +561,20 @@ bool UF_API_CALL spec::dreamcast::Window::pollEvents( bool block ) {
auto& event = this->m_events.front(); 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>() ); ext::json::Value payload = uf::Serializer( event.payload.as<uf::stl::string>() );
uf::hooks.call( "window:Event", payload );
uf::hooks.call( event.name, payload ); uf::hooks.call( event.name, payload );
} else if ( event.payload.is<uf::Serializer>() ) { } else if ( event.payload.is<uf::Serializer>() ) {
uf::Serializer& payload = event.payload.as<uf::Serializer>(); uf::Serializer& payload = event.payload.as<uf::Serializer>();
uf::hooks.call( "window:Event", payload );
uf::hooks.call( event.name, payload ); uf::hooks.call( event.name, payload );
} else if ( event.payload.is<ext::json::Value>() ) { } else if ( event.payload.is<ext::json::Value>() ) {
ext::json::Value& payload = event.payload.as<ext::json::Value>(); ext::json::Value& payload = event.payload.as<ext::json::Value>();
uf::hooks.call( event.name, payload );
} else {
uf::hooks.call( event.name, event.payload );
}
/*
try {
uf::hooks.call( "window:Event", payload ); uf::hooks.call( "window:Event", payload );
uf::hooks.call( event.name, payload ); uf::hooks.call( event.name, payload );
} catch ( ... ) { } else {
// Let the hook handler handle the exceptions uf::hooks.call( "window:Event", event.payload );
uf::hooks.call( event.name, event.payload );
} }
*/
this->m_events.pop(); this->m_events.pop();
} }
return true; return true;
@ -463,7 +594,7 @@ void UF_API_CALL spec::dreamcast::Window::setMouseGrabbed(bool state) {
void UF_API_CALL spec::dreamcast::Window::grabMouse(bool state) { void UF_API_CALL spec::dreamcast::Window::grabMouse(bool state) {
} }
pod::Vector2ui UF_API_CALL spec::dreamcast::Window::getResolution() { pod::Vector2ui UF_API_CALL spec::dreamcast::Window::getResolution() {
return { 640, 480 }; return ::resolution;
} }
void UF_API_CALL spec::dreamcast::Window::switchToFullscreen( bool borderless ) { void UF_API_CALL spec::dreamcast::Window::switchToFullscreen( bool borderless ) {
} }

View File

@ -99,6 +99,7 @@ bool uf::Image::open( const uf::stl::string& filename, bool flip ) {
} }
#endif #endif
if ( !uf::io::exists(filename) ) UF_EXCEPTION("IO error: file does not exist: " + filename); if ( !uf::io::exists(filename) ) UF_EXCEPTION("IO error: file does not exist: " + filename);
this->m_filename = filename; this->m_filename = filename;
this->m_pixels.clear(); this->m_pixels.clear();
int width = 0, height = 0, channelsDud = 0, bit_depth = 8, channels = 4; int width = 0, height = 0, channelsDud = 0, bit_depth = 8, channels = 4;

View File

@ -255,10 +255,15 @@ void ext::PlayerBehavior::tick( uf::Object& self ) {
float friction = 0.8f; float friction = 0.8f;
float air = 1.0f; float air = 1.0f;
} speed; { } speed; {
float scale = 1;
#if UF_USE_OPENGL
scale = 10;
#endif
speed.rotate = metadata.movement.rotate * uf::physics::time::delta; speed.rotate = metadata.movement.rotate * uf::physics::time::delta;
speed.move = metadata.movement.move; speed.move = metadata.movement.move * scale;
speed.run = metadata.movement.run; speed.run = metadata.movement.run * scale;
speed.walk = metadata.movement.walk; speed.walk = metadata.movement.walk * scale;
speed.friction = metadata.movement.friction; speed.friction = metadata.movement.friction;
speed.air = metadata.movement.air; speed.air = metadata.movement.air;

View File

@ -206,7 +206,6 @@ void ext::ExtSceneBehavior::tick( uf::Object& self ) {
auto& metadataJson = this->getComponent<uf::Serializer>(); auto& metadataJson = this->getComponent<uf::Serializer>();
#if 1 #if 1
uf::hooks.call("game:Frame.Start"); uf::hooks.call("game:Frame.Start");
metadata.shader.invalidated = false;
/* Print World Tree */ { /* Print World Tree */ {
TIMER(1, uf::inputs::kbm::states::U && ) { TIMER(1, uf::inputs::kbm::states::U && ) {

View File

@ -751,6 +751,49 @@ void ext::GuiBehavior::tick( uf::Object& self ) {
bool isGlyph = this->hasComponent<ext::GuiBehavior::GlyphMetadata>(); bool isGlyph = this->hasComponent<ext::GuiBehavior::GlyphMetadata>();
#if UF_USE_OPENGL #if UF_USE_OPENGL
auto model = uf::matrix::identity();
auto& shader = graphic.material.getShader("vertex");
pod::Uniform uniform;
if ( metadata.mode == 1 ) {
uniform.modelView = transform.model;
uniform.projection = uf::matrix::identity();
} else if ( metadata.mode == 2 ) {
auto& scene = uf::scene::getCurrentScene();
auto& controller = scene.getController();
auto& camera = controller.getComponent<uf::Camera>();
uniform.modelView = camera.getView() * uf::transform::model( transform );
uniform.projection = camera.getProjection();
model = uniform.modelView;
} else if ( metadata.mode == 3 ) {
pod::Transform<> flatten = uf::transform::flatten( transform );
uniform.modelView =
uf::matrix::translate( uf::matrix::identity(), flatten.position ) *
uf::matrix::scale( uf::matrix::identity(), flatten.scale ) *
uf::quaternion::matrix( flatten.orientation ) *
flatten.model;
uniform.projection = camera.getProjection();
model = uniform.modelView;
} else {
pod::Transform<> flatten = uf::transform::flatten( transform );
model =
uf::matrix::translate( uf::matrix::identity(), flatten.position ) *
uf::matrix::scale( uf::matrix::identity(), flatten.scale ) *
uf::quaternion::matrix( flatten.orientation ) *
flatten.model;
flatten.position.y = -flatten.position.y;
if ( isGlyph ) flatten.scale.y = -flatten.scale.y;
flatten.position.z = 1;
uniform.modelView =
uf::matrix::translate( uf::matrix::identity(), flatten.position ) *
uf::matrix::scale( uf::matrix::identity(), flatten.scale ) *
uf::quaternion::matrix( flatten.orientation ) *
flatten.model;
uniform.projection = uf::matrix::identity();
}
shader.updateUniform( "UBO", (const void*) &uniform, sizeof(uniform) );
/*
auto model = uf::matrix::identity(); auto model = uf::matrix::identity();
auto uniformBuffer = graphic.getUniform(); auto uniformBuffer = graphic.getUniform();
pod::Uniform& uniform = *((pod::Uniform*) graphic.device->getBuffer(uniformBuffer.buffer)); pod::Uniform& uniform = *((pod::Uniform*) graphic.device->getBuffer(uniformBuffer.buffer));
@ -793,6 +836,7 @@ void ext::GuiBehavior::tick( uf::Object& self ) {
uniform.projection = uf::matrix::identity(); uniform.projection = uf::matrix::identity();
} }
graphic.updateUniform( &uniform, sizeof(uniform) ); graphic.updateUniform( &uniform, sizeof(uniform) );
*/
#elif UF_USE_VULKAN #elif UF_USE_VULKAN
if ( !graphic.material.hasShader("vertex") ) return; if ( !graphic.material.hasShader("vertex") ) return;