207 lines
6.1 KiB
C++
207 lines
6.1 KiB
C++
// This only works with opengl!!!!
|
|
|
|
|
|
#include "Sandbox.h"
|
|
|
|
|
|
|
|
Sandbox::Sandbox(Archimedes::App* a, void* h) : Archimedes::Module(a, h) {
|
|
|
|
name = "Sandbox";
|
|
|
|
WindowModule* wm = new WindowModule(a, h);
|
|
deps[*wm] = wm;
|
|
|
|
ImguiModule* im = new ImguiModule(a, h);
|
|
deps[*im] = im;
|
|
}
|
|
|
|
Sandbox::~Sandbox() {
|
|
|
|
if(app) {
|
|
WindowModule* wm; { wm = (WindowModule*) moduleInstances[WindowModule()]; }
|
|
|
|
ImguiModule* im; { im = (ImguiModule*) moduleInstances[ImguiModule()]; }
|
|
|
|
im->releaseContext(ImGui::GetCurrentContext());
|
|
|
|
wm->releaseWindow(window);
|
|
|
|
}
|
|
}
|
|
|
|
void Sandbox::onLoad() {
|
|
// get window
|
|
WindowModule* wm; { wm = (WindowModule*) moduleInstances[WindowModule()]; }
|
|
ImguiModule* im; { im = (ImguiModule*) moduleInstances[ImguiModule()]; }
|
|
|
|
if(!wm) {
|
|
std::cout << "No WindowModule for Sandbox!\n";
|
|
std::abort();
|
|
}
|
|
|
|
if(!im) {
|
|
std::cout << "No ImguiModule for Sandbox!\n";
|
|
std::abort();
|
|
}
|
|
|
|
window = wm->aquireWindow();
|
|
|
|
ImGui::SetCurrentContext(im->aquireContext());
|
|
|
|
window->getRenderer()->clearColor = { 0.2, 0.2, 0.4, 0.7 };
|
|
|
|
gridShader = Archimedes::Shader(cubeVS, gridFS, Archimedes::Shader::LoadType::FromSource);
|
|
|
|
window->getRenderer()->useShader(gridShader);
|
|
|
|
grid = Archimedes::RenderTarget(
|
|
Archimedes::VertexBuffer(gridVertices, 12 * sizeof(float)),
|
|
Archimedes::IndexArray(gridIndices, 6),
|
|
Archimedes::VertexLayout(),
|
|
gridShader
|
|
);
|
|
|
|
window->getRenderer()->useRenderTarget(grid);
|
|
|
|
|
|
cubeShader = Archimedes::Shader(cubeVS, cubeFS, Archimedes::Shader::LoadType::FromSource);
|
|
|
|
window->getRenderer()->useShader(cubeShader);
|
|
|
|
cube = Archimedes::RenderTarget(
|
|
Archimedes::VertexBuffer(vertices, 24 * sizeof(float)),
|
|
Archimedes::IndexArray(indices, 36),
|
|
Archimedes::VertexLayout(),
|
|
cubeShader
|
|
);
|
|
|
|
window->getRenderer()->useRenderTarget(cube);
|
|
|
|
int w, h;
|
|
window->getSize(w, h);
|
|
app->emitEvent(new Archimedes::ResizeWindowEvent(w, h));
|
|
|
|
}
|
|
|
|
void Sandbox::run() {
|
|
|
|
static float scale = 100.0f;
|
|
|
|
static glm::vec3 pos(0), rot(0);
|
|
|
|
static glm::vec3 camPos(0.0f, 0.0f, 3.0f), camRot(0.0f, 0.0f, 0.0f);
|
|
|
|
static glm::mat4 orthoCamera, perspCamera, cameraTransform;
|
|
|
|
/*
|
|
cameraTransform = glm::mat4(1.0f);
|
|
cameraTransform = glm::translate(cameraTransform, camPos);
|
|
cameraTransform = glm::rotate(cameraTransform, camRot.x, glm::vec3(1.0f, 0.0f, 0.0f));
|
|
cameraTransform = glm::rotate(cameraTransform, camRot.y, glm::vec3(0.0f, 1.0f, 0.0f));
|
|
cameraTransform = glm::rotate(cameraTransform, camRot.z, glm::vec3(0.0f, 0.0f, 1.0f));
|
|
*/
|
|
|
|
cameraTransform = glm::lookAt(
|
|
camPos,
|
|
glm::normalize(glm::vec3(glm::cos(camRot.y) * glm::cos(camRot.x), glm::sin(camRot.x), glm::sin(camRot.y) * glm::cos(camRot.x))),
|
|
glm::vec3(0.0f, 1.0f, 0.0f)
|
|
);
|
|
/*
|
|
cameraTransform = glm::lookAt(
|
|
camPos,
|
|
glm::vec3(0.0f, 0.0f, 0.0f),
|
|
glm::vec3(0.0f, 1.0f, 0.0f)
|
|
);
|
|
*/
|
|
int w, h;
|
|
window->getSize(w, h);
|
|
|
|
orthoCamera = glm::ortho(-(float)w / 2.0f, (float)w / 2.0f, -(float)h / 2.0f, (float)h / 2.0f, 0.1f, 100.0f)
|
|
* cameraTransform;
|
|
|
|
perspCamera = glm::perspective(glm::radians(45.0f), (float)w/(float)h, 0.1f, 100.0f)
|
|
* cameraTransform;
|
|
|
|
glm::mat4& cubeTransform = cube.transform;
|
|
//glm::mat4& gridTransform = grid.transform;
|
|
|
|
cubeTransform = glm::mat4(1.0f);
|
|
cubeTransform = glm::translate(cubeTransform, pos);
|
|
cubeTransform = glm::rotate(cubeTransform, rot.x, glm::vec3(1.0f, 0.0f, 0.0f));
|
|
cubeTransform = glm::rotate(cubeTransform, rot.y, glm::vec3(0.0f, 1.0f, 0.0f));
|
|
cubeTransform = glm::rotate(cubeTransform, rot.z, glm::vec3(0.0f, 0.0f, 1.0f));
|
|
cubeTransform = glm::scale(cubeTransform, glm::vec3(scale));
|
|
|
|
|
|
//gridTransform = glm::mat4(1.0f);
|
|
//gridTransform = glm::scale(gridTransform, glm::vec3(800.0f));
|
|
|
|
|
|
//cubeTransform = orthoCamera * cubeTransform;
|
|
cubeTransform = perspCamera * cubeTransform;
|
|
|
|
//gridTransform = orthoCamera * gridTransform;
|
|
|
|
/*
|
|
cubeTransform = glm::perspective(glm::radians(45.0f), (float)w/(float)h, 0.1f, 100.0f)
|
|
* glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f))
|
|
* cubeTransform;
|
|
*/
|
|
|
|
|
|
//window->getRenderer()->draw(grid);
|
|
window->getRenderer()->draw(cube);
|
|
|
|
|
|
{
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
static glm::vec4& clearColor = window->getRenderer()->clearColor;
|
|
|
|
ImGui::Begin("Sandbox Module");
|
|
|
|
ImGui::Text("Pick a clear color!");
|
|
|
|
ImGui::SliderFloat("r", &clearColor.r, 0.0f, 1.0f);
|
|
ImGui::SliderFloat("g", &clearColor.g, 0.0f, 1.0f);
|
|
ImGui::SliderFloat("b", &clearColor.b, 0.0f, 1.0f);
|
|
ImGui::SliderFloat("a", &clearColor.a, 0.0f, 1.0f);
|
|
|
|
ImGui::Text("Properties");
|
|
|
|
ImGui::SliderFloat("pitch", &rot.x, -3.14159265359f, 3.14159265359f);
|
|
ImGui::SliderFloat("yaw", &rot.y, -3.14159265359f, 3.14159265359f);
|
|
ImGui::SliderFloat("roll", &rot.z, -3.14159265359f, 3.14159265359f);
|
|
|
|
ImGui::SliderFloat("scale", &scale, 0.1f, 10.0f);
|
|
|
|
ImGui::SliderFloat("x", &pos.x, -10.0f, 10.0f);
|
|
ImGui::SliderFloat("y", &pos.y, -10.0f, 10.0f);
|
|
ImGui::SliderFloat("z", &pos.z, -10.0f, 10.0f);
|
|
|
|
ImGui::Text("Camera Properties");
|
|
|
|
ImGui::SliderFloat("c_pitch", &camRot.x, -3.14159265359f, 3.14159265359f);
|
|
ImGui::SliderFloat("c_yaw", &camRot.y, -3.14159265359f, 3.14159265359f);
|
|
ImGui::SliderFloat("c_roll", &camRot.z, -3.14159265359f, 3.14159265359f);
|
|
|
|
ImGui::SliderFloat("c_x", &camPos.x, -10.0f, 10.0f);
|
|
ImGui::SliderFloat("c_y", &camPos.y, -10.0f, 10.0f);
|
|
ImGui::SliderFloat("c_z", &camPos.z, -10.0f, 10.0f);
|
|
|
|
|
|
if(ImGui::Button("Reset Window Size")) {
|
|
app->emitEvent(new Archimedes::ResizeWindowEvent(500, 500));
|
|
}
|
|
|
|
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
|
|
ImGui::End();
|
|
}
|
|
|
|
|
|
}
|
|
|
|
bool Sandbox::onEvent(const Archimedes::Event& e) {
|
|
return false;
|
|
}
|