mirror of
https://github.com/Ed94/DuctTaped_GL.git
synced 2024-12-21 22:44:47 -08:00
Added half cut tape.
This commit is contained in:
parent
5c0f8bf079
commit
3bda314253
802
Assignment_1_Execution.hpp
Normal file
802
Assignment_1_Execution.hpp
Normal file
@ -0,0 +1,802 @@
|
||||
/*
|
||||
Title : Execution
|
||||
Author: Edward R. Gonzalez
|
||||
|
||||
Description:
|
||||
This brings together the functionality I made in DGL and the Actions libraries to produce an OpenGL Workspace.
|
||||
|
||||
Currently the workspace is heavily hardcoded and has one light rotating around the specified object. The material for the object is set during prep as well.
|
||||
|
||||
All exposed library references are inside the inline namespace right after declaring the namespace execution.
|
||||
|
||||
After I have the global objects used, followed by the functionality implementations, and at the very end the main function running the default execution implementation.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
// DGL
|
||||
#include "DGL/DGL.hpp"
|
||||
|
||||
// Utility
|
||||
#include "Actions.hpp"
|
||||
|
||||
// Non-Standard C++
|
||||
#include "Cpp_Alias.hpp"
|
||||
|
||||
|
||||
|
||||
namespace Execution
|
||||
{
|
||||
inline namespace LibraryReferences
|
||||
{
|
||||
// DGL
|
||||
|
||||
using DGL::EAxis ;
|
||||
using DGL::EBool ;
|
||||
using DGL::ECursorMode ;
|
||||
using DGL::EDirection ;
|
||||
using DGL::EFrameBuffer ;
|
||||
using DGL::EKeyCodes ;
|
||||
using DGL::EMouseMode ;
|
||||
using DGL::EPrimitives ;
|
||||
using DGL::ERotationAxis;
|
||||
|
||||
using DGL::Camera ;
|
||||
using DGL::Entity_Basic ;
|
||||
using DGL::gFloat ;
|
||||
using DGL::Light_Basic ;
|
||||
using DGL::LinearColor ;
|
||||
using DGL::Material_Phong;
|
||||
using DGL::Matrix ;
|
||||
using DGL::Matrix4x4 ;
|
||||
using DGL::Model ;
|
||||
using DGL::TimeValDec ;
|
||||
using DGL::Vector3 ;
|
||||
using DGL::Window ;
|
||||
|
||||
using DGL::BindVertexArray ;
|
||||
using DGL::CanUseRawMouse ;
|
||||
using DGL::ClearBuffer ;
|
||||
using DGL::CreateWindow ;
|
||||
using DGL::DestoryWindow ;
|
||||
using DGL::DisableVertexAttributeArray;
|
||||
using DGL::EnableDepth ;
|
||||
using DGL::EnableVertexAttributeArray ;
|
||||
using DGL::GetCursorPosition ;
|
||||
using DGL::GetTime ;
|
||||
using DGL::InitalizeGLEW ;
|
||||
using DGL::InitalizeGLFW ;
|
||||
using DGL::LoadDefaultShaders ;
|
||||
using DGL::KeyPressed ;
|
||||
using DGL::NotShared ;
|
||||
using DGL::PollEvents ;
|
||||
using DGL::ResetCursor ;
|
||||
using DGL::SetClearColor ;
|
||||
using DGL::SetCurrentContext ;
|
||||
using DGL::SetInputMode ;
|
||||
using DGL::SetPolygonMode ;
|
||||
using DGL::SetUniformVariable_MVA ;
|
||||
using DGL::SetWindowHeader ;
|
||||
using DGL::SwapBuffers ;
|
||||
using DGL::UseProgramShader ;
|
||||
using DGL::TerminateGLFW ;
|
||||
using DGL::WindowedMode ;
|
||||
|
||||
using DGL::DefaultSpace::ScreenWidth ;
|
||||
using DGL::DefaultSpace::ScreenHeight ;
|
||||
using DGL::DefaultSpace::ScreenCenterHeight;
|
||||
using DGL::DefaultSpace::ScreenCenterWidth ;
|
||||
using DGL::DefaultSpace::Screenspace ;
|
||||
using DGL::DefaultSpace::WorldCamera ;
|
||||
|
||||
using DGL::DefaultSpace::UpdateScreenspace;
|
||||
|
||||
// Actions
|
||||
|
||||
using Actions::ActionQueue;
|
||||
}
|
||||
|
||||
enum class EModels
|
||||
{
|
||||
Bunny ,
|
||||
Eight ,
|
||||
Gargoyle ,
|
||||
Hand ,
|
||||
Horse ,
|
||||
Sculpture,
|
||||
Topology ,
|
||||
Torus
|
||||
};
|
||||
|
||||
|
||||
// Globals
|
||||
|
||||
// Assignment 1
|
||||
|
||||
bool Exist = true; // Determines if the the execution should exit cycler.
|
||||
|
||||
TimeValDec CycleStart , // Snapshot of cycle loop start time.
|
||||
CycleEnd , // Snapshot of cycle loop end time.
|
||||
DeltaTime , // Delta between last cycle start and end.
|
||||
InputInterval = 1.0f / 60.0f, // Interval per second to complete the input process of the cycle.
|
||||
PhysicsInterval = 1.0f / 60.0f, // Interval per second to complete the physics process of the cycle.
|
||||
RenderInterval = 1.0f / 60.0f ; // Interval per second to complete the render process of the cycle.
|
||||
|
||||
Window* DefaultWindow; // Default window to use for execution.
|
||||
|
||||
double CursorX, CursorY; // Cursor axis position on the window.
|
||||
|
||||
bool CursorOff = true,
|
||||
ShowLight = true,
|
||||
RotateObj = true,
|
||||
OrbitLight = true ;
|
||||
|
||||
gFloat CamMoveSpeed = 7.0f, // Rate at which the camera should move.
|
||||
CamRotationSpeed = 27.0f ; // Rate at which the camera should rotate.
|
||||
|
||||
TimeValDec InputDelta = 0.0, // Current delta since last input process.
|
||||
PhysicsDelta = 0.0, // Current delta since last physics process.
|
||||
RenderDelta = 0.0 ; // Current delta since last render process.
|
||||
|
||||
ActionQueue ActionsToComplete; // Actions queue to run during the physics process of the cycle.
|
||||
|
||||
EModels CurrentModel = EModels::Bunny;
|
||||
|
||||
Model Bunny ("./Models/bunny.obj" );
|
||||
Model Eight ("./Models/eight.obj" );
|
||||
Model Gargoyle ("./Models/gargoyle.obj" );
|
||||
Model Hand ("./Models/hand.obj" );
|
||||
Model Horse ("./Models/horse.obj" );
|
||||
Model Sculpture("./Models/sculpture.obj" );
|
||||
Model Topology ("./Models/topology.obj" );
|
||||
Model Torus ("./Models/Torus.obj" );
|
||||
|
||||
DGL::HE_Model BlenderTorus("./Models/torus_Blender.obj");
|
||||
|
||||
Material_Phong ObjectMaterial; // Material to use on the model.
|
||||
|
||||
Light_Basic Light ; // Hardcoded light. Rotates around object.
|
||||
Entity_Basic ObjectToView; // Object that will be currently in the middle with the light source rotating.
|
||||
|
||||
string
|
||||
windowTitle = "Assignment 1" ,
|
||||
deltaStr = "Delta: " ,
|
||||
inputDeltaStr = "Input Delta: " ,
|
||||
physicsDeltaStr = "Physics Delta: " ,
|
||||
renderDeltaStr = "RenderDeltaStr: " ;
|
||||
|
||||
stringstream WindowTitle;
|
||||
|
||||
// Functionality
|
||||
|
||||
// Input Action functions...
|
||||
|
||||
void ChangeModel()
|
||||
{
|
||||
if (CurrentModel == EModels::Torus)
|
||||
{
|
||||
CurrentModel = EModels::Bunny;
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentModel = EModels(int(CurrentModel) + 1);
|
||||
}
|
||||
|
||||
switch (CurrentModel)
|
||||
{
|
||||
case EModels::Bunny:
|
||||
{
|
||||
if (not Bunny.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Bunny...");
|
||||
|
||||
Bunny.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Bunny);
|
||||
|
||||
ObjectToView.SetScale(4.0f);
|
||||
|
||||
ObjectToView.SetPosition(Vector3(-0.05, -4.4f, 0));
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::White.Vector();
|
||||
ObjectMaterial.Ambience = 0.300f ;
|
||||
ObjectMaterial.Diffuse = 1.000f ;
|
||||
ObjectMaterial.Specular = 0.910f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Eight:
|
||||
{
|
||||
if (not Eight.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Eight...");
|
||||
|
||||
Eight.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Eight);
|
||||
|
||||
ObjectToView.SetScale(2.0f);
|
||||
|
||||
ObjectToView.SetPosition(Vector3(0, -1.0, 0));
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::Blue.Vector();
|
||||
ObjectMaterial.Ambience = 0.112f ;
|
||||
ObjectMaterial.Diffuse = 0.828f ;
|
||||
ObjectMaterial.Specular = 0.421f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Gargoyle:
|
||||
{
|
||||
if (not Gargoyle.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Gargoyle...");
|
||||
|
||||
Gargoyle.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Gargoyle);
|
||||
|
||||
ObjectToView.SetPosition(Vector3(-1, -5.4f, 0));
|
||||
|
||||
ObjectToView.SetScale(6.0f);
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::Red.Vector();
|
||||
ObjectMaterial.Ambience = 0.001f ;
|
||||
ObjectMaterial.Diffuse = 0.658f ;
|
||||
ObjectMaterial.Specular = 0.821f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Hand:
|
||||
{
|
||||
if (not Hand.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Hand...");
|
||||
|
||||
Hand.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Hand);
|
||||
|
||||
ObjectToView.SetScale(0.03f);
|
||||
|
||||
ObjectToView.SetPosition(Vector3(0, -1.1f, 0));
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::DarkTone.Vector();
|
||||
ObjectMaterial.Ambience = 0.000f ;
|
||||
ObjectMaterial.Diffuse = 1.000f ;
|
||||
ObjectMaterial.Specular = 0.640f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
SetClearColor(LinearColor(0.53f, 0.53f, 0.53f, 1.0f));
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Horse:
|
||||
{
|
||||
if (not Horse.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Horse...");
|
||||
|
||||
Horse.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Horse);
|
||||
|
||||
ObjectToView.SetScale(20.0f);
|
||||
|
||||
ObjectToView.Rotate(90.0f, EAxis::X);
|
||||
|
||||
ObjectToView.SetPosition(Vector3(0, 0.0f, 0));
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::Green.Vector();
|
||||
ObjectMaterial.Ambience = 0.000f ;
|
||||
ObjectMaterial.Diffuse = 1.000f ;
|
||||
ObjectMaterial.Specular = 0.640f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
SetClearColor(LinearColor(0.02f, 0.02f, 0.02f, 1.0f));
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Sculpture:
|
||||
{
|
||||
if (not Sculpture.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Sculpture...");
|
||||
|
||||
Sculpture.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Sculpture);
|
||||
|
||||
ObjectToView.SetScale(0.01f);
|
||||
|
||||
ObjectToView.Rotate(-90.0f, EAxis::X);
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::WarmSphia.Vector();
|
||||
ObjectMaterial.Ambience = 0.112f ;
|
||||
ObjectMaterial.Diffuse = 0.928f ;
|
||||
ObjectMaterial.Specular = 0.21f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Topology:
|
||||
{
|
||||
if (not Topology.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Topology...");
|
||||
|
||||
Topology.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Topology);
|
||||
|
||||
ObjectToView.SetScale(0.2f);
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::Coral.Vector();
|
||||
ObjectMaterial.Ambience = 0.212f ;
|
||||
ObjectMaterial.Diffuse = 0.728f ;
|
||||
ObjectMaterial.Specular = 0.41f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Torus:
|
||||
{
|
||||
if (not Torus.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Torus...");
|
||||
|
||||
Torus.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Torus);
|
||||
|
||||
ObjectToView.SetScale(1.0f);
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::Grey.Vector();
|
||||
ObjectMaterial.Ambience = 0.170f ;
|
||||
ObjectMaterial.Diffuse = 0.720f ;
|
||||
ObjectMaterial.Specular = 0.100f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ToggleLight()
|
||||
{
|
||||
ShowLight ? ShowLight = false : ShowLight = true;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void ToggleModelRotation()
|
||||
{
|
||||
RotateObj ? RotateObj = false : RotateObj = true;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void ToogleLightOrbit()
|
||||
{
|
||||
OrbitLight ? OrbitLight = false : OrbitLight = true;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void RotateCamera(ERotationAxis _rotationAxis, gFloat _rotationAmount, double _delta)
|
||||
{
|
||||
WorldCamera.Rotate(_rotationAxis, _rotationAmount, gFloat(_delta));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void MoveCamera(EDirection _direction, gFloat _translationAmount, double _delta)
|
||||
{
|
||||
WorldCamera.Move(_direction, _translationAmount, gFloat(_delta));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void ModifyCamSpeed(bool _isPositive, double _delta)
|
||||
{
|
||||
if (_isPositive)
|
||||
{
|
||||
CamMoveSpeed += CamMoveSpeed * gFloat(_delta);
|
||||
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
CamMoveSpeed -= CamMoveSpeed * gFloat(_delta);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// End of common input functions...
|
||||
|
||||
|
||||
void UpdateWindowDeltaTitle()
|
||||
{
|
||||
WindowTitle.str("");
|
||||
|
||||
WindowTitle
|
||||
<< windowTitle << " "
|
||||
<< deltaStr << DeltaTime << " "
|
||||
<< inputDeltaStr << InputDelta << " "
|
||||
<< physicsDeltaStr << PhysicsDelta << " "
|
||||
<< renderDeltaStr << RenderDelta ;
|
||||
}
|
||||
|
||||
|
||||
// Currently Does everything required before entering the cycler.
|
||||
void PrepWorkspace()
|
||||
{
|
||||
// Baseline
|
||||
|
||||
InitalizeGLFW();
|
||||
|
||||
DefaultWindow = CreateWindow(ScreenWidth, ScreenHeight, "Assignment 1: Loading Model...", WindowedMode(), NotShared());
|
||||
|
||||
SetCurrentContext(DefaultWindow);
|
||||
|
||||
InitalizeGLEW(); // Glew must initialize only after a context is set.
|
||||
|
||||
EnableDepth();
|
||||
|
||||
SetPolygonMode(DGL::EFace::Front_and_Back, DGL::ERenderMode::Fill);
|
||||
|
||||
|
||||
// Cursor stuff
|
||||
|
||||
SetInputMode(DefaultWindow, DGL::EMouseMode::Cursor, DGL::ECursorMode::Disable);
|
||||
|
||||
ResetCursor(DefaultWindow, ScreenCenterWidth, ScreenCenterHeight);
|
||||
|
||||
if (CanUseRawMouse())
|
||||
{
|
||||
SetInputMode(DefaultWindow, DGL::EMouseMode::RawMouse, DGL::EBool::True);
|
||||
}
|
||||
|
||||
// End of cursor stuff...
|
||||
|
||||
|
||||
// Shaders
|
||||
|
||||
LoadDefaultShaders();
|
||||
}
|
||||
|
||||
void SetupEntities()
|
||||
{
|
||||
Light.Load();
|
||||
|
||||
Bunny.Load();
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::White.Vector();
|
||||
ObjectMaterial.Ambience = 0.300f;
|
||||
ObjectMaterial.Diffuse = 1.000f;
|
||||
ObjectMaterial.Specular = 0.910f;
|
||||
|
||||
ObjectToView = Entity_Basic(Bunny, ObjectMaterial);
|
||||
|
||||
ObjectToView.SetScale(4.0f);
|
||||
|
||||
ObjectToView.SetPosition(Vector3(-0.05, -4.4f, 0));
|
||||
}
|
||||
|
||||
/*
|
||||
Cycles the process of what to do while a window is open.
|
||||
|
||||
The input, physics, and render procedures can be specified with extra functionality by specifying delegates to those procedures.
|
||||
|
||||
Cycler is hardcoded to exit if escape key is pressed.
|
||||
*/
|
||||
void Cycler(const function< void(Window*)>& _inputProcedure, const function< void()>& _physicsProcedure, const function< void()>& _renderProcedure)
|
||||
{
|
||||
while (Exist)
|
||||
{
|
||||
CycleStart = GetTime();
|
||||
|
||||
if (InputDelta >= InputInterval)
|
||||
{
|
||||
PollEvents();
|
||||
|
||||
if (KeyPressed(DefaultWindow, EKeyCodes::Escape))
|
||||
{
|
||||
Exist = false;
|
||||
}
|
||||
|
||||
GetCursorPosition(DefaultWindow, &CursorX, &CursorY);
|
||||
|
||||
_inputProcedure(DefaultWindow);
|
||||
|
||||
if (CursorOff)
|
||||
{
|
||||
ResetCursor(DefaultWindow, ScreenCenterWidth, ScreenCenterHeight);
|
||||
}
|
||||
}
|
||||
|
||||
if (PhysicsDelta >= PhysicsInterval)
|
||||
{
|
||||
while (ActionsToComplete.HasAction())
|
||||
{
|
||||
ActionsToComplete.DoNextAction();
|
||||
}
|
||||
|
||||
_physicsProcedure();
|
||||
|
||||
PhysicsDelta = 0.0;
|
||||
}
|
||||
|
||||
if (RenderDelta >= RenderInterval)
|
||||
{
|
||||
ClearBuffer(EFrameBuffer::Color, EFrameBuffer::Depth);
|
||||
|
||||
_renderProcedure();
|
||||
|
||||
SwapBuffers(DefaultWindow);
|
||||
|
||||
RenderDelta = 0.0;
|
||||
}
|
||||
|
||||
if (InputDelta >= InputInterval)
|
||||
{
|
||||
InputDelta = 0.0;
|
||||
}
|
||||
|
||||
CycleEnd = GetTime();
|
||||
|
||||
DeltaTime = CycleEnd - CycleStart;
|
||||
|
||||
InputDelta += DeltaTime;
|
||||
PhysicsDelta += DeltaTime;
|
||||
RenderDelta += DeltaTime;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Input functionality delegates (These are made due to a limitation with the actions implementation).
|
||||
|
||||
auto ChangeModelDelegate = function<decltype(ChangeModel )>(ChangeModel );
|
||||
auto ToogleLightDelegate = function<decltype(ToggleLight )>(ToggleLight );
|
||||
auto ToggleModelRotationDelegate = function<decltype(ToggleModelRotation)>(ToggleModelRotation);
|
||||
auto ToggleLightOrbitDelegate = function<decltype(ToogleLightOrbit )>(ToogleLightOrbit );
|
||||
auto RotateCamDelegate = function<decltype(RotateCamera )>(RotateCamera );
|
||||
auto MoveCamDelegate = function<decltype(MoveCamera )>(MoveCamera );
|
||||
auto ModifyCamSpeedDelegate = function<decltype(ModifyCamSpeed )>(ModifyCamSpeed );
|
||||
auto SetPolyModeDelegate = function<decltype(SetPolygonMode )>(SetPolygonMode );
|
||||
|
||||
void InputProcedure(Window* _currentWindowContext)
|
||||
{
|
||||
static bool F1_Held = false,
|
||||
F4_Held = false,
|
||||
F5_Held = false,
|
||||
H_Held = false,
|
||||
M_Held = false ;
|
||||
|
||||
if (!KeyPressed(_currentWindowContext, EKeyCodes::F1)) F1_Held = false;
|
||||
if (!KeyPressed(_currentWindowContext, EKeyCodes::F4)) F4_Held = false;
|
||||
if (!KeyPressed(_currentWindowContext, EKeyCodes::F5)) F5_Held = false;
|
||||
if (!KeyPressed(_currentWindowContext, EKeyCodes::H )) H_Held = false;
|
||||
if (!KeyPressed(_currentWindowContext, EKeyCodes::M )) M_Held = false;
|
||||
|
||||
// TODO: Not necessary for now and throws memory error.
|
||||
/*if (KeyPressed(_currentWindowContext, EKeyCodes::F1) && not F1_Held)
|
||||
{
|
||||
ECursorMode cursorMode = ECursorMode(GetMouseInputMode(DefaultWindow, EMouseMode::Cursor));
|
||||
|
||||
auto delegate = function<decltype(SetInputMode<ECursorMode>)>(SetInputMode<ECursorMode>);
|
||||
auto delegateRaw = function<decltype(SetInputMode<EBool >)>(SetInputMode<EBool >);
|
||||
|
||||
if (cursorMode == ECursorMode::Normal || cursorMode == ECursorMode::Hidden)
|
||||
{
|
||||
ActionsToComplete.AddToQueue(delegate , _currentWindowContext, EMouseMode::Cursor , ECursorMode::Disable);
|
||||
ActionsToComplete.AddToQueue(delegateRaw, _currentWindowContext, EMouseMode::RawMouse, EBool ::True );
|
||||
|
||||
CursorOff = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ActionsToComplete.AddToQueue(delegate , _currentWindowContext, EMouseMode::Cursor , ECursorMode::Normal);
|
||||
ActionsToComplete.AddToQueue(delegateRaw, _currentWindowContext, EMouseMode::RawMouse, EBool ::False );
|
||||
|
||||
CursorOff = false;
|
||||
}
|
||||
|
||||
F1_Held = true;
|
||||
}*/
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::H) && not H_Held)
|
||||
{
|
||||
H_Held = true;
|
||||
|
||||
ActionsToComplete.AddToQueue(ToogleLightDelegate);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::M) && not M_Held)
|
||||
{
|
||||
M_Held = true;
|
||||
|
||||
ActionsToComplete.AddToQueue(ChangeModelDelegate);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::UpArrow))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(ModifyCamSpeedDelegate, true, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeysPressed(_currentWindowContext, EKeyCodes::DnArrow))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(ModifyCamSpeedDelegate, false, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::F2))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(SetPolyModeDelegate, DGL::EFace::Front_and_Back, DGL::ERenderMode::Line);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::F3))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(SetPolyModeDelegate, DGL::EFace::Front_and_Back, DGL::ERenderMode::Fill);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::F4) && not F4_Held)
|
||||
{
|
||||
ActionsToComplete.AddToQueue(ToggleModelRotationDelegate);
|
||||
|
||||
F4_Held = true;
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::F5) && not F5_Held)
|
||||
{
|
||||
ActionsToComplete.AddToQueue(ToggleLightOrbitDelegate);
|
||||
|
||||
F5_Held = true;
|
||||
}
|
||||
|
||||
if (CursorOff)
|
||||
{
|
||||
if (CursorX != 0)
|
||||
{
|
||||
ActionsToComplete.AddToQueue(RotateCamDelegate, ERotationAxis::Yaw, gFloat(CursorX) * CamRotationSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (CursorY != 0)
|
||||
{
|
||||
ActionsToComplete.AddToQueue(RotateCamDelegate, ERotationAxis::Pitch, gFloat(CursorY) * CamRotationSpeed, PhysicsDelta);
|
||||
}
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::E))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(MoveCamDelegate, EDirection::Up, CamMoveSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::Q))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(MoveCamDelegate, EDirection::Down, CamMoveSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::A))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(MoveCamDelegate, EDirection::Left, CamMoveSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::D))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(MoveCamDelegate, EDirection::Right, CamMoveSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::W))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(MoveCamDelegate, EDirection::Forward, CamMoveSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::S))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(MoveCamDelegate, EDirection::Backward, CamMoveSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::I))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(RotateCamDelegate, ERotationAxis::Pitch, -6.0f * CamRotationSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::K))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(RotateCamDelegate, ERotationAxis::Pitch, 6.0f * CamRotationSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::J))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(RotateCamDelegate, ERotationAxis::Yaw, -6.0f * CamRotationSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::L))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(RotateCamDelegate, ERotationAxis::Yaw, 6.0f * CamRotationSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void PhysicsProcedure()
|
||||
{
|
||||
WorldCamera.UpdateCamera();
|
||||
|
||||
UpdateScreenspace();
|
||||
|
||||
if (OrbitLight)
|
||||
{
|
||||
Light.Update(gFloat(PhysicsDelta));
|
||||
}
|
||||
|
||||
if (RotateObj)
|
||||
{
|
||||
ObjectToView.Rotate(-1.0f * gFloat(PhysicsDelta), EAxis::Y);
|
||||
}
|
||||
|
||||
ObjectToView.Update();
|
||||
|
||||
UpdateWindowDeltaTitle();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void RenderProcedure()
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, WindowTitle.str());
|
||||
|
||||
if (ShowLight)
|
||||
{
|
||||
Light.Render(WorldCamera.Perspective, WorldCamera.Viewport);
|
||||
}
|
||||
|
||||
ObjectToView.Render(WorldCamera.Perspective, WorldCamera.Viewport, Light.GetPosition(), Light.GetColor());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Runtime Execution: Default Execution
|
||||
|
||||
int Execute_Assignment1()
|
||||
{
|
||||
PrepWorkspace();
|
||||
|
||||
SetupEntities();
|
||||
|
||||
Cycler(InputProcedure, PhysicsProcedure, RenderProcedure);
|
||||
|
||||
// TODO: There should be more to properly close...
|
||||
|
||||
DestoryWindow(DefaultWindow);
|
||||
|
||||
TerminateGLFW();
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
}
|
33
Assignment_2_Execution.hpp
Normal file
33
Assignment_2_Execution.hpp
Normal file
@ -0,0 +1,33 @@
|
||||
#pragma once
|
||||
|
||||
#include "DGL/DGL.hpp"
|
||||
|
||||
#include "Cpp_Alias.hpp"
|
||||
|
||||
|
||||
|
||||
namespace Execution
|
||||
{
|
||||
inline namespace LibraryReferences
|
||||
{
|
||||
using DGL::HE_Model;
|
||||
}
|
||||
|
||||
|
||||
int Execute_Assignment2()
|
||||
{
|
||||
cout << "Assignment 2:" << endl << endl;
|
||||
|
||||
HE_Model BlenderTorus("./Models/torus_Blender.obj");
|
||||
|
||||
BlenderTorus.Load();
|
||||
|
||||
|
||||
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -74,3 +74,8 @@ using std::thread;
|
||||
using std::tuple;
|
||||
|
||||
using std::type_index;
|
||||
|
||||
using std::vector;
|
||||
|
||||
|
||||
void DoNothing() {};
|
||||
|
@ -212,6 +212,7 @@ namespace DGL
|
||||
rotation (Vector3(0.0f) ),
|
||||
scale (Vector3(1.0f) ),
|
||||
model (NULL ),
|
||||
he_Model (NULL ),
|
||||
transform(CoordSpace(1.0f))
|
||||
{};
|
||||
|
||||
@ -220,6 +221,18 @@ namespace DGL
|
||||
rotation (Vector3(0.0f) ),
|
||||
scale (Vector3(1.0f) ),
|
||||
model (&_model ),
|
||||
he_Model (NULL ),
|
||||
transform(CoordSpace(1.0f)),
|
||||
material (_material )
|
||||
//type (_type )
|
||||
{};
|
||||
|
||||
Entity_Basic(HE_Model& _model, Material_Phong& _material) :
|
||||
position (Vector3(0.0f) ),
|
||||
rotation (Vector3(0.0f) ),
|
||||
scale (Vector3(1.0f) ),
|
||||
model (NULL ),
|
||||
he_Model (&_model ),
|
||||
transform(CoordSpace(1.0f)),
|
||||
material (_material )
|
||||
//type (_type )
|
||||
@ -234,9 +247,18 @@ namespace DGL
|
||||
{
|
||||
model = &_model;
|
||||
|
||||
he_Model = NULL;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void SetModel(HE_Model& _model)
|
||||
{
|
||||
he_Model = &_model;
|
||||
|
||||
model = NULL;
|
||||
}
|
||||
|
||||
void SetScale(gFloat _scaleBy)
|
||||
{
|
||||
scale = Vector3(_scaleBy);
|
||||
@ -295,7 +317,14 @@ namespace DGL
|
||||
{
|
||||
PhongShader::Use(_projection, _viewport, transform, _lightPosition,_lightColor, material);
|
||||
|
||||
if (model != NULL)
|
||||
{
|
||||
(*model).Render();
|
||||
}
|
||||
else
|
||||
{
|
||||
(*he_Model).Render();
|
||||
}
|
||||
|
||||
PhongShader::Stop();
|
||||
|
||||
@ -307,6 +336,7 @@ namespace DGL
|
||||
position = _entity.position ;
|
||||
scale = _entity.scale ;
|
||||
model = _entity.model ;
|
||||
he_Model = _entity.he_Model ;
|
||||
transform = _entity.transform;
|
||||
material = _entity.material ;
|
||||
|
||||
@ -321,6 +351,7 @@ namespace DGL
|
||||
Vector3 rotation ;
|
||||
Vector3 scale ;
|
||||
Model* model ;
|
||||
HE_Model* he_Model;
|
||||
CoordSpace transform;
|
||||
Material_Phong material ;
|
||||
};
|
||||
|
@ -13,6 +13,9 @@ Allows the management of loading and buffer/rendering models from wavefront obj
|
||||
#include "DGL_Types.hpp"
|
||||
#include "DGL_Space.hpp"
|
||||
|
||||
// OpenMesh
|
||||
#include "OMesh/OMeshInterface.hpp"
|
||||
|
||||
// Non-Standard C++
|
||||
#include "Cpp_Alias.hpp"
|
||||
|
||||
@ -69,17 +72,6 @@ namespace DGL
|
||||
ComponentList comp;
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct Face
|
||||
{
|
||||
Vec3Int Vertexes;
|
||||
};
|
||||
|
||||
using FaceList = std::vector<Face>;
|
||||
|
||||
|
||||
|
||||
struct FaceGenerator
|
||||
{
|
||||
using ComponentList = std::vector< gUInt>;
|
||||
@ -107,7 +99,7 @@ namespace DGL
|
||||
|
||||
for (int index = 0; index < 3; index++)
|
||||
{
|
||||
generated.Vertexes.vec[index] = vertIndexes[index];
|
||||
generated.vec[index] = vertIndexes[index];
|
||||
|
||||
if (index < 2)
|
||||
{
|
||||
@ -146,9 +138,9 @@ namespace DGL
|
||||
|
||||
for (int faceIndex = 0; faceIndex < faces.size(); faceIndex++)
|
||||
{
|
||||
int vertexIndex1 = faces[faceIndex].Vertexes.vec[0],
|
||||
vertexIndex2 = faces[faceIndex].Vertexes.vec[1],
|
||||
vertexIndex3 = faces[faceIndex].Vertexes.vec[2] ;
|
||||
int vertexIndex1 = faces[faceIndex].vec[0],
|
||||
vertexIndex2 = faces[faceIndex].vec[1],
|
||||
vertexIndex3 = faces[faceIndex].vec[2] ;
|
||||
|
||||
Vector3 vert1 = verticies[vertexIndex1],
|
||||
vert2 = verticies[vertexIndex2],
|
||||
@ -470,4 +462,125 @@ namespace DGL
|
||||
FaceList faces ;
|
||||
VIndexList indicies ;
|
||||
};
|
||||
|
||||
class HE_Model
|
||||
{
|
||||
using HE_Mesh = OMeshInterface::OMesh_HE;
|
||||
|
||||
public:
|
||||
HE_Model(const string& _filePath) :
|
||||
loaded (false ),
|
||||
vertexArrayID (-1 ),
|
||||
vertexBufferID (-1 ),
|
||||
normalBuffferID(-1 ),
|
||||
textureBufferID(-1 ),
|
||||
elementBufferID(-1 ),
|
||||
filePath (_filePath),
|
||||
mesh ()
|
||||
{}
|
||||
|
||||
void Buffer()
|
||||
{
|
||||
// Generate buffers
|
||||
|
||||
GenerateVertexBuffers(vertexArrayID , 1);
|
||||
GenerateBuffers (vertexBufferID , 1);
|
||||
GenerateBuffers (normalBuffferID, 1);
|
||||
GenerateBuffers (elementBufferID, 1);
|
||||
|
||||
BindVertexArray(vertexArrayID);
|
||||
|
||||
// Vertex Position Buffering
|
||||
|
||||
BindBuffer(EBufferTarget::VertexAttributes, vertexBufferID);
|
||||
|
||||
const VertexList& verts = mesh.GetVerticies();
|
||||
|
||||
BufferData(verts[0], gSize(verts.size() * sizeof(Vector3)), EBufferTarget::VertexAttributes, EBufferUsage::StaticDraw);
|
||||
|
||||
FormatVertexAttributes<Vector3>(0, EDataType::Float, ZeroOffset(), 3, false);
|
||||
|
||||
EnableVertexAttributeArray(0);
|
||||
|
||||
// Normal Buffering
|
||||
|
||||
BindBuffer(EBufferTarget::VertexAttributes, normalBuffferID);
|
||||
|
||||
const VertexList& normals = mesh.GetFaceNormals();
|
||||
|
||||
BufferData(normals[0], gSize(normals.size() * sizeof(Vector3)), EBufferTarget::VertexAttributes, EBufferUsage::StaticDraw);
|
||||
|
||||
FormatVertexAttributes<Vector3>(1, EDataType::Float, ZeroOffset(), 3, false);
|
||||
|
||||
EnableVertexAttributeArray(1);
|
||||
|
||||
// Element Buffering
|
||||
|
||||
const FaceList& faces = mesh.GetFaces();
|
||||
|
||||
BindBuffer(EBufferTarget::VertexIndices, elementBufferID);
|
||||
|
||||
BufferData(faces[0], gSize(faces.size() * sizeof(Face)), EBufferTarget::VertexIndices, EBufferUsage::StaticDraw);
|
||||
|
||||
UnbindVertexArray(); // Unbind vertex array.
|
||||
}
|
||||
|
||||
void Load()
|
||||
{
|
||||
mesh.Load(filePath);
|
||||
|
||||
Buffer();
|
||||
}
|
||||
|
||||
bool Ready()
|
||||
{
|
||||
return loaded;
|
||||
}
|
||||
|
||||
void Render()
|
||||
{
|
||||
BindVertexArray(vertexArrayID);
|
||||
|
||||
|
||||
gInt SizeRef; GetBufferParameterIV(EBufferTarget::VertexIndices, EBufferParam::Size, SizeRef); SizeRef /= sizeof(gUInt);
|
||||
|
||||
|
||||
DrawElements(EPrimitives::Triangles, SizeRef, EDataType::UnsignedInt, ZeroOffset());
|
||||
|
||||
|
||||
UnbindVertexArray();
|
||||
}
|
||||
|
||||
HE_Model& operator= (const HE_Model& _model)
|
||||
{
|
||||
loaded = _model.loaded;
|
||||
|
||||
vertexArrayID = _model.vertexArrayID ;
|
||||
vertexBufferID = _model.vertexBufferID ;
|
||||
normalBuffferID = _model.normalBuffferID;
|
||||
textureBufferID = _model.textureBufferID;
|
||||
elementBufferID = _model.elementBufferID;
|
||||
|
||||
filePath = _model.filePath;
|
||||
|
||||
mesh = _model.mesh;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
|
||||
bool loaded;
|
||||
|
||||
ID<VertexArray > vertexArrayID ;
|
||||
ID<VertexBuffer > vertexBufferID ;
|
||||
ID<NormalBuffer > normalBuffferID;
|
||||
ID<TextureBuffer> textureBufferID;
|
||||
ID<ElementBuffer> elementBufferID;
|
||||
|
||||
string filePath;
|
||||
|
||||
HE_Mesh mesh;
|
||||
};
|
||||
};
|
||||
|
@ -86,12 +86,13 @@ namespace DGL
|
||||
|
||||
|
||||
struct Vec3Int
|
||||
{
|
||||
union
|
||||
{
|
||||
gUInt vec[3];
|
||||
gUInt x, y, z;
|
||||
};
|
||||
//union
|
||||
//{
|
||||
//gUInt vec[3];
|
||||
//gUInt x, y, z;
|
||||
//};
|
||||
};
|
||||
|
||||
//using Vec3Int = Generic::Vector3< gUInt >;
|
||||
@ -111,6 +112,11 @@ namespace DGL
|
||||
|
||||
// DGL
|
||||
|
||||
using Face = Vec3Int;
|
||||
|
||||
using FaceList = std::vector<Face>;
|
||||
|
||||
|
||||
using VecColor = Vector3;
|
||||
|
||||
struct LinearColor
|
||||
|
801
Execution.cpp
801
Execution.cpp
@ -1,805 +1,10 @@
|
||||
/*
|
||||
Title : Execution
|
||||
Author: Edward R. Gonzalez
|
||||
#include "Assignment_1_Execution.hpp"
|
||||
#include "Assignment_2_Execution.hpp"
|
||||
|
||||
Description:
|
||||
This brings together the functionality I made in DGL and the Actions libraries to produce an OpenGL Workspace.
|
||||
|
||||
Currently the workspace is heavily hardcoded and has one light rotating around the specified object. The material for the object is set during prep as well.
|
||||
|
||||
All exposed library references are inside the inline namespace right after declaring the namespace execution.
|
||||
|
||||
After I have the global objects used, followed by the functionality implementations, and at the very end the main function running the default execution implementation.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
// DGL
|
||||
#include "DGL/DGL.hpp"
|
||||
|
||||
// Utility
|
||||
#include "Actions.hpp"
|
||||
|
||||
// Non-Standard C++
|
||||
#include "Cpp_Alias.hpp"
|
||||
|
||||
|
||||
|
||||
namespace Execution
|
||||
{
|
||||
inline namespace LibraryReferences
|
||||
{
|
||||
// DGL
|
||||
|
||||
using DGL::EAxis ;
|
||||
using DGL::EBool ;
|
||||
using DGL::ECursorMode ;
|
||||
using DGL::EDirection ;
|
||||
using DGL::EFrameBuffer ;
|
||||
using DGL::EKeyCodes ;
|
||||
using DGL::EMouseMode ;
|
||||
using DGL::EPrimitives ;
|
||||
using DGL::ERotationAxis;
|
||||
|
||||
using DGL::Camera ;
|
||||
using DGL::Entity_Basic ;
|
||||
using DGL::gFloat ;
|
||||
using DGL::Light_Basic ;
|
||||
using DGL::LinearColor ;
|
||||
using DGL::Material_Phong;
|
||||
using DGL::Matrix ;
|
||||
using DGL::Matrix4x4 ;
|
||||
using DGL::Model ;
|
||||
using DGL::TimeValDec ;
|
||||
using DGL::Vector3 ;
|
||||
using DGL::Window ;
|
||||
|
||||
using DGL::BindVertexArray ;
|
||||
using DGL::CanUseRawMouse ;
|
||||
using DGL::ClearBuffer ;
|
||||
using DGL::CreateWindow ;
|
||||
using DGL::DestoryWindow ;
|
||||
using DGL::DisableVertexAttributeArray;
|
||||
using DGL::EnableDepth ;
|
||||
using DGL::EnableVertexAttributeArray ;
|
||||
using DGL::GetCursorPosition ;
|
||||
using DGL::GetTime ;
|
||||
using DGL::InitalizeGLEW ;
|
||||
using DGL::InitalizeGLFW ;
|
||||
using DGL::LoadDefaultShaders ;
|
||||
using DGL::KeyPressed ;
|
||||
using DGL::NotShared ;
|
||||
using DGL::PollEvents ;
|
||||
using DGL::ResetCursor ;
|
||||
using DGL::SetClearColor ;
|
||||
using DGL::SetCurrentContext ;
|
||||
using DGL::SetInputMode ;
|
||||
using DGL::SetPolygonMode ;
|
||||
using DGL::SetUniformVariable_MVA ;
|
||||
using DGL::SetWindowHeader ;
|
||||
using DGL::SwapBuffers ;
|
||||
using DGL::UseProgramShader ;
|
||||
using DGL::TerminateGLFW ;
|
||||
using DGL::WindowedMode ;
|
||||
|
||||
using DGL::DefaultSpace::ScreenWidth ;
|
||||
using DGL::DefaultSpace::ScreenHeight ;
|
||||
using DGL::DefaultSpace::ScreenCenterHeight;
|
||||
using DGL::DefaultSpace::ScreenCenterWidth ;
|
||||
using DGL::DefaultSpace::Screenspace ;
|
||||
using DGL::DefaultSpace::WorldCamera ;
|
||||
|
||||
using DGL::DefaultSpace::UpdateScreenspace;
|
||||
|
||||
// Actions
|
||||
|
||||
using Actions::ActionQueue;
|
||||
}
|
||||
|
||||
enum class EModels
|
||||
{
|
||||
Bunny ,
|
||||
Eight ,
|
||||
Gargoyle ,
|
||||
Hand ,
|
||||
Horse ,
|
||||
Sculpture,
|
||||
Topology ,
|
||||
Torus
|
||||
};
|
||||
|
||||
|
||||
// Globals
|
||||
|
||||
bool Exist = true; // Determines if the the execution should exit cycler.
|
||||
|
||||
TimeValDec CycleStart , // Snapshot of cycle loop start time.
|
||||
CycleEnd , // Snapshot of cycle loop end time.
|
||||
DeltaTime , // Delta between last cycle start and end.
|
||||
InputInterval = 1.0f / 60.0f, // Interval per second to complete the input process of the cycle.
|
||||
PhysicsInterval = 1.0f / 60.0f, // Interval per second to complete the physics process of the cycle.
|
||||
RenderInterval = 1.0f / 60.0f ; // Interval per second to complete the render process of the cycle.
|
||||
|
||||
Window* DefaultWindow; // Default window to use for execution.
|
||||
|
||||
double CursorX, CursorY; // Cursor axis position on the window.
|
||||
|
||||
bool CursorOff = true,
|
||||
ShowLight = true,
|
||||
RotateObj = true,
|
||||
OrbitLight = true ;
|
||||
|
||||
gFloat CamMoveSpeed = 7.0f, // Rate at which the camera should move.
|
||||
CamRotationSpeed = 27.0f ; // Rate at which the camera should rotate.
|
||||
|
||||
TimeValDec InputDelta = 0.0, // Current delta since last input process.
|
||||
PhysicsDelta = 0.0, // Current delta since last physics process.
|
||||
RenderDelta = 0.0 ; // Current delta since last render process.
|
||||
|
||||
ActionQueue ActionsToComplete; // Actions queue to run during the physics process of the cycle.
|
||||
|
||||
EModels CurrentModel = EModels::Bunny;
|
||||
|
||||
Model Bunny ("./Models/bunny.obj" );
|
||||
Model Eight ("./Models/eight.obj" );
|
||||
Model Gargoyle ("./Models/gargoyle.obj" );
|
||||
Model Hand ("./Models/hand.obj" );
|
||||
Model Horse ("./Models/horse.obj" );
|
||||
Model Sculpture("./Models/sculpture.obj" );
|
||||
Model Topology ("./Models/topology.obj" );
|
||||
Model Torus ("./Models/Torus.obj" );
|
||||
|
||||
Material_Phong ObjectMaterial; // Material to use on the model.
|
||||
|
||||
Light_Basic Light ; // Hardcoded light. Rotates around object.
|
||||
Entity_Basic ObjectToView; // Object that will be currently in the middle with the light source rotating.
|
||||
|
||||
string
|
||||
windowTitle = "Assignment 1" ,
|
||||
deltaStr = "Delta: " ,
|
||||
inputDeltaStr = "Input Delta: " ,
|
||||
physicsDeltaStr = "Physics Delta: " ,
|
||||
renderDeltaStr = "RenderDeltaStr: " ;
|
||||
|
||||
stringstream WindowTitle;
|
||||
|
||||
|
||||
|
||||
// Functionality
|
||||
|
||||
// Input Action functions...
|
||||
|
||||
void ChangeModel()
|
||||
{
|
||||
if (CurrentModel == EModels::Torus)
|
||||
{
|
||||
CurrentModel = EModels::Bunny;
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentModel = EModels(int(CurrentModel) + 1);
|
||||
}
|
||||
|
||||
switch (CurrentModel)
|
||||
{
|
||||
case EModels::Bunny:
|
||||
{
|
||||
if (not Bunny.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Bunny...");
|
||||
|
||||
Bunny.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Bunny);
|
||||
|
||||
ObjectToView.SetScale(4.0f);
|
||||
|
||||
ObjectToView.SetPosition(Vector3(-0.05, -4.4f, 0));
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::White.Vector();
|
||||
ObjectMaterial.Ambience = 0.300f ;
|
||||
ObjectMaterial.Diffuse = 1.000f ;
|
||||
ObjectMaterial.Specular = 0.910f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Eight:
|
||||
{
|
||||
if (not Eight.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Eight...");
|
||||
|
||||
Eight.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Eight);
|
||||
|
||||
ObjectToView.SetScale(2.0f);
|
||||
|
||||
ObjectToView.SetPosition(Vector3(0, -1.0, 0));
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::Blue.Vector();
|
||||
ObjectMaterial.Ambience = 0.112f ;
|
||||
ObjectMaterial.Diffuse = 0.828f ;
|
||||
ObjectMaterial.Specular = 0.421f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Gargoyle:
|
||||
{
|
||||
if (not Gargoyle.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Gargoyle...");
|
||||
|
||||
Gargoyle.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Gargoyle);
|
||||
|
||||
ObjectToView.SetPosition(Vector3(-1, -5.4f, 0));
|
||||
|
||||
ObjectToView.SetScale(6.0f);
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::Red.Vector();
|
||||
ObjectMaterial.Ambience = 0.001f ;
|
||||
ObjectMaterial.Diffuse = 0.658f ;
|
||||
ObjectMaterial.Specular = 0.821f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Hand:
|
||||
{
|
||||
if (not Hand.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Hand...");
|
||||
|
||||
Hand.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Hand);
|
||||
|
||||
ObjectToView.SetScale(0.03f);
|
||||
|
||||
ObjectToView.SetPosition(Vector3(0, -1.1f, 0));
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::DarkTone.Vector();
|
||||
ObjectMaterial.Ambience = 0.000f ;
|
||||
ObjectMaterial.Diffuse = 1.000f ;
|
||||
ObjectMaterial.Specular = 0.640f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
SetClearColor(LinearColor(0.53f, 0.53f, 0.53f, 1.0f));
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Horse:
|
||||
{
|
||||
if (not Horse.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Horse...");
|
||||
|
||||
Horse.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Horse);
|
||||
|
||||
ObjectToView.SetScale(20.0f);
|
||||
|
||||
ObjectToView.Rotate(90.0f, EAxis::X);
|
||||
|
||||
ObjectToView.SetPosition(Vector3(0, 0.0f, 0));
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::Green.Vector();
|
||||
ObjectMaterial.Ambience = 0.000f ;
|
||||
ObjectMaterial.Diffuse = 1.000f ;
|
||||
ObjectMaterial.Specular = 0.640f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
SetClearColor(LinearColor(0.02f, 0.02f, 0.02f, 1.0f));
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Sculpture:
|
||||
{
|
||||
if (not Sculpture.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Sculpture...");
|
||||
|
||||
Sculpture.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Sculpture);
|
||||
|
||||
ObjectToView.SetScale(0.01f);
|
||||
|
||||
ObjectToView.Rotate(-90.0f, EAxis::X);
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::WarmSphia.Vector();
|
||||
ObjectMaterial.Ambience = 0.112f ;
|
||||
ObjectMaterial.Diffuse = 0.928f ;
|
||||
ObjectMaterial.Specular = 0.21f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Topology:
|
||||
{
|
||||
if (not Topology.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Topology...");
|
||||
|
||||
Topology.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Topology);
|
||||
|
||||
ObjectToView.SetScale(0.2f);
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::Coral.Vector();
|
||||
ObjectMaterial.Ambience = 0.212f ;
|
||||
ObjectMaterial.Diffuse = 0.728f ;
|
||||
ObjectMaterial.Specular = 0.41f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
return;
|
||||
}
|
||||
case EModels::Torus:
|
||||
{
|
||||
if (not Torus.Ready())
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, "Assignment 1: Loading Torus...");
|
||||
|
||||
Torus.Load();
|
||||
}
|
||||
|
||||
ObjectToView.SetModel(Torus);
|
||||
|
||||
ObjectToView.SetScale(1.0f);
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::Grey.Vector();
|
||||
ObjectMaterial.Ambience = 0.170f ;
|
||||
ObjectMaterial.Diffuse = 0.720f ;
|
||||
ObjectMaterial.Specular = 0.100f ;
|
||||
|
||||
ObjectToView.SetMaterial(ObjectMaterial);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ToggleLight()
|
||||
{
|
||||
ShowLight ? ShowLight = false : ShowLight = true;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void ToggleModelRotation()
|
||||
{
|
||||
RotateObj ? RotateObj = false : RotateObj = true;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void ToogleLightOrbit()
|
||||
{
|
||||
OrbitLight ? OrbitLight = false : OrbitLight = true;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void RotateCamera(ERotationAxis _rotationAxis, gFloat _rotationAmount, double _delta)
|
||||
{
|
||||
WorldCamera.Rotate(_rotationAxis, _rotationAmount, gFloat(_delta));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void MoveCamera(EDirection _direction, gFloat _translationAmount, double _delta)
|
||||
{
|
||||
WorldCamera.Move(_direction, _translationAmount, gFloat(_delta));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void ModifyCamSpeed(bool _isPositive, double _delta)
|
||||
{
|
||||
if (_isPositive)
|
||||
{
|
||||
CamMoveSpeed += CamMoveSpeed * gFloat(_delta);
|
||||
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
CamMoveSpeed -= CamMoveSpeed * gFloat(_delta);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// End of common input functions...
|
||||
|
||||
|
||||
void UpdateWindowDeltaTitle()
|
||||
{
|
||||
WindowTitle.str("");
|
||||
|
||||
WindowTitle
|
||||
<< windowTitle << " "
|
||||
<< deltaStr << DeltaTime << " "
|
||||
<< inputDeltaStr << InputDelta << " "
|
||||
<< physicsDeltaStr << PhysicsDelta << " "
|
||||
<< renderDeltaStr << RenderDelta ;
|
||||
}
|
||||
|
||||
|
||||
// Currently Does everything required before entering the cycler.
|
||||
void PrepWorkspace()
|
||||
{
|
||||
// Baseline
|
||||
|
||||
InitalizeGLFW();
|
||||
|
||||
DefaultWindow = CreateWindow(ScreenWidth, ScreenHeight, "Assignment 1: Loading Model...", WindowedMode(), NotShared());
|
||||
|
||||
SetCurrentContext(DefaultWindow);
|
||||
|
||||
InitalizeGLEW(); // Glew must initialize only after a context is set.
|
||||
|
||||
EnableDepth();
|
||||
|
||||
SetPolygonMode(DGL::EFace::Front_and_Back, DGL::ERenderMode::Fill);
|
||||
|
||||
|
||||
// Cursor stuff
|
||||
|
||||
SetInputMode(DefaultWindow, DGL::EMouseMode::Cursor, DGL::ECursorMode::Disable);
|
||||
|
||||
ResetCursor(DefaultWindow, ScreenCenterWidth, ScreenCenterHeight);
|
||||
|
||||
if (CanUseRawMouse())
|
||||
{
|
||||
SetInputMode(DefaultWindow, DGL::EMouseMode::RawMouse, DGL::EBool::True);
|
||||
}
|
||||
|
||||
// End of cursor stuff...
|
||||
|
||||
|
||||
// Shaders
|
||||
|
||||
LoadDefaultShaders();
|
||||
|
||||
// Entities
|
||||
|
||||
Light.Load();
|
||||
|
||||
Bunny.Load();
|
||||
|
||||
ObjectMaterial.Color = DGL::Colors::White.Vector();
|
||||
ObjectMaterial.Ambience = 0.300f ;
|
||||
ObjectMaterial.Diffuse = 1.000f ;
|
||||
ObjectMaterial.Specular = 0.910f ;
|
||||
|
||||
ObjectToView = Entity_Basic(Bunny, ObjectMaterial);
|
||||
|
||||
ObjectToView.SetScale(4.0f);
|
||||
|
||||
ObjectToView.SetPosition(Vector3(-0.05, -4.4f, 0));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Cycles the process of what to do while a window is open.
|
||||
|
||||
The input, physics, and render procedures can be specified with extra functionality by specifying delegates to those procedures.
|
||||
|
||||
Cycler is hardcoded to exit if escape key is pressed.
|
||||
*/
|
||||
void Cycler(const function< void(Window*)>& _inputProcedure, const function< void()>& _physicsProcedure, const function< void()>& _renderProcedure)
|
||||
{
|
||||
while (Exist)
|
||||
{
|
||||
CycleStart = GetTime();
|
||||
|
||||
if (InputDelta >= InputInterval)
|
||||
{
|
||||
PollEvents();
|
||||
|
||||
if (KeyPressed(DefaultWindow, EKeyCodes::Escape))
|
||||
{
|
||||
Exist = false;
|
||||
}
|
||||
|
||||
GetCursorPosition(DefaultWindow, &CursorX, &CursorY);
|
||||
|
||||
_inputProcedure(DefaultWindow);
|
||||
|
||||
if (CursorOff)
|
||||
{
|
||||
ResetCursor(DefaultWindow, ScreenCenterWidth, ScreenCenterHeight);
|
||||
}
|
||||
}
|
||||
|
||||
if (PhysicsDelta >= PhysicsInterval)
|
||||
{
|
||||
while (ActionsToComplete.HasAction())
|
||||
{
|
||||
ActionsToComplete.DoNextAction();
|
||||
}
|
||||
|
||||
_physicsProcedure();
|
||||
|
||||
PhysicsDelta = 0.0;
|
||||
}
|
||||
|
||||
if (RenderDelta >= RenderInterval)
|
||||
{
|
||||
ClearBuffer(EFrameBuffer::Color, EFrameBuffer::Depth);
|
||||
|
||||
_renderProcedure();
|
||||
|
||||
SwapBuffers(DefaultWindow);
|
||||
|
||||
RenderDelta = 0.0;
|
||||
}
|
||||
|
||||
if (InputDelta >= InputInterval)
|
||||
{
|
||||
InputDelta = 0.0;
|
||||
}
|
||||
|
||||
CycleEnd = GetTime();
|
||||
|
||||
DeltaTime = CycleEnd - CycleStart;
|
||||
|
||||
InputDelta += DeltaTime;
|
||||
PhysicsDelta += DeltaTime;
|
||||
RenderDelta += DeltaTime;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Input functionality delegates (These are made due to a limitation with the actions implementation).
|
||||
|
||||
auto ChangeModelDelegate = function<decltype(ChangeModel )>(ChangeModel );
|
||||
auto ToogleLightDelegate = function<decltype(ToggleLight )>(ToggleLight );
|
||||
auto ToggleModelRotationDelegate = function<decltype(ToggleModelRotation)>(ToggleModelRotation);
|
||||
auto ToggleLightOrbitDelegate = function<decltype(ToogleLightOrbit )>(ToogleLightOrbit );
|
||||
auto RotateCamDelegate = function<decltype(RotateCamera )>(RotateCamera );
|
||||
auto MoveCamDelegate = function<decltype(MoveCamera )>(MoveCamera );
|
||||
auto ModifyCamSpeedDelegate = function<decltype(ModifyCamSpeed )>(ModifyCamSpeed );
|
||||
auto SetPolyModeDelegate = function<decltype(SetPolygonMode )>(SetPolygonMode );
|
||||
|
||||
void InputProcedure(Window* _currentWindowContext)
|
||||
{
|
||||
static bool F1_Held = false,
|
||||
F4_Held = false,
|
||||
F5_Held = false,
|
||||
H_Held = false,
|
||||
M_Held = false ;
|
||||
|
||||
if (!KeyPressed(_currentWindowContext, EKeyCodes::F1)) F1_Held = false;
|
||||
if (!KeyPressed(_currentWindowContext, EKeyCodes::F4)) F4_Held = false;
|
||||
if (!KeyPressed(_currentWindowContext, EKeyCodes::F5)) F5_Held = false;
|
||||
if (!KeyPressed(_currentWindowContext, EKeyCodes::H )) H_Held = false;
|
||||
if (!KeyPressed(_currentWindowContext, EKeyCodes::M )) M_Held = false;
|
||||
|
||||
// TODO: Not necessary for now and throws memory error.
|
||||
/*if (KeyPressed(_currentWindowContext, EKeyCodes::F1) && not F1_Held)
|
||||
{
|
||||
ECursorMode cursorMode = ECursorMode(GetMouseInputMode(DefaultWindow, EMouseMode::Cursor));
|
||||
|
||||
auto delegate = function<decltype(SetInputMode<ECursorMode>)>(SetInputMode<ECursorMode>);
|
||||
auto delegateRaw = function<decltype(SetInputMode<EBool >)>(SetInputMode<EBool >);
|
||||
|
||||
if (cursorMode == ECursorMode::Normal || cursorMode == ECursorMode::Hidden)
|
||||
{
|
||||
ActionsToComplete.AddToQueue(delegate , _currentWindowContext, EMouseMode::Cursor , ECursorMode::Disable);
|
||||
ActionsToComplete.AddToQueue(delegateRaw, _currentWindowContext, EMouseMode::RawMouse, EBool ::True );
|
||||
|
||||
CursorOff = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ActionsToComplete.AddToQueue(delegate , _currentWindowContext, EMouseMode::Cursor , ECursorMode::Normal);
|
||||
ActionsToComplete.AddToQueue(delegateRaw, _currentWindowContext, EMouseMode::RawMouse, EBool ::False );
|
||||
|
||||
CursorOff = false;
|
||||
}
|
||||
|
||||
F1_Held = true;
|
||||
}*/
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::H) && not H_Held)
|
||||
{
|
||||
H_Held = true;
|
||||
|
||||
ActionsToComplete.AddToQueue(ToogleLightDelegate);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::M) && not M_Held)
|
||||
{
|
||||
M_Held = true;
|
||||
|
||||
ActionsToComplete.AddToQueue(ChangeModelDelegate);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::UpArrow))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(ModifyCamSpeedDelegate, true, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeysPressed(_currentWindowContext, EKeyCodes::DnArrow))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(ModifyCamSpeedDelegate, false, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::F2))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(SetPolyModeDelegate, DGL::EFace::Front_and_Back, DGL::ERenderMode::Line);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::F3))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(SetPolyModeDelegate, DGL::EFace::Front_and_Back, DGL::ERenderMode::Fill);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::F4) && not F4_Held)
|
||||
{
|
||||
ActionsToComplete.AddToQueue(ToggleModelRotationDelegate);
|
||||
|
||||
F4_Held = true;
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::F5) && not F5_Held)
|
||||
{
|
||||
ActionsToComplete.AddToQueue(ToggleLightOrbitDelegate);
|
||||
|
||||
F5_Held = true;
|
||||
}
|
||||
|
||||
if (CursorOff)
|
||||
{
|
||||
if (CursorX != 0)
|
||||
{
|
||||
ActionsToComplete.AddToQueue(RotateCamDelegate, ERotationAxis::Yaw, gFloat(CursorX) * CamRotationSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (CursorY != 0)
|
||||
{
|
||||
ActionsToComplete.AddToQueue(RotateCamDelegate, ERotationAxis::Pitch, gFloat(CursorY) * CamRotationSpeed, PhysicsDelta);
|
||||
}
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::E))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(MoveCamDelegate, EDirection::Up, CamMoveSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::Q))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(MoveCamDelegate, EDirection::Down, CamMoveSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::A))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(MoveCamDelegate, EDirection::Left, CamMoveSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::D))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(MoveCamDelegate, EDirection::Right, CamMoveSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::W))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(MoveCamDelegate, EDirection::Forward, CamMoveSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::S))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(MoveCamDelegate, EDirection::Backward, CamMoveSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::I))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(RotateCamDelegate, ERotationAxis::Pitch, -6.0f * CamRotationSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::K))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(RotateCamDelegate, ERotationAxis::Pitch, 6.0f * CamRotationSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::J))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(RotateCamDelegate, ERotationAxis::Yaw, -6.0f * CamRotationSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
if (KeyPressed(_currentWindowContext, EKeyCodes::L))
|
||||
{
|
||||
ActionsToComplete.AddToQueue(RotateCamDelegate, ERotationAxis::Yaw, 6.0f * CamRotationSpeed, PhysicsDelta);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void PhysicsProcedure()
|
||||
{
|
||||
WorldCamera.UpdateCamera();
|
||||
|
||||
UpdateScreenspace();
|
||||
|
||||
if (OrbitLight)
|
||||
{
|
||||
Light.Update(gFloat(PhysicsDelta));
|
||||
}
|
||||
|
||||
if (RotateObj)
|
||||
{
|
||||
ObjectToView.Rotate(-1.0f * gFloat(PhysicsDelta), EAxis::Y);
|
||||
}
|
||||
|
||||
ObjectToView.Update();
|
||||
|
||||
UpdateWindowDeltaTitle();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void RenderProcedure()
|
||||
{
|
||||
SetWindowHeader(DefaultWindow, WindowTitle.str());
|
||||
|
||||
if (ShowLight)
|
||||
{
|
||||
Light.Render(WorldCamera.Perspective, WorldCamera.Viewport);
|
||||
}
|
||||
|
||||
ObjectToView.Render(WorldCamera.Perspective, WorldCamera.Viewport, Light.GetPosition(), Light.GetColor());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Runtime Execution: Default Execution
|
||||
|
||||
int Execute()
|
||||
{
|
||||
PrepWorkspace();
|
||||
|
||||
Cycler(InputProcedure, PhysicsProcedure, RenderProcedure);
|
||||
|
||||
// TODO: There should be more to properly close...
|
||||
|
||||
DestoryWindow(DefaultWindow);
|
||||
|
||||
TerminateGLFW();
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Currently only can do one execution route.
|
||||
int main(void)
|
||||
{
|
||||
return Execution::Execute();
|
||||
return Execution::Execute_Assignment2();
|
||||
}
|
||||
|
||||
|
10
Models/torus_Blender.mtl
Normal file
10
Models/torus_Blender.mtl
Normal file
@ -0,0 +1,10 @@
|
||||
# Blender MTL File: 'None'
|
||||
# Material Count: 1
|
||||
|
||||
newmtl None
|
||||
Ns 0
|
||||
Ka 0.000000 0.000000 0.000000
|
||||
Kd 0.8 0.8 0.8
|
||||
Ks 0.8 0.8 0.8
|
||||
d 1
|
||||
illum 2
|
3897
Models/torus_Blender.obj
Normal file
3897
Models/torus_Blender.obj
Normal file
File diff suppressed because it is too large
Load Diff
209
OMesh/OMeshInterface.hpp
Normal file
209
OMesh/OMeshInterface.hpp
Normal file
@ -0,0 +1,209 @@
|
||||
#pragma once
|
||||
|
||||
// DGL
|
||||
#include "DGL/DGL_Types.hpp"
|
||||
|
||||
// OpenMesh
|
||||
#include <OpenMesh/Core/IO/MeshIO.hh>
|
||||
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
|
||||
#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
|
||||
|
||||
// C++
|
||||
#include "Cpp_Alias.hpp"
|
||||
|
||||
|
||||
namespace OMeshInterface
|
||||
{
|
||||
inline namespace LibraryReferences
|
||||
{
|
||||
// DGL
|
||||
|
||||
using FaceGL = DGL::Face ;
|
||||
using FaceList = DGL::FaceList ;
|
||||
using Vector3 = DGL::Vector3 ;
|
||||
using VertexList = DGL::VertexList;
|
||||
|
||||
// OpenMesh
|
||||
|
||||
using EdgeHandle = OpenMesh::EdgeHandle ;
|
||||
using HE_Mesh = OpenMesh::TriMesh_ArrayKernelT<> ;
|
||||
using HE_MeshPoly = OpenMesh::PolyMesh_ArrayKernelT<>;
|
||||
using FaceHandle = OpenMesh::FaceHandle ;
|
||||
using HalfEdgeHandle = OpenMesh::HalfedgeHandle ;
|
||||
using IO_Options = OpenMesh::IO::Options ;
|
||||
using VertexHandle = OpenMesh::VertexHandle ;
|
||||
using Vertex = OpenMesh::ArrayKernel::Vertex ;
|
||||
|
||||
using OpenMesh::IO::read_mesh;
|
||||
|
||||
// Second Order Aliases
|
||||
using Point = HE_Mesh::Point;
|
||||
using Edge = HE_Mesh::Edge ;
|
||||
|
||||
using EdgeList = vector<Edge>;
|
||||
|
||||
using EdgeHandles = vector<EdgeHandle >;
|
||||
using FaceHandles = vector<FaceHandle >;
|
||||
using HalfEdgeHandles = vector<HalfEdgeHandle>;
|
||||
using VertHandles = vector<VertexHandle >;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
class OMesh_HE
|
||||
{
|
||||
public:
|
||||
|
||||
OMesh_HE() {}
|
||||
|
||||
void Load(string _filePath)
|
||||
{
|
||||
IO_Options loadOptions;
|
||||
|
||||
bool loadResult, hasFaceNormals, hasVertexNormals;
|
||||
|
||||
oMeshObj.request_vertex_normals();
|
||||
oMeshObj.request_face_normals ();
|
||||
|
||||
loadResult = read_mesh(oMeshObj, _filePath, loadOptions);
|
||||
|
||||
if (loadResult == false)
|
||||
{
|
||||
throw std::runtime_error("OMesh_HE: Failed to load the mesh.");
|
||||
}
|
||||
|
||||
hasFaceNormals = loadOptions.check(IO_Options::FaceNormal );
|
||||
hasVertexNormals = loadOptions.check(IO_Options::VertexNormal);
|
||||
|
||||
if (!hasVertexNormals)
|
||||
{
|
||||
oMeshObj.update_vertex_normals ();
|
||||
}
|
||||
if (!hasFaceNormals)
|
||||
{
|
||||
oMeshObj.update_face_normals ();
|
||||
}
|
||||
|
||||
GenerateVertexList ();
|
||||
GenerateVertexNormalList();
|
||||
GenerateFaceNormalList ();
|
||||
GenerateVertexEdgeList ();
|
||||
GenerateFaceList ();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const VertexList& GetVerticies() const
|
||||
{
|
||||
return verticies;
|
||||
}
|
||||
|
||||
const VertexList& GetVertNormals() const
|
||||
{
|
||||
return vertNormals;
|
||||
}
|
||||
|
||||
const EdgeList& GetVertEdges() const
|
||||
{
|
||||
return edges;
|
||||
}
|
||||
|
||||
const FaceList& GetFaces() const
|
||||
{
|
||||
return faces;
|
||||
}
|
||||
|
||||
const VertexList& GetFaceNormals() const
|
||||
{
|
||||
return faceNormals;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
void GenerateVertexList()
|
||||
{
|
||||
using VertIter = HE_Mesh::VertexIter;
|
||||
|
||||
for (VertIter element = oMeshObj.vertices_begin(); element != oMeshObj.vertices_end(); element++)
|
||||
{
|
||||
auto vertex = oMeshObj.point(*element);
|
||||
|
||||
verticies.push_back(Vector3(vertex[0], vertex[1], vertex[2]));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void GenerateVertexNormalList()
|
||||
{
|
||||
using VertIter = HE_Mesh::VertexIter;
|
||||
|
||||
for (VertIter element = oMeshObj.vertices_begin(); element != oMeshObj.vertices_end(); element++)
|
||||
{
|
||||
auto normal = oMeshObj.normal(*element);
|
||||
|
||||
vertNormals.push_back(Vector3(normal[0], normal[1], normal[2]));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void GenerateFaceNormalList()
|
||||
{
|
||||
using FaceIter = HE_Mesh::FaceIter;
|
||||
|
||||
for (FaceIter faceElem = oMeshObj.faces_begin(); faceElem != oMeshObj.faces_end(); faceElem++)
|
||||
{
|
||||
auto normal = oMeshObj.normal(*faceElem);
|
||||
|
||||
faceNormals.push_back(Vector3(normal[0], normal[1], normal[2]));
|
||||
}
|
||||
}
|
||||
|
||||
void GenerateVertexEdgeList()
|
||||
{
|
||||
using EdgeIter = HE_Mesh::EdgeIter;
|
||||
|
||||
for (EdgeIter element = oMeshObj.edges_begin(); element != oMeshObj.edges_begin(); element++)
|
||||
{
|
||||
using OEdge = decltype(oMeshObj.edge(*element));
|
||||
|
||||
OEdge edge = oMeshObj.edge(*element);
|
||||
|
||||
edges.push_back(edge);
|
||||
}
|
||||
}
|
||||
|
||||
void GenerateFaceList()
|
||||
{
|
||||
using FaceIterElem = decltype(oMeshObj.faces_begin());
|
||||
|
||||
for (FaceIterElem faceElement = oMeshObj.faces_begin(); faceElement != oMeshObj.faces_end(); faceElement++)
|
||||
{
|
||||
FaceGL face;
|
||||
|
||||
int index = 0;
|
||||
|
||||
using FaceVertexIter = HE_Mesh::FaceVertexIter;
|
||||
|
||||
for (FaceVertexIter vertElement = oMeshObj.fv_begin(*faceElement); vertElement != oMeshObj.fv_end(*faceElement); vertElement++, index++)
|
||||
{
|
||||
face.vec[index] = vertElement->idx();
|
||||
}
|
||||
|
||||
faces.push_back(face);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
HE_Mesh oMeshObj;
|
||||
|
||||
VertexList verticies ;
|
||||
VertexList vertNormals;
|
||||
VertexList faceNormals;
|
||||
EdgeList edges ;
|
||||
FaceList faces ;
|
||||
};
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
#version 330 core
|
||||
|
||||
|
||||
|
||||
out vec4 FragColor;
|
||||
|
||||
in vec3 FragPosition ;
|
||||
|
@ -1,9 +1,13 @@
|
||||
#version 330 core
|
||||
|
||||
|
||||
|
||||
#define VertexIndex 0
|
||||
#define NormalIndex 1
|
||||
#define TextureIndex 2
|
||||
|
||||
|
||||
|
||||
layout (location = VertexIndex ) in vec3 VertPosition;
|
||||
layout (location = NormalIndex ) in vec3 VertNormal ;
|
||||
layout (location = TextureIndex) in vec3 VertTexture ;
|
||||
|
Loading…
Reference in New Issue
Block a user