#include "TestState.hpp" #include "Core.hpp" #include "Log.hpp" #include "RenderCamera.hpp" #include "RenderSet.hpp" #include "RenderObject.hpp" #include "Program.hpp" #include "Mesh.hpp" #include "Texture.hpp" #include "GuiButton.hpp" #include "GuiList.hpp" #include "SysInfo.hpp" // for DPI /* ======== Construction and Destruction ======== */ TestState::TestState() { scene = NULL; gui = NULL; } TestState::~TestState() { } /* ======== State functions ======== */ int TestState::doProcess(unsigned int delta) { return 0; } int TestState::onEvent(SDL_Event event) { if (event.type == SDL_MULTIGESTURE) { LOG(LOG_INFO) << "gesture: " << event.mgesture.x << "x" << event.mgesture.y << ", rot:" << event.mgesture.dTheta << ", pinch:" << event.mgesture.dDist << ", fingers:" << event.mgesture.numFingers; RenderCamera *camera = scene->getCamera(1); Vec3 camera_pos = camera->getPosition(); camera_pos.y -= event.mgesture.dDist*256.0f; camera->setPosition(camera_pos.x, camera_pos.y, camera_pos.z); float yaw = camera->getYaw(); camera->setYaw(yaw - (event.mgesture.dTheta*128.0f)); camera->doRefresh(); } else if (event.type == SDL_FINGERMOTION) { LOG(LOG_INFO) << "finger: " << event.tfinger.fingerId << " " << event.tfinger.x << "x" << event.tfinger.y << " " << event.tfinger.dx << "x" << event.tfinger.dy; RenderCamera *camera = scene->getCamera(1); Vec3 camera_pos = camera->getPosition(); int width = core.getWidth(); int height = core.getHeight(); /*float x = camera_pos.y * event.tfinger.dx / 0.5; float y = camera_pos.y * event.tfinger.dy / 0.5;*/ LOG(LOG_INFO) << "finger traveled: " << event.tfinger.dx*width << "x" << event.tfinger.dy*height << ", " << (event.tfinger.dx*width)/sysinfo.ydpi << "inx" << (event.tfinger.dy*height)/sysinfo.xdpi << "in"; float x = (camera_pos.y * (event.tfinger.dx * width / sysinfo.density_dpi)); float y = (camera_pos.y * (event.tfinger.dy * height / sysinfo.density_dpi)); // This is weird. float yaw = camera->getYaw() * M_PI / 180.0f; float ax = (-x * cosf(yaw)) + (y * sinf(yaw)); float ay = (y * cosf(yaw)) - (-x * sinf(yaw)); camera->setPosition(camera_pos.x+ax, camera_pos.y, camera_pos.z+ay); camera->doRefresh(); } else if (event.type == SDL_MOUSEMOTION && event.motion.which != SDL_TOUCH_MOUSEID) { LOG(LOG_INFO) << "mouse motion: " << event.motion.xrel << "x" << event.motion.yrel << " "; RenderCamera *camera = scene->getCamera(1); if (event.motion.state & SDL_BUTTON_MMASK) { camera->setYaw(camera->getYaw() - event.motion.xrel); } else if (event.motion.state & SDL_BUTTON_RMASK) { Vec3 camera_pos = camera->getPosition(); int width = core.getWidth(); int height = core.getHeight(); float x = camera_pos.y * (float)event.motion.xrel / (float)width; float y = camera_pos.y * (float)event.motion.yrel / (float)height; // This is weird. (again) float yaw = camera->getYaw() * M_PI / 180.0f; float ax = (-x * cosf(yaw)) + (y * sinf(yaw)); float ay = (y * cosf(yaw)) - (-x * sinf(yaw)); camera->setPosition(camera_pos.x+ax, camera_pos.y, camera_pos.z+ay); } camera->doRefresh(); } else if (event.type == SDL_MOUSEWHEEL) { RenderCamera *camera = scene->getCamera(1); Vec3 camera_pos = camera->getPosition(); camera_pos.y -= event.wheel.y; camera->setPosition(camera_pos.x, camera_pos.y, camera_pos.z); camera->doRefresh(); } else if (event.type == SDL_KEYUP) { if (event.key.keysym.sym == SDLK_SPACE) { RenderCamera *camera = scene->getCamera(1); if (camera->getRenderMode() == 0) { camera->setRenderMode(1); } else { camera->setRenderMode(0); } } } return 0; } int TestState::onRise() { scene = core.getScene(); asset_manager = core.getAssetManager(); gui = core.getGui(); return 0; } int TestState::onCede() { return 0; } int TestState::onInit() { // Get our services asset_manager = core.getAssetManager(); gui = core.getGui(); // TEMP: our framebuffer rendering program Program *program = new Program(); // FIXME: check for GLSL version and automagically load the appropriate shader file std::string shader_file; shader_file = "shaders/" + core.shader_version + "/fb_fs.glsl"; Asset *shader_asset = asset_manager->loadFile(shader_file.c_str()); if (program->addShader(shader_asset->getData(), shader_asset->getDataLength(), GL_FRAGMENT_SHADER) != 0) { LOG(LOG_ERROR) << "Failed to add Shader!"; return 1; } shader_asset->unloadData(); shader_file = "shaders/" + core.shader_version + "/fb_vs.glsl"; shader_asset = asset_manager->loadFile(shader_file.c_str()); if (program->addShader(shader_asset->getData(), shader_asset->getDataLength(), GL_VERTEX_SHADER) != 0) { LOG(LOG_ERROR) << "Failed to add Shader!"; return 1; } shader_asset->unloadData(); if (program->doCompile() != 0) { LOG(LOG_ERROR) << "Failed to compile GLSL Program!"; return 1; } // TEMP: our model rendering program Program *program_model = new Program(); shader_file = "shaders/" + core.shader_version + "/default_fs.glsl"; shader_asset = asset_manager->loadFile(shader_file.c_str()); if (program_model->addShader(shader_asset->getData(), shader_asset->getDataLength(), GL_FRAGMENT_SHADER) != 0) { LOG(LOG_ERROR) << "Failed to add Shader!"; return 1; } shader_asset->unloadData(); shader_file = "shaders/" + core.shader_version + "/default_vs.glsl"; shader_asset = asset_manager->loadFile(shader_file.c_str()); if (program_model->addShader(shader_asset->getData(), shader_asset->getDataLength(), GL_VERTEX_SHADER) != 0) { LOG(LOG_ERROR) << "Failed to add Shdaer!"; return 1; } shader_asset->unloadData(); if (program_model->doCompile() != 0) { LOG(LOG_ERROR) << "Failed to compile GLSL Program!"; return 1; } scene = core.getScene(); int width = core.getWidth(); int height = core.getHeight(); RenderCamera *camera = new RenderCamera(); camera->setRenderView(new RenderView(width, height)); camera->updateProjection(width, height); camera->setPitch(80.0f); camera->setPosition(0, 30, 0); camera->doRefresh(); scene->addCamera(camera); program->attachTexture(0, camera->getRenderView()->getTex()); (camera->getRenderView()->setProgram(program)); RenderSet *sert = new RenderSet(); sert->setProgram(program_model); Asset *asset_mesh; Asset *asset_texture; RenderObject *objerct = new RenderObject(); objerct->setMesh(core.getMesh("models/cube.obj")); objerct->setTexture(core.getTexture("textures/cube.png")); sert->addObject(objerct); objerct = new RenderObject(); objerct->setMesh(core.getMesh("models/plane.obj")); objerct->setTexture(core.getTexture("tokens/gentlebones.png")); objerct->setTranslation(4.0f, 0.0f, 4.0f); objerct->calcMatrix(); sert->addObject(objerct); scene->addSet(sert); // GUI testing //GuiElement *element = new GuiButton("test", core.getTexture("ui/icon_perscube.png")); SDL_Color color = {0, 0, 0}; Texture *text_texture = new Texture("text", TTF_RenderUTF8_Blended(core.default_font->font, "Test", color)); text_texture->buildTexture(); GuiElement *element = new GuiButton("test", text_texture); element->setPFlags(GuiElement::TOP|GuiElement::RIGHT); element->setGeometry(0.0f, 0.0f, text_texture->w, text_texture->h); GuiList *element_list = new GuiList("list1"); element_list->addChild(element); element->setParent(element_list); element_list->setPFlags(GuiElement::TOP|GuiElement::RIGHT); element_list->setGeometry(0.0f, 0.0f, 128.0f, 128.0f); element = new GuiButton("test2", core.getTexture("ui/icon_isocube.png")); element->setPFlags(GuiElement::TOP|GuiElement::RIGHT); element->setGeometry(0.0f, 0.0f, 128.0f, 128.0f); element_list->addChild(element); element->setParent(element_list); element = new GuiButton("test3", core.getTexture("ui/icon_token.png")); element->setPFlags(GuiElement::TOP|GuiElement::RIGHT); element->setGeometry(0.0f, 0.0f, 128.0f, 128.0f); element_list->addChild(element); element->setParent(element_list); gui->addElement(element_list); /*element = new GuiElement("test2", 10, 2); element->setPFlags(GuiElement::RIGHT|GuiElement::TOP); element->setGeometry(256.0f, 128.0f, 128.0f, 128.0f); gui->addElement(element);*/ // manually update GUI gui->updateElements(); return 0; }