#include "behavior.h" #include #include #include #include #include #include #include #include #include #include #include #include UF_BEHAVIOR_REGISTER_CPP(ext::PortalsBehavior) UF_BEHAVIOR_REGISTER_AS_OBJECT(ext::PortalsBehavior, Portals) #define this (&self) void ext::PortalsBehavior::initialize( uf::Object& self ) { auto& metadata = this->getComponent(); uf::Object& red = *(new uf::Object); this->addChild(red); uf::instantiator::bind( "Portal", red ); uf::Object& blue = *(new uf::Object); this->addChild(blue); uf::instantiator::bind( "Portal", blue ); metadata["portals"][0]["name"] = "Portal"; metadata["portals"][1]["name"] = "Portal"; red.load( (uf::Serializer) metadata["portals"][0] ); blue.load( (uf::Serializer) metadata["portals"][1] ); red.initialize(); blue.initialize(); red.getComponent()["target"] = blue.getUid(); blue.getComponent()["target"] = red.getUid(); } void ext::PortalsBehavior::tick( uf::Object& self ) { } void ext::PortalsBehavior::render( uf::Object& self ){} void ext::PortalsBehavior::destroy( uf::Object& self ){} #undef this UF_BEHAVIOR_REGISTER_CPP(ext::PortalBehavior) UF_BEHAVIOR_REGISTER_AS_OBJECT(ext::PortalBehavior, Portal) #define this (&self) void ext::PortalBehavior::initialize( uf::Object& self ) { auto& metadata = this->getComponent(); auto& transform = this->getComponent>(); auto& camera = this->getComponent(); { auto& scene = uf::scene::getCurrentScene(); auto& controller = scene.getController(); // copies camera settings camera = controller.getComponent(); } { auto& renderMode = this->getComponent(); std::string name = "RT:" + std::to_string((int) this->getUid()); uf::renderer::addRenderMode( &renderMode, name ); #if UF_USE_OPENVR if ( ext::openvr::enabled ) { ext::openvr::initialize(); uint32_t width, height; ext::openvr::recommendedResolution( width, height ); renderMode.width = width; renderMode.height = height; } #endif } } void ext::PortalBehavior::tick( uf::Object& self ) { auto& renderMode = this->getComponent(); renderMode.setTarget(""); auto& scene = uf::scene::getCurrentScene(); auto& controller = scene.getController(); auto& camera = this->getComponent(); auto& metadata = this->getComponent(); /* static pod::Transform<> otherSideTransform = this->getComponent>(); { float step = 4.0f; if ( uf::Window::isKeyPressed("B") ) otherSideTransform.position.x -= step * uf::physics::time::delta; if ( uf::Window::isKeyPressed("M") ) otherSideTransform.position.x += step * uf::physics::time::delta; if ( uf::Window::isKeyPressed("G") ) otherSideTransform.position.y += step * uf::physics::time::delta; if ( uf::Window::isKeyPressed("J") ) otherSideTransform.position.y -= step * uf::physics::time::delta; if ( uf::Window::isKeyPressed("H") ) otherSideTransform.position.z += step * uf::physics::time::delta; if ( uf::Window::isKeyPressed("N") ) otherSideTransform.position.z -= step * uf::physics::time::delta; if ( uf::Window::isKeyPressed("L") ) { std::cout << otherSideTransform.position.x << ", " << otherSideTransform.position.y << ", " << otherSideTransform.position.z << "\t" << step * uf::physics::time::delta << std::endl; } } */ { auto& conCamera = controller.getComponent(); auto& prtTransform = this->getComponent>(); auto& otherSideTransform = this->getParent().findByUid( metadata["target"].as() )->getComponent>(); for ( std::size_t i = 0; i < 2; ++i ) { pod::Matrix4f controllerCameraToWorldMatrix = uf::matrix::inverse( conCamera.getView(i) ); pod::Matrix4f worldToPortalMatrix = uf::matrix::inverse( uf::transform::model( prtTransform ) ); pod::Matrix4f otherSideToWorldMatrix = uf::transform::model( otherSideTransform ); camera.setView( uf::matrix::inverse(otherSideToWorldMatrix * worldToPortalMatrix * controllerCameraToWorldMatrix), i ); } } } void ext::PortalBehavior::render( uf::Object& self ){ { auto& renderMode = this->getComponent(); auto& blitter = renderMode.blitter; auto& transform = this->getComponent>(); auto& scene = uf::scene::getCurrentScene(); auto& controller = scene.getController(); auto& camera = this->getComponent(); auto& controllerCamera = controller.getComponent(); if ( !blitter.initialized ) return; struct UniformDescriptor { struct { alignas(16) pod::Matrix4f models[2]; } matrices; struct { alignas(8) pod::Vector2f position = { 0.5f, 0.5f }; alignas(8) pod::Vector2f radius = { 0.1f, 0.1f }; alignas(16) pod::Vector4f color = { 1, 1, 1, 1 }; } cursor; alignas(4) float alpha; }; auto& shader = blitter.material.shaders.front(); auto& uniforms = shader.uniforms.front().get(); for ( std::size_t i = 0; i < 2; ++i ) { pod::Matrix4f model = uf::transform::model( transform ); uniforms.matrices.models[i] = controllerCamera.getProjection(i) * controllerCamera.getView(i) * model; uniforms.alpha = 1.0f; uniforms.cursor.position.x = -1.0f; uniforms.cursor.position.y = -1.0f; uniforms.cursor.radius.x = 0.0f; uniforms.cursor.radius.y = 0.0f; uniforms.cursor.color.x = 0.0f; uniforms.cursor.color.y = 0.0f; uniforms.cursor.color.z = 0.0f; uniforms.cursor.color.w = 0.0f; } shader.updateBuffer( (void*) &uniforms, sizeof(uniforms), 0 ); } } void ext::PortalBehavior::destroy( uf::Object& self ){ auto& renderMode = this->getComponent(); uf::renderer::removeRenderMode( &renderMode, false ); this->deleteComponent(); } #undef this