crane completed
This commit is contained in:
parent
f020c3dd81
commit
0b6282a21b
@ -53,4 +53,38 @@ public:
|
|||||||
{
|
{
|
||||||
_transformations.emplace_back(vec, Scaling);
|
_transformations.emplace_back(vec, Scaling);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glm::vec4 translateToPivot(glm::vec3 pivot) override
|
||||||
|
{
|
||||||
|
glm::vec4 curr_pos = { 0, 0, 0, 0 };
|
||||||
|
glm::vec4 h_pivot = { pivot.x, pivot.y, pivot.z, 0 };
|
||||||
|
|
||||||
|
for (auto pair : _transformations)
|
||||||
|
{
|
||||||
|
if (pair.second == Translation)
|
||||||
|
curr_pos += pair.first;
|
||||||
|
}
|
||||||
|
addTranslation(h_pivot - curr_pos);
|
||||||
|
return curr_pos - h_pivot;
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeLastTransformations(int n = 1) override
|
||||||
|
{
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
_transformations.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec3 getPosition() override
|
||||||
|
{
|
||||||
|
glm::vec4 curr_pos = { 0, 0, 0, 0 };
|
||||||
|
|
||||||
|
for (auto pair : _transformations)
|
||||||
|
{
|
||||||
|
if (pair.second == Translation)
|
||||||
|
curr_pos += pair.first;
|
||||||
|
}
|
||||||
|
|
||||||
|
return curr_pos;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
@ -154,6 +154,7 @@
|
|||||||
<ClCompile Include="imgui\imgui_impl_glfw.cpp" />
|
<ClCompile Include="imgui\imgui_impl_glfw.cpp" />
|
||||||
<ClCompile Include="imgui\imgui_impl_opengl3.cpp" />
|
<ClCompile Include="imgui\imgui_impl_opengl3.cpp" />
|
||||||
<ClCompile Include="imgui\imgui_widgets.cpp" />
|
<ClCompile Include="imgui\imgui_widgets.cpp" />
|
||||||
|
<ClCompile Include="LineSegment.cpp" />
|
||||||
<ClCompile Include="MyGLWindow.cpp" />
|
<ClCompile Include="MyGLWindow.cpp" />
|
||||||
<ClCompile Include="Source.cpp" />
|
<ClCompile Include="Source.cpp" />
|
||||||
<ClCompile Include="Viewer.cpp" />
|
<ClCompile Include="Viewer.cpp" />
|
||||||
@ -172,6 +173,7 @@
|
|||||||
<ClInclude Include="imgui\imstb_rectpack.h" />
|
<ClInclude Include="imgui\imstb_rectpack.h" />
|
||||||
<ClInclude Include="imgui\imstb_textedit.h" />
|
<ClInclude Include="imgui\imstb_textedit.h" />
|
||||||
<ClInclude Include="imgui\imstb_truetype.h" />
|
<ClInclude Include="imgui\imstb_truetype.h" />
|
||||||
|
<ClInclude Include="LineSegment.h" />
|
||||||
<ClInclude Include="Loader.h" />
|
<ClInclude Include="Loader.h" />
|
||||||
<ClInclude Include="ModelView.h" />
|
<ClInclude Include="ModelView.h" />
|
||||||
<ClInclude Include="MyGLWindow.h" />
|
<ClInclude Include="MyGLWindow.h" />
|
||||||
|
@ -57,6 +57,9 @@
|
|||||||
<ClCompile Include="WireCube.cpp">
|
<ClCompile Include="WireCube.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="LineSegment.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="ColorCube.h">
|
<ClInclude Include="ColorCube.h">
|
||||||
@ -110,6 +113,9 @@
|
|||||||
<ClInclude Include="ADrawable.h">
|
<ClInclude Include="ADrawable.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="LineSegment.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="simple.frag">
|
<None Include="simple.frag">
|
||||||
|
@ -9,7 +9,8 @@ enum DrawableType
|
|||||||
{
|
{
|
||||||
COLOR_CUBE,
|
COLOR_CUBE,
|
||||||
CHECKERED_FLOOR,
|
CHECKERED_FLOOR,
|
||||||
WIRE_CUBE
|
WIRE_CUBE,
|
||||||
|
LINE_SEGMENT
|
||||||
};
|
};
|
||||||
|
|
||||||
class IDrawable {
|
class IDrawable {
|
||||||
@ -18,6 +19,12 @@ public:
|
|||||||
virtual void addTranslation(glm::vec4 vec) = 0;
|
virtual void addTranslation(glm::vec4 vec) = 0;
|
||||||
virtual void addScaling(glm::vec4 vec) = 0;
|
virtual void addScaling(glm::vec4 vec) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
virtual void removeLastTransformations(int n) = 0;
|
||||||
|
|
||||||
|
virtual glm::vec3 getPosition() = 0;
|
||||||
|
virtual glm::vec4 translateToPivot(glm::vec3) = 0;
|
||||||
|
|
||||||
virtual void draw(ShaderProgram *shader, glm::mat4x4 pv) = 0;
|
virtual void draw(ShaderProgram *shader, glm::mat4x4 pv) = 0;
|
||||||
virtual DrawableType getType() = 0;
|
virtual DrawableType getType() = 0;
|
||||||
};
|
};
|
69
BaseGLProject/LineSegment.cpp
Normal file
69
BaseGLProject/LineSegment.cpp
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#include "LineSegment.h"
|
||||||
|
#define GLM_ENABLE_EXPERIMENTAL
|
||||||
|
#include "glm/gtx/string_cast.hpp"
|
||||||
|
|
||||||
|
void LineSegment::setup()
|
||||||
|
{
|
||||||
|
std::vector<glm::vec3> seg_vertices =
|
||||||
|
{ { .0, -1.0f, .0}, {.0, 1.0f, .0} };
|
||||||
|
|
||||||
|
std::vector<glm::vec3> seg_colors =
|
||||||
|
{ { 1.f, .0, .0}, {1.f, .0, .0} };
|
||||||
|
|
||||||
|
glGenVertexArrays(1, &_vaoHandle);
|
||||||
|
glBindVertexArray(_vaoHandle);
|
||||||
|
|
||||||
|
glGenBuffers(1, &_vbo_vertices);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, _vbo_vertices);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * seg_vertices.size() * 3, seg_vertices.data(), GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glVertexAttribPointer(
|
||||||
|
0, //attr number = 0
|
||||||
|
3,
|
||||||
|
GL_FLOAT,
|
||||||
|
GL_FALSE,
|
||||||
|
0,
|
||||||
|
(void*)0);
|
||||||
|
glEnableVertexAttribArray(0); //attr number = 0
|
||||||
|
|
||||||
|
|
||||||
|
glGenBuffers(1, &_vbo_colors);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, _vbo_colors);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, seg_colors.size() * sizeof(GLfloat) * 3, seg_colors.data(), GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glVertexAttribPointer(
|
||||||
|
1,
|
||||||
|
3,
|
||||||
|
GL_FLOAT,
|
||||||
|
GL_FALSE,
|
||||||
|
0,
|
||||||
|
(void*)0);
|
||||||
|
glEnableVertexAttribArray(1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
LineSegment::LineSegment()
|
||||||
|
{
|
||||||
|
setup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LineSegment::draw(ShaderProgram *shader, glm::mat4x4 pv)
|
||||||
|
{
|
||||||
|
_model.glPushMatrix();
|
||||||
|
effectTransformations();
|
||||||
|
glm::mat4 mvpMatrix = pv * _model.getMatrix();
|
||||||
|
glUniformMatrix4fv(shader->uniform("mvp"), 1, GL_FALSE, glm::value_ptr(mvpMatrix));
|
||||||
|
glLineWidth(4);
|
||||||
|
glBindVertexArray(_vaoHandle);
|
||||||
|
glDrawArrays(GL_LINES, 0, 2);
|
||||||
|
_model.glPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawableType LineSegment::getType()
|
||||||
|
{
|
||||||
|
return DrawableType::LINE_SEGMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
LineSegment::~LineSegment()
|
||||||
|
{
|
||||||
|
}
|
32
BaseGLProject/LineSegment.h
Normal file
32
BaseGLProject/LineSegment.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <glm/vec4.hpp>
|
||||||
|
#include "ADrawable.h"
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
class LineSegment : public ADrawable
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
ADrawable *_start;
|
||||||
|
ADrawable *_end;
|
||||||
|
|
||||||
|
GLuint _vaoHandle;
|
||||||
|
GLuint _iboHandle;
|
||||||
|
GLuint _vbo_vertices, _vbo_colors;
|
||||||
|
|
||||||
|
void setup();
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
LineSegment();
|
||||||
|
|
||||||
|
void draw(ShaderProgram *shader, glm::mat4x4 pv) override;
|
||||||
|
|
||||||
|
DrawableType getType() override;
|
||||||
|
~LineSegment();
|
||||||
|
};
|
@ -61,9 +61,43 @@ void MyGlWindow::setup()
|
|||||||
{
|
{
|
||||||
_shaderProgram = new ShaderProgram();
|
_shaderProgram = new ShaderProgram();
|
||||||
_shaderProgram->initFromFiles("simple.vert", "simple.frag");
|
_shaderProgram->initFromFiles("simple.vert", "simple.frag");
|
||||||
_drawables.emplace_back(new CheckeredFloor(50, 16));
|
_static_drawables.emplace_back(new CheckeredFloor(50, 16));
|
||||||
_drawables.emplace_back(new WireCube());
|
|
||||||
_drawables.back()->addTranslation(glm::vec4(0, 1, 0, 0));
|
_static_drawables.emplace_back(new WireCube());
|
||||||
|
_static_drawables.back()->addTranslation(glm::vec4(0, 1.01, 0, 0));
|
||||||
|
|
||||||
|
_static_drawables.emplace_back(new WireCube());
|
||||||
|
_static_drawables.back()->addTranslation(glm::vec4(0, 3.01, 0, 0));
|
||||||
|
|
||||||
|
_static_drawables.emplace_back(new WireCube());
|
||||||
|
_static_drawables.back()->addTranslation(glm::vec4(0, 5.01, 0, 0));
|
||||||
|
|
||||||
|
_static_drawables.emplace_back(new WireCube());
|
||||||
|
_static_drawables.back()->addTranslation(glm::vec4(0, 7.01, 0, 0));
|
||||||
|
|
||||||
|
_crane_boom.emplace_back(new WireCube());
|
||||||
|
_crane_boom.back()->addTranslation(glm::vec4(0, 9.01, 0, 0));
|
||||||
|
|
||||||
|
_crane_boom.emplace_back(new WireCube());
|
||||||
|
_crane_boom.back()->addTranslation(glm::vec4(-2, 9.01, 0, 0));
|
||||||
|
|
||||||
|
_crane_boom.emplace_back(new WireCube());
|
||||||
|
_crane_boom.back()->addTranslation(glm::vec4(2, 9.01, 0, 0));
|
||||||
|
|
||||||
|
_crane_boom.emplace_back(new WireCube());
|
||||||
|
_crane_boom.back()->addTranslation(glm::vec4(4, 9.01, 0, 0));
|
||||||
|
|
||||||
|
_crane_boom.emplace_back(new WireCube());
|
||||||
|
_crane_boom.back()->addTranslation(glm::vec4(6, 9.01, 0, 0));
|
||||||
|
|
||||||
|
_crane_boom.push_back(new ColorCube());
|
||||||
|
_crane_boom.back()->addTranslation(glm::vec4(8, 7.01, 0, 0));
|
||||||
|
|
||||||
|
_crane_boom.emplace_back(new WireCube());
|
||||||
|
_crane_boom.back()->addTranslation(glm::vec4(8, 9.01, 0, 0));
|
||||||
|
|
||||||
|
_crane_boom.emplace_back(new LineSegment());
|
||||||
|
_crane_boom.back()->addTranslation(glm::vec4(8, 8.01, 0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyGlWindow::setupCubeBuffer()
|
void MyGlWindow::setupCubeBuffer()
|
||||||
@ -122,6 +156,23 @@ void MyGlWindow::setupRectBuffer()
|
|||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MyGlWindow::setViewFromBox(glm::vec3 &eye, glm::vec3 &look, glm::vec3 &up)
|
||||||
|
{
|
||||||
|
glm::vec4 cube_base_position = { 8, 7.01, 0 , 1.0f};
|
||||||
|
Model model;
|
||||||
|
|
||||||
|
cube_base_position.x = 7 - (floatValues["box_horizontal"] * 6);
|
||||||
|
cube_base_position.y = 7 - (floatValues["box_vertical"] * 6);
|
||||||
|
|
||||||
|
model.glPushMatrix();
|
||||||
|
model.glTranslate(-8, 2, 0);
|
||||||
|
model.glRotate(floatValues["boom_rotation"], 0, -1, 0);
|
||||||
|
model.glTranslate(8, -2, 0);
|
||||||
|
|
||||||
|
|
||||||
|
eye = cube_base_position * model.getMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
void MyGlWindow::draw()
|
void MyGlWindow::draw()
|
||||||
{
|
{
|
||||||
glClearColor(_bgColor[0], _bgColor[1], _bgColor[2], 1);
|
glClearColor(_bgColor[0], _bgColor[1], _bgColor[2], 1);
|
||||||
@ -134,14 +185,41 @@ void MyGlWindow::draw()
|
|||||||
glm::vec3 eye(viewer.getViewPoint().x, viewer.getViewPoint().y, viewer.getViewPoint().z);
|
glm::vec3 eye(viewer.getViewPoint().x, viewer.getViewPoint().y, viewer.getViewPoint().z);
|
||||||
glm::vec3 look(viewer.getViewCenter().x, viewer.getViewCenter().y, viewer.getViewCenter().z);
|
glm::vec3 look(viewer.getViewCenter().x, viewer.getViewCenter().y, viewer.getViewCenter().z);
|
||||||
glm::vec3 up(viewer.getUpVector().x, viewer.getUpVector().y, viewer.getUpVector().z);
|
glm::vec3 up(viewer.getUpVector().x, viewer.getUpVector().y, viewer.getUpVector().z);
|
||||||
|
if (view_from_box)
|
||||||
|
setViewFromBox(eye, look, up);
|
||||||
glm::mat4 view = lookAt(eye, look, up); //Calculate view matrix from paramters of m_viewer
|
glm::mat4 view = lookAt(eye, look, up); //Calculate view matrix from paramters of m_viewer
|
||||||
glm::mat4 projection = perspective(45.0f, m_width / m_height, 0.1f, 500.0f);
|
glm::mat4 projection = perspective(45.0f, m_width / m_height, 0.1f, 500.0f);
|
||||||
|
|
||||||
_shaderProgram->addUniform("mvp");
|
_shaderProgram->addUniform("mvp");
|
||||||
|
|
||||||
for (ADrawable *drawable : _drawables)
|
for (ADrawable *drawable : _static_drawables)
|
||||||
{
|
|
||||||
drawable->draw(_shaderProgram, projection * view);
|
drawable->draw(_shaderProgram, projection * view);
|
||||||
|
|
||||||
|
for (ADrawable *drawable : _crane_boom)
|
||||||
|
{
|
||||||
|
glm::vec4 t = drawable->translateToPivot(glm::vec3(0, 9.01, 0));
|
||||||
|
drawable->addRotation(glm::vec4(0, 1, 0, floatValues["boom_rotation"]));
|
||||||
|
drawable->addTranslation(t);
|
||||||
|
|
||||||
|
if (drawable->getType() == COLOR_CUBE)
|
||||||
|
drawable->addTranslation(glm::vec4(floatValues["box_horizontal"] * -6.01,
|
||||||
|
floatValues["box_vertical"] * -6.01, 0 ,0));
|
||||||
|
if (drawable->getType() == LINE_SEGMENT)
|
||||||
|
{
|
||||||
|
drawable->addTranslation(glm::vec4(floatValues["box_horizontal"] * -6.01 , floatValues["box_vertical"] * -4.01, 0, 0));
|
||||||
|
drawable->addScaling(glm::vec4(0, floatValues["box_vertical"] * 4.01, 0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!view_from_box || (drawable->getType() != COLOR_CUBE && drawable->getType() != LINE_SEGMENT))
|
||||||
|
drawable->draw(_shaderProgram, projection * view);
|
||||||
|
|
||||||
|
if (drawable->getType() == COLOR_CUBE)
|
||||||
|
drawable->removeLastTransformations(1);
|
||||||
|
else if (drawable->getType() == LINE_SEGMENT)
|
||||||
|
drawable->removeLastTransformations(2);
|
||||||
|
|
||||||
|
drawable->removeLastTransformations(3);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_shaderProgram->disable();
|
_shaderProgram->disable();
|
||||||
@ -149,7 +227,7 @@ void MyGlWindow::draw()
|
|||||||
|
|
||||||
void MyGlWindow::AddDrawable(ADrawable *d)
|
void MyGlWindow::AddDrawable(ADrawable *d)
|
||||||
{
|
{
|
||||||
_drawables.push_back(d);
|
_static_drawables.push_back(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyGlWindow::resize(int w, int h)
|
void MyGlWindow::resize(int w, int h)
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include "Viewer.h"
|
#include "Viewer.h"
|
||||||
#include "CheckeredFloor.h"
|
#include "CheckeredFloor.h"
|
||||||
#include "WireCube.h"
|
#include "WireCube.h"
|
||||||
|
#include "LineSegment.h"
|
||||||
|
|
||||||
struct vertexAttr {
|
struct vertexAttr {
|
||||||
GLfloat posX, posY, posZ;
|
GLfloat posX, posY, posZ;
|
||||||
@ -26,7 +27,8 @@ public:
|
|||||||
void draw();
|
void draw();
|
||||||
void setBgColor(float bgColor[3]);
|
void setBgColor(float bgColor[3]);
|
||||||
|
|
||||||
float cubeRotation = .0f;
|
std::map<std::string, float> floatValues;
|
||||||
|
bool view_from_box = false;
|
||||||
void AddDrawable(ADrawable *);
|
void AddDrawable(ADrawable *);
|
||||||
void resize(int w, int h);
|
void resize(int w, int h);
|
||||||
Viewer viewer;
|
Viewer viewer;
|
||||||
@ -43,10 +45,12 @@ private:
|
|||||||
GLuint _vaoHandle;
|
GLuint _vaoHandle;
|
||||||
GLuint _iboHandle;
|
GLuint _iboHandle;
|
||||||
|
|
||||||
|
std::vector<ADrawable *> _static_drawables;
|
||||||
|
|
||||||
std::vector<ADrawable *> _drawables;
|
std::vector<ADrawable *> _crane_boom;
|
||||||
|
|
||||||
void setup();
|
void setup();
|
||||||
void setupRectBuffer();
|
void setupRectBuffer();
|
||||||
void setupCubeBuffer();
|
void setupCubeBuffer();
|
||||||
|
void setViewFromBox(glm::vec3 &eye, glm::vec3 &look, glm::vec3 &up);
|
||||||
};
|
};
|
||||||
|
@ -173,18 +173,26 @@ int loop(GLFWwindow *window)
|
|||||||
|
|
||||||
if (ImGui::Begin("First Window"))
|
if (ImGui::Begin("First Window"))
|
||||||
{
|
{
|
||||||
ImGui::SetWindowSize(ImVec2(350, 150));
|
|
||||||
ImGui::SetWindowPos(ImVec2(20, 20));
|
ImGui::SetWindowPos(ImVec2(20, 20));
|
||||||
|
|
||||||
ImGui::Text("WannaQuit ?");
|
static float box_horizontal = .0f;
|
||||||
if (ImGui::Button("Yes"))
|
ImGui::SliderFloat("Box Horizontal", &box_horizontal, 0, 1);
|
||||||
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
glWin.floatValues["box_horizontal"] = box_horizontal;
|
||||||
|
|
||||||
static float rotation = .0f;
|
static float box_vertical = .0f;
|
||||||
ImGui::SliderFloat("Volume", &rotation, 0.0f, 360.0f);
|
ImGui::SliderFloat("Box Vertical", &box_vertical, 0, 1);
|
||||||
glWin.cubeRotation = rotation;
|
glWin.floatValues["box_vertical"] = box_vertical;
|
||||||
|
|
||||||
static float bgColor[3] = { .0f, .0f, .0f };
|
static float boom_rotation = .0f;
|
||||||
|
ImGui::SliderFloat("Boom rotation", &boom_rotation, -180, 180);
|
||||||
|
glWin.floatValues["boom_rotation"] = boom_rotation;
|
||||||
|
|
||||||
|
static int box_view;
|
||||||
|
ImGui::RadioButton("Default", &box_view, 0); ImGui::SameLine();
|
||||||
|
ImGui::RadioButton("Box", &box_view, 1);
|
||||||
|
glWin.view_from_box = box_view;
|
||||||
|
|
||||||
|
static float bgColor[3] = { .3f, .3f, .3f };
|
||||||
ImGui::ColorEdit3("Background", bgColor, 0);
|
ImGui::ColorEdit3("Background", bgColor, 0);
|
||||||
glWin.setBgColor(bgColor);
|
glWin.setBgColor(bgColor);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user