#include "behavior.h" #include #include #include #include #include #include #include #include #include #include #include #include "../../scenes/worldscape//battle.h" #include "../../scenes/worldscape//.h" namespace { uf::Serializer masterTableGet( const std::string& table ) { uf::Scene& scene = uf::scene::getCurrentScene(); uf::Serializer& mastertable = scene.getComponent(); return mastertable["system"]["mastertable"][table]; } uf::Serializer masterDataGet( const std::string& table, const std::string& key ) { uf::Scene& scene = uf::scene::getCurrentScene(); uf::Serializer& mastertable = scene.getComponent(); return mastertable["system"]["mastertable"][table][key]; } inline int64_t parseInt( const std::string& str ) { return atoi(str.c_str()); } } UF_BEHAVIOR_REGISTER_CPP(ext::HousamoSpriteBehavior) #define this (&self) void ext::HousamoSpriteBehavior::initialize( uf::Object& self ) { uf::Scene& scene = uf::scene::getCurrentScene(); uf::Serializer& metadata = this->getComponent(); uf::Serializer& masterdata = scene.getComponent(); uf::Asset& assetLoader = scene.getComponent(); this->addHook( "graphics:Assign.%UID%", [&](ext::json::Value& json){ std::string filename = json["filename"].as(); metadata["system"]["control"] = false; if ( uf::io::extension(filename) != "png" ) return; uf::Scene& scene = this->getRootParent(); uf::Asset& assetLoader = scene.getComponent(); const uf::Image* imagePointer = NULL; try { imagePointer = &assetLoader.get(filename); } catch ( ... ) {} if ( !imagePointer ) return; uf::Image image = *imagePointer; uf::Mesh& mesh = this->getComponent(); auto& graphic = this->getComponent(); mesh.vertices = { {{-1*-0.5f, 0.0f, 0.0f}, {1.0f, 0.0f}, { 0.0f, 0.0f, -1.0f } }, {{-1*0.5f, 0.0f, 0.0f}, {0.0f, 0.0f}, { 0.0f, 0.0f, -1.0f } }, {{-1*0.5f, 1.0f, 0.0f}, {0.0f, 1.0f}, { 0.0f, 0.0f, -1.0f } }, {{-1*0.5f, 1.0f, 0.0f}, {0.0f, 1.0f}, { 0.0f, 0.0f, -1.0f } }, {{-1*-0.5f, 1.0f, 0.0f}, {1.0f, 1.0f}, { 0.0f, 0.0f, -1.0f } }, {{-1*-0.5f, 0.0f, 0.0f}, {1.0f, 0.0f}, { 0.0f, 0.0f, -1.0f } }, {{-1*0.5f, 1.0f, 0.0f}, {0.0f, 1.0f}, { 0.0f, 0.0f, 1.0f } }, {{-1*0.5f, 0.0f, 0.0f}, {0.0f, 0.0f}, { 0.0f, 0.0f, 1.0f } }, {{-1*-0.5f, 0.0f, 0.0f}, {1.0f, 0.0f}, { 0.0f, 0.0f, 1.0f } }, {{-1*-0.5f, 0.0f, 0.0f}, {1.0f, 0.0f}, { 0.0f, 0.0f, 1.0f } }, {{-1*-0.5f, 1.0f, 0.0f}, {1.0f, 1.0f}, { 0.0f, 0.0f, 1.0f } }, {{-1*0.5f, 1.0f, 0.0f}, {0.0f, 1.0f}, { 0.0f, 0.0f, 1.0f } }, }; graphic.initialize(); graphic.initializeGeometry( mesh ); auto& texture = graphic.material.textures.emplace_back(); texture.loadFromImage( image ); graphic.material.attachShader("./data/shaders/base.stereo.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); graphic.material.attachShader("./data/shaders/base.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); metadata["system"]["control"] = true; metadata["system"]["loaded"] = true; }); this->addHook( "asset:Load.%UID%", [&](ext::json::Value& json){ this->queueHook("graphics:Assign.%UID%", json, 0.0f); }); { std::string id = metadata[""]["party"][0].as(); uf::Serializer member = metadata[""]["transients"][id]; uf::Serializer cardData = masterDataGet("Card", id); std::string name = cardData["filename"].as(); if ( member["skin"].is() ) name += "_" + member["skin"].as(); std::string filename = "https://cdn..xyz//unity/Android/fg/fg_" + name + ".png"; if ( cardData["internal"].as() ) { filename = "./data/smtsamo/fg/fg_" + name + ".png"; } metadata["orientation"] = cardData["orientation"].as() == "" ? "portrait" : "landscape"; assetLoader.load(filename, "asset:Load." + std::to_string(this->getUid()) ); } } void ext::HousamoSpriteBehavior::tick( uf::Object& self ) {} void ext::HousamoSpriteBehavior::render( uf::Object& self ){ uf::Serializer& metadata = this->getComponent(); if ( !metadata["system"]["loaded"].as() ) return; /* Update uniforms */ if ( this->hasComponent() ) { auto& mesh = this->getComponent(); auto& scene = uf::scene::getCurrentScene(); auto& graphic = this->getComponent(); auto& transform = this->getComponent>(); auto& camera = scene.getController().getComponent(); if ( !graphic.initialized ) return; auto& uniforms = graphic.material.shaders.front().uniforms.front().get(); uniforms.matrices.model = uf::transform::model( transform ); for ( std::size_t i = 0; i < 2; ++i ) { uniforms.matrices.view[i] = camera.getView( i ); uniforms.matrices.projection[i] = camera.getProjection( i ); } uniforms.color[0] = metadata["color"][0].as(); uniforms.color[1] = metadata["color"][1].as(); uniforms.color[2] = metadata["color"][2].as(); uniforms.color[3] = metadata["color"][3].as(); graphic.material.shaders.front().updateBuffer( uniforms, 0, false ); }; } void ext::HousamoSpriteBehavior::destroy( uf::Object& self ){} #undef this