RtB/src/states/TestState.cpp

222 lines
8.3 KiB
C++

#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;
}