222 lines
8.3 KiB
C++
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;
|
|
}
|