Initial Commit
This commit is contained in:
commit
85583a8880
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
ExternalResources
|
||||||
39
Notes.md
Normal file
39
Notes.md
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# Projekt
|
||||||
|
|
||||||
|
### Rubics Cube mit diversen Anforderungen
|
||||||
|
|
||||||
|
Wichtigkeit der einzelnen vorgegebenen Anforderungen:
|
||||||
|
- 4.0 Logische Repräsentation, Rendering, simple Steuerung
|
||||||
|
- -1 Animation
|
||||||
|
- -1.3 Maussteuerung Steuerung vorne nach Konzept wie in Vorlesung
|
||||||
|
- -0.3 Maussteuerung für Kamera
|
||||||
|
- -0.3 Sound
|
||||||
|
- -0.3 bis -0.7 Aufwendige Graphik-Programmierung
|
||||||
|
|
||||||
|
|
||||||
|
( Vorlesung 1 _ 8:00 )
|
||||||
|
Ordner Struktur:
|
||||||
|
- ExternalResources
|
||||||
|
- glm
|
||||||
|
- glfw
|
||||||
|
- stb
|
||||||
|
- glew
|
||||||
|
- RubiksCube
|
||||||
|
|
||||||
|
Console
|
||||||
|
|
||||||
|
Additional Include Directories
|
||||||
|
$(SolutionDir)/../ExternalResources/glew/include
|
||||||
|
$(SolutionDir)/../ExternalResources/glfw/include
|
||||||
|
$(SolutionDir)/../ExternalResources/glm/glm
|
||||||
|
$(SolutionDir)/../ExternalResources/stb
|
||||||
|
|
||||||
|
Additional Library Directories
|
||||||
|
$(SolutionDir)/../ExternalResources/glew/lib/Release/x64
|
||||||
|
$(SolutionDir)/../ExternalResources/glfw/lib-vc2017 # Fragen welche Version
|
||||||
|
|
||||||
|
Additional Dependencies
|
||||||
|
opengl32.lib
|
||||||
|
glfw3.lib
|
||||||
|
glew32s.lib
|
||||||
|
|
||||||
433
RubiksCube/.gitignore
vendored
Normal file
433
RubiksCube/.gitignore
vendored
Normal file
@ -0,0 +1,433 @@
|
|||||||
|
# Prerequisites
|
||||||
|
*.d
|
||||||
|
|
||||||
|
# Compiled Object files
|
||||||
|
*.slo
|
||||||
|
*.lo
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
|
||||||
|
# Precompiled Headers
|
||||||
|
*.gch
|
||||||
|
*.pch
|
||||||
|
|
||||||
|
# Compiled Dynamic libraries
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
*.dll
|
||||||
|
|
||||||
|
# Fortran module files
|
||||||
|
*.mod
|
||||||
|
*.smod
|
||||||
|
|
||||||
|
# Compiled Static libraries
|
||||||
|
*.lai
|
||||||
|
*.la
|
||||||
|
*.a
|
||||||
|
*.lib
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
|
||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
##
|
||||||
|
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.rsuser
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.userosscache
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
|
# Mono auto generated files
|
||||||
|
mono_crash.*
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]elease/
|
||||||
|
[Rr]eleases/
|
||||||
|
x64/
|
||||||
|
x86/
|
||||||
|
[Ww][Ii][Nn]32/
|
||||||
|
[Aa][Rr][Mm]/
|
||||||
|
[Aa][Rr][Mm]64/
|
||||||
|
bld/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
[Ll]og/
|
||||||
|
[Ll]ogs/
|
||||||
|
|
||||||
|
# Visual Studio 2015/2017 cache/options directory
|
||||||
|
.vs/
|
||||||
|
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||||
|
#wwwroot/
|
||||||
|
|
||||||
|
# Visual Studio 2017 auto generated files
|
||||||
|
Generated\ Files/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
# NUnit
|
||||||
|
*.VisualState.xml
|
||||||
|
TestResult.xml
|
||||||
|
nunit-*.xml
|
||||||
|
|
||||||
|
# Build Results of an ATL Project
|
||||||
|
[Dd]ebugPS/
|
||||||
|
[Rr]eleasePS/
|
||||||
|
dlldata.c
|
||||||
|
|
||||||
|
# Benchmark Results
|
||||||
|
BenchmarkDotNet.Artifacts/
|
||||||
|
|
||||||
|
# .NET Core
|
||||||
|
project.lock.json
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
# ASP.NET Scaffolding
|
||||||
|
ScaffoldingReadMe.txt
|
||||||
|
|
||||||
|
# StyleCop
|
||||||
|
StyleCopReport.xml
|
||||||
|
|
||||||
|
# Files built by Visual Studio
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*_h.h
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.iobj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.ipdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
# but not Directory.Build.rsp, as it configures directory-level build defaults
|
||||||
|
!Directory.Build.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*_wpftmp.csproj
|
||||||
|
*.log
|
||||||
|
*.tlog
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.svclog
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Chutzpah Test files
|
||||||
|
_Chutzpah*
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
*.VC.db
|
||||||
|
*.VC.VC.opendb
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
*.sap
|
||||||
|
|
||||||
|
# Visual Studio Trace Files
|
||||||
|
*.e2e
|
||||||
|
|
||||||
|
# TFS 2012 Local Workspace
|
||||||
|
$tf/
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
*.DotSettings.user
|
||||||
|
|
||||||
|
# TeamCity is a build add-in
|
||||||
|
_TeamCity*
|
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
# AxoCover is a Code Coverage Tool
|
||||||
|
.axoCover/*
|
||||||
|
!.axoCover/settings.json
|
||||||
|
|
||||||
|
# Coverlet is a free, cross platform Code Coverage Tool
|
||||||
|
coverage*.json
|
||||||
|
coverage*.xml
|
||||||
|
coverage*.info
|
||||||
|
|
||||||
|
# Visual Studio code coverage results
|
||||||
|
*.coverage
|
||||||
|
*.coveragexml
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
_NCrunch_*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
nCrunchTemp_*
|
||||||
|
|
||||||
|
# MightyMoose
|
||||||
|
*.mm.*
|
||||||
|
AutoTest.Net/
|
||||||
|
|
||||||
|
# Web workbench (sass)
|
||||||
|
.sass-cache/
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.azurePubxml
|
||||||
|
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||||
|
# but database connection strings (with potential passwords) will be unencrypted
|
||||||
|
*.pubxml
|
||||||
|
*.publishproj
|
||||||
|
|
||||||
|
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||||
|
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||||
|
# in these scripts will be unencrypted
|
||||||
|
PublishScripts/
|
||||||
|
|
||||||
|
# NuGet Packages
|
||||||
|
*.nupkg
|
||||||
|
# NuGet Symbol Packages
|
||||||
|
*.snupkg
|
||||||
|
# The packages folder can be ignored because of Package Restore
|
||||||
|
**/[Pp]ackages/*
|
||||||
|
# except build/, which is used as an MSBuild target.
|
||||||
|
!**/[Pp]ackages/build/
|
||||||
|
# Uncomment if necessary however generally it will be regenerated when needed
|
||||||
|
#!**/[Pp]ackages/repositories.config
|
||||||
|
# NuGet v3's project.json files produces more ignorable files
|
||||||
|
*.nuget.props
|
||||||
|
*.nuget.targets
|
||||||
|
|
||||||
|
# Microsoft Azure Build Output
|
||||||
|
csx/
|
||||||
|
*.build.csdef
|
||||||
|
|
||||||
|
# Microsoft Azure Emulator
|
||||||
|
ecf/
|
||||||
|
rcf/
|
||||||
|
|
||||||
|
# Windows Store app package directories and files
|
||||||
|
AppPackages/
|
||||||
|
BundleArtifacts/
|
||||||
|
Package.StoreAssociation.xml
|
||||||
|
_pkginfo.txt
|
||||||
|
*.appx
|
||||||
|
*.appxbundle
|
||||||
|
*.appxupload
|
||||||
|
|
||||||
|
# Visual Studio cache files
|
||||||
|
# files ending in .cache can be ignored
|
||||||
|
*.[Cc]ache
|
||||||
|
# but keep track of directories ending in .cache
|
||||||
|
!?*.[Cc]ache/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
ClientBin/
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.dbproj.schemaview
|
||||||
|
*.jfm
|
||||||
|
*.pfx
|
||||||
|
*.publishsettings
|
||||||
|
orleans.codegen.cs
|
||||||
|
|
||||||
|
# Including strong name files can present a security risk
|
||||||
|
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||||
|
#*.snk
|
||||||
|
|
||||||
|
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||||
|
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||||
|
#bower_components/
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file
|
||||||
|
# to a newer Visual Studio version. Backup files are not needed,
|
||||||
|
# because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
ServiceFabricBackup/
|
||||||
|
*.rptproj.bak
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
*.mdf
|
||||||
|
*.ldf
|
||||||
|
*.ndf
|
||||||
|
|
||||||
|
# Business Intelligence projects
|
||||||
|
*.rdl.data
|
||||||
|
*.bim.layout
|
||||||
|
*.bim_*.settings
|
||||||
|
*.rptproj.rsuser
|
||||||
|
*- [Bb]ackup.rdl
|
||||||
|
*- [Bb]ackup ([0-9]).rdl
|
||||||
|
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||||
|
|
||||||
|
# Microsoft Fakes
|
||||||
|
FakesAssemblies/
|
||||||
|
|
||||||
|
# GhostDoc plugin setting file
|
||||||
|
*.GhostDoc.xml
|
||||||
|
|
||||||
|
# Node.js Tools for Visual Studio
|
||||||
|
.ntvs_analysis.dat
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Visual Studio 6 build log
|
||||||
|
*.plg
|
||||||
|
|
||||||
|
# Visual Studio 6 workspace options file
|
||||||
|
*.opt
|
||||||
|
|
||||||
|
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||||
|
*.vbw
|
||||||
|
|
||||||
|
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
|
||||||
|
*.vbp
|
||||||
|
|
||||||
|
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
|
||||||
|
*.dsw
|
||||||
|
*.dsp
|
||||||
|
|
||||||
|
# Visual Studio 6 technical files
|
||||||
|
*.ncb
|
||||||
|
*.aps
|
||||||
|
|
||||||
|
# Visual Studio LightSwitch build output
|
||||||
|
**/*.HTMLClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/ModelManifest.xml
|
||||||
|
**/*.Server/GeneratedArtifacts
|
||||||
|
**/*.Server/ModelManifest.xml
|
||||||
|
_Pvt_Extensions
|
||||||
|
|
||||||
|
# Paket dependency manager
|
||||||
|
.paket/paket.exe
|
||||||
|
paket-files/
|
||||||
|
|
||||||
|
# FAKE - F# Make
|
||||||
|
.fake/
|
||||||
|
|
||||||
|
# CodeRush personal settings
|
||||||
|
.cr/personal
|
||||||
|
|
||||||
|
# Python Tools for Visual Studio (PTVS)
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Cake - Uncomment if you are using it
|
||||||
|
# tools/**
|
||||||
|
# !tools/packages.config
|
||||||
|
|
||||||
|
# Tabs Studio
|
||||||
|
*.tss
|
||||||
|
|
||||||
|
# Telerik's JustMock configuration file
|
||||||
|
*.jmconfig
|
||||||
|
|
||||||
|
# BizTalk build output
|
||||||
|
*.btp.cs
|
||||||
|
*.btm.cs
|
||||||
|
*.odx.cs
|
||||||
|
*.xsd.cs
|
||||||
|
|
||||||
|
# OpenCover UI analysis results
|
||||||
|
OpenCover/
|
||||||
|
|
||||||
|
# Azure Stream Analytics local run output
|
||||||
|
ASALocalRun/
|
||||||
|
|
||||||
|
# MSBuild Binary and Structured Log
|
||||||
|
*.binlog
|
||||||
|
|
||||||
|
# NVidia Nsight GPU debugger configuration file
|
||||||
|
*.nvuser
|
||||||
|
|
||||||
|
# MFractors (Xamarin productivity tool) working folder
|
||||||
|
.mfractor/
|
||||||
|
|
||||||
|
# Local History for Visual Studio
|
||||||
|
.localhistory/
|
||||||
|
|
||||||
|
# Visual Studio History (VSHistory) files
|
||||||
|
.vshistory/
|
||||||
|
|
||||||
|
# BeatPulse healthcheck temp database
|
||||||
|
healthchecksdb
|
||||||
|
|
||||||
|
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||||
|
MigrationBackup/
|
||||||
|
|
||||||
|
# Ionide (cross platform F# VS Code tools) working folder
|
||||||
|
.ionide/
|
||||||
|
|
||||||
|
# Fody - auto-generated XML schema
|
||||||
|
FodyWeavers.xsd
|
||||||
|
|
||||||
|
# VS Code files for those working on multiple tools
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
*.code-workspace
|
||||||
|
|
||||||
|
# Local History for Visual Studio Code
|
||||||
|
.history/
|
||||||
|
|
||||||
|
# Windows Installer files from build outputs
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# JetBrains Rider
|
||||||
|
*.sln.iml
|
||||||
8
RubiksCube/.idea/.gitignore
generated
vendored
Normal file
8
RubiksCube/.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
8
RubiksCube/.idea/RubiksCube.iml
generated
Normal file
8
RubiksCube/.idea/RubiksCube.iml
generated
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="CPP_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
8
RubiksCube/.idea/modules.xml
generated
Normal file
8
RubiksCube/.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/RubiksCube.iml" filepath="$PROJECT_DIR$/.idea/RubiksCube.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
RubiksCube/.idea/vcs.xml
generated
Normal file
6
RubiksCube/.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
1
RubiksCube/Color.cpp
Normal file
1
RubiksCube/Color.cpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "Color.h"
|
||||||
33
RubiksCube/Color.h
Normal file
33
RubiksCube/Color.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
struct Color {
|
||||||
|
private:
|
||||||
|
|
||||||
|
public:
|
||||||
|
float r, g, b, a;
|
||||||
|
|
||||||
|
constexpr Color(float r, float g, float b, float a) : r(r), g(g), b(b), a(a) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr Color FromRGBA8(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
|
||||||
|
return Color((float)r / 255.0f, (float)g / 255.0f, (float)b / 255.0f, (float)a / 255.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
Color() : r(0.0f), g(0.0f), b(0.0f), a(1.0f) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr Color AQUA() { return Color(0.0f, 0.0f, 0.0f, 1.0f); }
|
||||||
|
static constexpr Color RED() { return Color(1.0f, 0.0f, 0.0f, 1.0f); }
|
||||||
|
static constexpr Color GREEN() { return Color(0.0f, 1.0f, 0.0f, 1.0f); }
|
||||||
|
static constexpr Color BLUE() { return Color(0.0f, 0.0f, 1.0f, 1.0f); }
|
||||||
|
static constexpr Color BLACK() { return Color(0.0f, 0.0f, 0.0f, 1.0f); }
|
||||||
|
static constexpr Color WHITE() { return Color(1.0f, 1.0f, 1.0f, 1.0f); }
|
||||||
|
static constexpr Color MAGENTA() { return Color(1.0f, 0.0f, 1.0f, 1.0f); }
|
||||||
|
static constexpr Color YELLOW() { return Color(1.0f, 1.0f, 0.0f, 1.0f); }
|
||||||
|
static constexpr Color ORANGE() { return FromRGBA8(255, 165, 0, 255); }
|
||||||
|
static constexpr Color TRANSPARENT() { return Color(0.0f, 0.0f, 0.0f, 0.0f); }
|
||||||
|
};
|
||||||
142
RubiksCube/Cube.cpp
Normal file
142
RubiksCube/Cube.cpp
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
#include "Cube.h"
|
||||||
|
|
||||||
|
Cube::Cube()
|
||||||
|
{
|
||||||
|
this->_transform = glm::mat4(1.0f);
|
||||||
|
|
||||||
|
for(int x=-1;x<=1;x++) {
|
||||||
|
for(int y=-1;y<=1;y++) {
|
||||||
|
for(int z=-1;z<=1;z++) {
|
||||||
|
Side side = Side::Forward;
|
||||||
|
|
||||||
|
Color sideColors[6];
|
||||||
|
|
||||||
|
if (x == -1) {
|
||||||
|
sideColors[Side::Left] = SideColor[Side::Left];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x == 1) {
|
||||||
|
sideColors[Side::Right] = SideColor[Side::Right];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y == -1) {
|
||||||
|
sideColors[Side::Bottom] = SideColor[Side::Bottom];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y == 1) {
|
||||||
|
sideColors[Side::Top] = SideColor[Side::Top];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (z == -1) {
|
||||||
|
sideColors[Side::Back] = SideColor[Side::Back];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (z == 1) {
|
||||||
|
sideColors[Side::Forward] = SideColor[Side::Forward];
|
||||||
|
}
|
||||||
|
|
||||||
|
PartitionedCube* cubeAtIndex = new PartitionedCube(glm::vec3(x, y, z), sideColors);
|
||||||
|
|
||||||
|
this->_children[x + 1][y + 1][z + 1] = cubeAtIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Cube::~Cube() {
|
||||||
|
for(int x=0;x<3;x++) {
|
||||||
|
for(int y=0;y<3;y++) {
|
||||||
|
for(int z=0;z<3;z++) {
|
||||||
|
delete _children[x][y][z];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cube::Update(double deltaTime) {
|
||||||
|
for(int x=0;x<3;x++) {
|
||||||
|
for(int y=0;y<3;y++) {
|
||||||
|
for(int z=0;z<3;z++) {
|
||||||
|
_children[x][y][z]->Update(deltaTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cube::Transform(glm::mat4 transform) {
|
||||||
|
this->_transform *= transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cube::_FindAxisChildren(const glm::ivec3& axis, int index, std::vector<glm::ivec3>& result) const {
|
||||||
|
glm::ivec3 orientationBuffer[3] = {
|
||||||
|
axis,
|
||||||
|
glm::ivec3(axis[1], axis[2], axis[0]),
|
||||||
|
glm::ivec3(axis[2], axis[0], axis[1])
|
||||||
|
};
|
||||||
|
|
||||||
|
for(int x = -1;x<=1;x++) {
|
||||||
|
for(int y = -1;y<=1;y++) {
|
||||||
|
glm::ivec3 position = axis * index + orientationBuffer[1] * x + orientationBuffer[2] * y;
|
||||||
|
|
||||||
|
result.push_back(position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cube::_TransformData(const glm::ivec3& axis, int index, const glm::mat3& transform) {
|
||||||
|
PartitionedCube* previousCubeList[3][3][3];
|
||||||
|
memcpy(previousCubeList, this->_children, sizeof(this->_children));
|
||||||
|
|
||||||
|
std::vector<glm::ivec3> result;
|
||||||
|
|
||||||
|
_FindAxisChildren(axis, index, result);
|
||||||
|
|
||||||
|
for(auto& position : result) {
|
||||||
|
glm::ivec3 newPosition = transform * position;
|
||||||
|
|
||||||
|
position += glm::ivec3(1);
|
||||||
|
newPosition += glm::ivec3(1);
|
||||||
|
|
||||||
|
_children[newPosition.x][newPosition.y][newPosition.z] = previousCubeList[position.x][position.y][position.z];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cube::Transform(const glm::ivec3& axis, int index, const glm::mat3& transform) {
|
||||||
|
_TransformData(axis, index, transform);
|
||||||
|
|
||||||
|
std::vector<glm::ivec3> result;
|
||||||
|
|
||||||
|
_FindAxisChildren(transform * axis, index, result);
|
||||||
|
|
||||||
|
for(auto& position : result) {
|
||||||
|
PartitionedCube* cube = _children[position.x + 1][position.y + 1][position.z + 1];
|
||||||
|
|
||||||
|
cube->Transform(glm::mat4(transform));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cube::TransformTemp(const glm::ivec3& axis, int index, const glm::mat3& transform) {
|
||||||
|
std::vector<glm::ivec3> result;
|
||||||
|
|
||||||
|
_FindAxisChildren(axis, index, result);
|
||||||
|
|
||||||
|
for(auto& position : result) {
|
||||||
|
PartitionedCube* cube = _children[position.x + 1][position.y + 1][position.z + 1];
|
||||||
|
|
||||||
|
cube->Transform(glm::mat4(transform));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cube::TransformAnimation(const glm::ivec3& axis, int index, const glm::mat3& transform, float duration) {
|
||||||
|
_TransformData(axis, index, transform);
|
||||||
|
|
||||||
|
std::vector<glm::ivec3> result;
|
||||||
|
|
||||||
|
_FindAxisChildren(transform * axis, index, result);
|
||||||
|
|
||||||
|
for(auto& position : result) {
|
||||||
|
PartitionedCube* cube = _children[position.x + 1][position.y + 1][position.z + 1];
|
||||||
|
|
||||||
|
cube->TransformAnimation(glm::mat4(transform), duration);
|
||||||
|
}
|
||||||
|
}
|
||||||
43
RubiksCube/Cube.h
Normal file
43
RubiksCube/Cube.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <glm.hpp>
|
||||||
|
|
||||||
|
#include "PartitionedCube.h"
|
||||||
|
|
||||||
|
// Colors according to https://ruwix.com/the-rubiks-cube/japanese-western-color-schemes/
|
||||||
|
class Cube
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
glm::mat4 _transform;
|
||||||
|
|
||||||
|
PartitionedCube* _children[3][3][3];
|
||||||
|
|
||||||
|
void _TransformData(const glm::ivec3& axis, int index, const glm::mat3& transform);
|
||||||
|
|
||||||
|
void _FindAxisChildren(const glm::ivec3& axis, int index, std::vector<glm::ivec3>& result) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Cube();
|
||||||
|
~Cube();
|
||||||
|
|
||||||
|
void Update(double deltaTime);
|
||||||
|
|
||||||
|
const int ChildPartitionsCount = 27;
|
||||||
|
PartitionedCube** Children() { return &(_children[0][0][0]); }
|
||||||
|
|
||||||
|
const glm::mat4& Transform() const { return _transform; }
|
||||||
|
|
||||||
|
void TransformAnimation(const glm::ivec3& axis, int index, const glm::mat3& transform, float duration);
|
||||||
|
void Transform(const glm::ivec3& axis, int index, const glm::mat3& transform);
|
||||||
|
void TransformTemp(const glm::ivec3& axis, int index, const glm::mat3& transform);
|
||||||
|
void Transform(glm::mat4 transform);
|
||||||
|
|
||||||
|
static constexpr Color SideColor[6] = {
|
||||||
|
Color::ORANGE(),
|
||||||
|
Color::RED(),
|
||||||
|
Color::YELLOW(),
|
||||||
|
Color::WHITE(),
|
||||||
|
Color::GREEN(),
|
||||||
|
Color::BLUE()
|
||||||
|
};
|
||||||
|
};
|
||||||
1
RubiksCube/GameInterface.cpp
Normal file
1
RubiksCube/GameInterface.cpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "GameInterface.h"
|
||||||
18
RubiksCube/GameInterface.h
Normal file
18
RubiksCube/GameInterface.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
struct GLFWwindow;
|
||||||
|
|
||||||
|
class GameInterface
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void Initialize() { };
|
||||||
|
virtual void Initialize(GLFWwindow* window) { Initialize(); };
|
||||||
|
|
||||||
|
virtual void Update(float deltaTime) { };
|
||||||
|
virtual void Render(float aspectRatio) { };
|
||||||
|
|
||||||
|
virtual void ClearResources() { };
|
||||||
|
};
|
||||||
|
|
||||||
70
RubiksCube/InputSystem.cpp
Normal file
70
RubiksCube/InputSystem.cpp
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#include "InputSystem.h"
|
||||||
|
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <glm.hpp>
|
||||||
|
|
||||||
|
#include <ext.hpp>
|
||||||
|
|
||||||
|
void InputSystem::ObserveKey(int key) {
|
||||||
|
_keyCodeDictionaryObserver.emplace(key, KeyObserver(_window, key));
|
||||||
|
}
|
||||||
|
|
||||||
|
void InputSystem::Update() {
|
||||||
|
for(auto& observer : _keyCodeDictionaryObserver) {
|
||||||
|
observer.second.Update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InputSystem::SetWindow(GLFWwindow* window) {
|
||||||
|
_window = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InputSystem::IsLeftMouseDown() const
|
||||||
|
{
|
||||||
|
return glfwGetMouseButton(_window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InputSystem::IsRightMouseDown() const
|
||||||
|
{
|
||||||
|
return glfwGetMouseButton(_window, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InputSystem::GetMousePos(glm::vec2& position) const
|
||||||
|
{
|
||||||
|
double x, y;
|
||||||
|
|
||||||
|
glfwGetCursorPos(_window, &x, &y);
|
||||||
|
|
||||||
|
position.x = x;
|
||||||
|
position.y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InputSystem::GetPickingRay(const glm::mat4& transform, glm::vec3& startingPoint, glm::vec3& direction) const {
|
||||||
|
glm::vec2 screenSpacePosition;
|
||||||
|
GetMousePos(screenSpacePosition);
|
||||||
|
|
||||||
|
int screenWidth, screenHeight;
|
||||||
|
glfwGetFramebufferSize(_window, &screenWidth, &screenHeight);
|
||||||
|
|
||||||
|
glm::vec2 clipSpacePosition = glm::vec2(
|
||||||
|
( screenSpacePosition.x / screenWidth ) * 2.0 - 1.0,
|
||||||
|
1.0 - ( screenSpacePosition.y / screenHeight ) * 2.0
|
||||||
|
);
|
||||||
|
|
||||||
|
glm::vec4 nearPoint = glm::vec4(clipSpacePosition.x, clipSpacePosition.y, 0.01f, 1.0f);
|
||||||
|
glm::vec4 farPoint = nearPoint;
|
||||||
|
farPoint.z = 0.99f;
|
||||||
|
|
||||||
|
glm::mat4 inverse = glm::inverse(transform);
|
||||||
|
nearPoint = inverse * nearPoint;
|
||||||
|
farPoint = inverse * farPoint;
|
||||||
|
|
||||||
|
nearPoint /= nearPoint.w;
|
||||||
|
farPoint /= farPoint.w;
|
||||||
|
|
||||||
|
startingPoint = nearPoint;
|
||||||
|
direction = farPoint - nearPoint;
|
||||||
|
}
|
||||||
39
RubiksCube/InputSystem.h
Normal file
39
RubiksCube/InputSystem.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
#include <glm.hpp>
|
||||||
|
|
||||||
|
#include "KeyObserver.h"
|
||||||
|
|
||||||
|
struct KeyState {
|
||||||
|
bool IsPressed;
|
||||||
|
bool WasPressed;
|
||||||
|
bool WasReleased;
|
||||||
|
};
|
||||||
|
|
||||||
|
class InputSystem
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
GLFWwindow* _window;
|
||||||
|
|
||||||
|
std::map<int, KeyObserver> _keyCodeDictionaryObserver;
|
||||||
|
|
||||||
|
public:
|
||||||
|
InputSystem() { _window = nullptr; }
|
||||||
|
|
||||||
|
void ObserveKey(int key);
|
||||||
|
void Update();
|
||||||
|
void SetWindow(GLFWwindow* window);
|
||||||
|
|
||||||
|
bool IsLeftMouseDown() const;
|
||||||
|
bool IsRightMouseDown() const;
|
||||||
|
|
||||||
|
void GetMousePos(glm::vec2& position) const;
|
||||||
|
void GetPickingRay(const glm::mat4& tansform, glm::vec3& startingPoint, glm::vec3& direction) const;
|
||||||
|
|
||||||
|
|
||||||
|
bool IsKeyPressed(int key) { return _keyCodeDictionaryObserver[key].IsPressed; }
|
||||||
|
bool WasKeyPressed(int key) { return _keyCodeDictionaryObserver[key].WasPressed; }
|
||||||
|
bool WasKeyReleased(int key) { return _keyCodeDictionaryObserver[key].WasReleased; }
|
||||||
|
};
|
||||||
23
RubiksCube/KeyObserver.cpp
Normal file
23
RubiksCube/KeyObserver.cpp
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#include "KeyObserver.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
KeyObserver::KeyObserver(GLFWwindow* window, int keyCode)
|
||||||
|
{
|
||||||
|
_window = window;
|
||||||
|
_key = keyCode;
|
||||||
|
|
||||||
|
IsPressed = false;
|
||||||
|
WasPressed = false;
|
||||||
|
WasReleased = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeyObserver::Update() {
|
||||||
|
bool isPressed = glfwGetKey(_window, _key) == GLFW_PRESS;
|
||||||
|
|
||||||
|
WasPressed = isPressed && !IsPressed;
|
||||||
|
WasReleased = !isPressed && IsPressed;
|
||||||
|
IsPressed = isPressed;
|
||||||
|
}
|
||||||
20
RubiksCube/KeyObserver.h
Normal file
20
RubiksCube/KeyObserver.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
struct GLFWwindow;
|
||||||
|
|
||||||
|
class KeyObserver
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
GLFWwindow* _window;
|
||||||
|
int _key;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool IsPressed;
|
||||||
|
bool WasPressed;
|
||||||
|
bool WasReleased;
|
||||||
|
|
||||||
|
KeyObserver() : _window(nullptr), _key(-1) { }
|
||||||
|
KeyObserver(GLFWwindow* window, int keyCode);
|
||||||
|
|
||||||
|
void Update();
|
||||||
|
};
|
||||||
1
RubiksCube/MeshData.h
Normal file
1
RubiksCube/MeshData.h
Normal file
@ -0,0 +1 @@
|
|||||||
|
#pragma once
|
||||||
0
RubiksCube/PartialCube.cpp
Normal file
0
RubiksCube/PartialCube.cpp
Normal file
0
RubiksCube/PartialCube.h
Normal file
0
RubiksCube/PartialCube.h
Normal file
78
RubiksCube/PartitionedCube.cpp
Normal file
78
RubiksCube/PartitionedCube.cpp
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#include "PartitionedCube.h"
|
||||||
|
|
||||||
|
#include "Cube.h"
|
||||||
|
|
||||||
|
#include <glm.hpp>
|
||||||
|
#include <ext.hpp>
|
||||||
|
|
||||||
|
PartitionedCube::PartitionedCube(const glm::vec3& position, Color* sideColors) : _faces {
|
||||||
|
sideColors[0],
|
||||||
|
sideColors[1],
|
||||||
|
sideColors[2],
|
||||||
|
sideColors[3],
|
||||||
|
sideColors[4],
|
||||||
|
sideColors[5],
|
||||||
|
}
|
||||||
|
{
|
||||||
|
this->_transform = glm::translate(glm::mat4(1.0f), position);
|
||||||
|
_animationTime = 0.0f;
|
||||||
|
_animationTimeExtend = 0.0f;
|
||||||
|
_animationTransformInvoke = _transform;
|
||||||
|
_animationTransform = glm::quat(1.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
_animationFinished = true;
|
||||||
|
|
||||||
|
for(int axis=0;axis<3;axis++) {
|
||||||
|
float factor = 1.0f * -1;
|
||||||
|
|
||||||
|
for(int reverse=0;reverse<2;reverse++) {
|
||||||
|
glm::vec3 x, y, z, v;
|
||||||
|
|
||||||
|
x = glm::vec3(0.0f);
|
||||||
|
y = glm::vec3(0.0f);
|
||||||
|
z = glm::vec3(0.0f);
|
||||||
|
|
||||||
|
z[axis] = factor;
|
||||||
|
x[(axis+1)%3] = 1.0f;
|
||||||
|
y[(axis+2)%3] = 1.0f;
|
||||||
|
|
||||||
|
glm::vec3 v0 = x * 0.5f + y * 0.5f + 0.5f * z;
|
||||||
|
glm::vec3 v1 = x * -0.5f + y * 0.5f + 0.5f * z;
|
||||||
|
glm::vec3 v2 = x * 0.5f + y * -0.5f + 0.5f * z;
|
||||||
|
glm::vec3 v3 = x * -0.5f + y * -0.5f + 0.5f * z;
|
||||||
|
|
||||||
|
int s = 2 * axis + reverse; // (-x, +x, -y, +y, -z, +z)
|
||||||
|
|
||||||
|
_meshData.addFace(v0, v1, v2, v3, sideColors[s]);
|
||||||
|
|
||||||
|
factor = -factor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PartitionedCube::Update(double deltaTime) {
|
||||||
|
this->_animationTime -= deltaTime;
|
||||||
|
|
||||||
|
if (!_animationFinished && _animationTime <= 0.0f) {
|
||||||
|
_animationFinished = true;
|
||||||
|
|
||||||
|
_transform = glm::mat4_cast(_animationTransform) * _animationTransformInvoke;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PartitionedCube::Transform(glm::mat4 transformation)
|
||||||
|
{
|
||||||
|
this->_transform = transformation * this->_transform;
|
||||||
|
_animationTransformInvoke = transformation * _animationTransformInvoke;
|
||||||
|
_animationTransform = glm::quat_cast(transformation * glm::mat4_cast(_animationTransform));
|
||||||
|
}
|
||||||
|
|
||||||
|
void PartitionedCube::TransformAnimation(const glm::mat4& transform, float duration) {
|
||||||
|
if (!_animationFinished)
|
||||||
|
_transform = glm::mat4_cast(_animationTransform) * _animationTransformInvoke;
|
||||||
|
|
||||||
|
this->_animationTransformInvoke = this->_transform;
|
||||||
|
this->_animationTransform = glm::quat_cast(transform);
|
||||||
|
this->_animationTime = duration;
|
||||||
|
this->_animationTimeExtend = duration;
|
||||||
|
_animationFinished = false;
|
||||||
|
}
|
||||||
100
RubiksCube/PartitionedCube.h
Normal file
100
RubiksCube/PartitionedCube.h
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Color.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <glm.hpp>
|
||||||
|
#include <ext.hpp>
|
||||||
|
#include <ext/quaternion_float.hpp>
|
||||||
|
#include <math.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
struct VertexData {
|
||||||
|
glm::vec3 position;
|
||||||
|
Color color;
|
||||||
|
|
||||||
|
VertexData() : position(glm::vec3(0.0f, 0.0f, 0.0f)), color(Color::WHITE()) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
VertexData(const glm::vec3& position, Color color) : position(position), color(color) {
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MeshData {
|
||||||
|
int vertexIndex;
|
||||||
|
std::vector<VertexData> data;
|
||||||
|
int triangleIndex;
|
||||||
|
|
||||||
|
MeshData() {
|
||||||
|
vertexIndex = 0;
|
||||||
|
triangleIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addTriangle(glm::vec3 v0, glm::vec3 v1, glm::vec3 v2, Color color) {
|
||||||
|
data.push_back(VertexData(v0, color));
|
||||||
|
data.push_back(VertexData(v1, color));
|
||||||
|
data.push_back(VertexData(v2, color));
|
||||||
|
vertexIndex += 3;
|
||||||
|
|
||||||
|
triangleIndex ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addFace(glm::vec3 v0, glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, Color color) {
|
||||||
|
addTriangle(v0, v1, v2, color);
|
||||||
|
addTriangle(v3, v2, v1, color);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Side {
|
||||||
|
Left, Right, Bottom, Top, Back, Forward
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr glm::vec3 SideToDirection[6] = {
|
||||||
|
glm::vec3(-1.0f, 0.0f, 0.0f),
|
||||||
|
glm::vec3(1.0f, 0.0f, 0.0f),
|
||||||
|
glm::vec3(0.0f, -1.0f, 0.0f),
|
||||||
|
glm::vec3(0.0f, 1.0f, 0.0f),
|
||||||
|
glm::vec3(0.0f, 0.0f, -1.0f),
|
||||||
|
glm::vec3(0.0f, 0.0f, 1.0f),
|
||||||
|
};
|
||||||
|
|
||||||
|
class PartitionedCube
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
glm::mat4 _transform;
|
||||||
|
|
||||||
|
glm::mat4 _animationTransformInvoke;
|
||||||
|
glm::quat _animationTransform;
|
||||||
|
float _animationTime;
|
||||||
|
float _animationTimeExtend;
|
||||||
|
bool _animationFinished;
|
||||||
|
|
||||||
|
Color _faces[6];
|
||||||
|
MeshData _meshData;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PartitionedCube(const glm::vec3& position, Color sideColors[6]);
|
||||||
|
|
||||||
|
void Update(double deltaTime);
|
||||||
|
|
||||||
|
const glm::mat4 Transform() const {
|
||||||
|
// Need to use slerp since rotations are non-linear and would not interpolate this way
|
||||||
|
if (false == _animationFinished) {
|
||||||
|
float lerpFactor = 1.0f - ( _animationTime / _animationTimeExtend);
|
||||||
|
|
||||||
|
glm::mat4 animationView = glm::mat4_cast(glm::slerp(glm::quat(1.0f, 0.0f, 0.0f, 0.0f), _animationTransform, lerpFactor));
|
||||||
|
|
||||||
|
return animationView * _animationTransformInvoke;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
const MeshData& MeshData() const { return _meshData; };
|
||||||
|
|
||||||
|
void Transform(glm::mat4 transformation);
|
||||||
|
void TransformAnimation(const glm::mat4& transform, float duration);
|
||||||
|
};
|
||||||
21
RubiksCube/Plane.cpp
Normal file
21
RubiksCube/Plane.cpp
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#include "Plane.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Plane::Plane(const glm::mat4& transform, int axis, int direction) {
|
||||||
|
// -x, +x, -y, +y, -z, +z
|
||||||
|
glm::vec3 worldNormal = glm::vec3(0.0f);
|
||||||
|
worldNormal[axis] = 1.0f;
|
||||||
|
worldNormal *= direction;
|
||||||
|
|
||||||
|
glm::vec4 origin = transform * glm::vec4(( worldNormal * 1.5f ), 1.0f);
|
||||||
|
|
||||||
|
glm::vec3 worldU = glm::vec3(worldNormal[1], worldNormal[2], worldNormal[0]);
|
||||||
|
glm::vec3 worldV = glm::vec3(worldNormal[2], worldNormal[0], worldNormal[1]);
|
||||||
|
|
||||||
|
glm::vec3 planeNormal = transform * glm::vec4(worldNormal, 0.0f);
|
||||||
|
glm::vec3 planeU = transform * glm::vec4(worldU, 0.0f);
|
||||||
|
glm::vec3 planeV = transform * glm::vec4(worldV, 0.0f);
|
||||||
|
|
||||||
|
_transform = glm::mat4(glm::vec4(planeU, 0.0f), glm::vec4(planeV, 0.0f), glm::vec4(planeNormal, 0.0f), origin);
|
||||||
|
}
|
||||||
21
RubiksCube/Plane.h
Normal file
21
RubiksCube/Plane.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <glm.hpp>
|
||||||
|
|
||||||
|
class Plane
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
glm::mat4 _transform;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Plane() : _transform(1.0f) { }
|
||||||
|
Plane(const glm::mat4& transform, int axis, int direction);
|
||||||
|
|
||||||
|
const glm::mat4& Transform() { return _transform; }
|
||||||
|
|
||||||
|
glm::vec4 Origin() { return _transform * glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); }
|
||||||
|
glm::vec3 Normal() { return _transform * glm::vec4(0.0f, 0.0f, 1.0f, 0.0f); }
|
||||||
|
glm::vec3 U() { return _transform * glm::vec4(1.0f, 0.0f, 0.0f, 0.0f); }
|
||||||
|
glm::vec3 V() { return _transform * glm::vec4(0.0f, 1.0f, 0.0f, 0.0f); }
|
||||||
|
};
|
||||||
|
|
||||||
114
RubiksCube/RubiksCube.cpp
Normal file
114
RubiksCube/RubiksCube.cpp
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#define GLEW_STATIC
|
||||||
|
|
||||||
|
#include <GL/glew.h>
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
#include "GameInterface.h"
|
||||||
|
#include "SceneInterface.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SceneInterface sceneInterface;
|
||||||
|
|
||||||
|
GameInterface* gUsedInterface;
|
||||||
|
|
||||||
|
GLFWwindow* InitializeSystem() {
|
||||||
|
glfwInit();
|
||||||
|
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||||
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
|
|
||||||
|
GLFWwindow* window = glfwCreateWindow(1024, 768, "Rubiks Cube", nullptr, nullptr);
|
||||||
|
|
||||||
|
glfwMakeContextCurrent(window);
|
||||||
|
|
||||||
|
glewExperimental = GL_TRUE;
|
||||||
|
|
||||||
|
glewInit();
|
||||||
|
|
||||||
|
gUsedInterface->Initialize(window);
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RunCoreLoop(GLFWwindow* window) {
|
||||||
|
double lastTime = glfwGetTime();
|
||||||
|
double deltaTime = 0.0;
|
||||||
|
|
||||||
|
while(!glfwWindowShouldClose(window)) {
|
||||||
|
glfwPollEvents();
|
||||||
|
|
||||||
|
gUsedInterface->Update(deltaTime);
|
||||||
|
|
||||||
|
int screenWidth;
|
||||||
|
int screenHeight;
|
||||||
|
|
||||||
|
glfwGetFramebufferSize(window, &screenWidth, &screenHeight);
|
||||||
|
|
||||||
|
float aspectRatio = (float)screenWidth / (float)screenHeight;
|
||||||
|
|
||||||
|
glViewport(0, 0, screenWidth, screenHeight);
|
||||||
|
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
glDepthFunc(GL_LEQUAL);
|
||||||
|
|
||||||
|
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
gUsedInterface->Render(aspectRatio);
|
||||||
|
|
||||||
|
glfwSwapBuffers(window);
|
||||||
|
|
||||||
|
double currentTime = glfwGetTime();
|
||||||
|
deltaTime = currentTime - lastTime;
|
||||||
|
lastTime = currentTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShutdownSystem() {
|
||||||
|
gUsedInterface->ClearResources();
|
||||||
|
glfwTerminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
gUsedInterface = &sceneInterface;
|
||||||
|
|
||||||
|
GLFWwindow* window = InitializeSystem();
|
||||||
|
|
||||||
|
RunCoreLoop(window);
|
||||||
|
|
||||||
|
ShutdownSystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
int main() {
|
||||||
|
std::cout << "Wonderfulnesolino!\n";
|
||||||
|
|
||||||
|
gUsedInterface = &sceneInterface;
|
||||||
|
|
||||||
|
GLFWwindow* window = InitializeSystem();
|
||||||
|
|
||||||
|
RunCoreLoop(window);
|
||||||
|
|
||||||
|
ShutdownSystem();
|
||||||
|
}
|
||||||
|
*/
|
||||||
31
RubiksCube/RubiksCube.sln
Normal file
31
RubiksCube/RubiksCube.sln
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.9.34616.47
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RubiksCube", "RubiksCube.vcxproj", "{87EDB22B-5B80-4231-8B84-DF8AB061CCF0}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Debug|x86 = Debug|x86
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
Release|x86 = Release|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{87EDB22B-5B80-4231-8B84-DF8AB061CCF0}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{87EDB22B-5B80-4231-8B84-DF8AB061CCF0}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{87EDB22B-5B80-4231-8B84-DF8AB061CCF0}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{87EDB22B-5B80-4231-8B84-DF8AB061CCF0}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{87EDB22B-5B80-4231-8B84-DF8AB061CCF0}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{87EDB22B-5B80-4231-8B84-DF8AB061CCF0}.Release|x64.Build.0 = Release|x64
|
||||||
|
{87EDB22B-5B80-4231-8B84-DF8AB061CCF0}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{87EDB22B-5B80-4231-8B84-DF8AB061CCF0}.Release|x86.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {ABE3B0EF-7548-4BB8-B17A-2B583693FE75}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
182
RubiksCube/RubiksCube.vcxproj
Normal file
182
RubiksCube/RubiksCube.vcxproj
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>17.0</VCProjectVersion>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<ProjectGuid>{87edb22b-5b80-4231-8b84-df8ab061ccf0}</ProjectGuid>
|
||||||
|
<RootNamespace>RubiksCube</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ExternalIncludePath>$(SolutionDir)/../ExternalResources/glew/include;$(SolutionDir)/../ExternalResources/glfw/include;$(SolutionDir)/../ExternalResources/glm/glm;$(SolutionDir)/../ExternalResources/stb;$(ExternalIncludePath)</ExternalIncludePath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ExternalIncludePath>$(SolutionDir)/../ExternalResources/glew/include;$(SolutionDir)/../ExternalResources/glfw/include;$(SolutionDir)/../ExternalResources/glm/glm;$(SolutionDir)/../ExternalResources/stb;$(ExternalIncludePath)</ExternalIncludePath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalLibraryDirectories>$(SolutionDir)/../ExternalResources/glew/lib/Release/x64;$(SolutionDir)/../ExternalResources/glfw/lib-vc2019;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>opengl32.lib;glfw3.lib;glew32s.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalLibraryDirectories>$(SolutionDir)/../ExternalResources/glew/lib/Release/x64;$(SolutionDir)/../ExternalResources/glfw/lib-vc2019;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>opengl32.lib;glfw3.lib;glew32s.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="Color.cpp" />
|
||||||
|
<ClCompile Include="Cube.cpp" />
|
||||||
|
<ClCompile Include="GameInterface.cpp" />
|
||||||
|
<ClCompile Include="InputSystem.cpp" />
|
||||||
|
<ClCompile Include="KeyObserver.cpp" />
|
||||||
|
<ClCompile Include="PartitionedCube.cpp" />
|
||||||
|
<ClCompile Include="Plane.cpp" />
|
||||||
|
<ClCompile Include="RubiksCube.cpp" />
|
||||||
|
<ClCompile Include="SceneInterface.cpp" />
|
||||||
|
<ClCompile Include="Shader.cpp" />
|
||||||
|
<ClCompile Include="ShaderUtil.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="Color.h" />
|
||||||
|
<ClInclude Include="Cube.h" />
|
||||||
|
<ClInclude Include="GameInterface.h" />
|
||||||
|
<ClInclude Include="InputSystem.h" />
|
||||||
|
<ClInclude Include="KeyObserver.h" />
|
||||||
|
<ClInclude Include="MeshData.h" />
|
||||||
|
<ClInclude Include="PartitionedCube.h" />
|
||||||
|
<ClInclude Include="Plane.h" />
|
||||||
|
<ClInclude Include="SceneInterface.h" />
|
||||||
|
<ClInclude Include="Shader.h" />
|
||||||
|
<ClInclude Include="ShaderUtil.h" />
|
||||||
|
<ClInclude Include="Side.h" />
|
||||||
|
<ClInclude Include="VertexData.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<CopyFileToFolders Include="cube.frag">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
|
||||||
|
<FileType>Document</FileType>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
|
||||||
|
</CopyFileToFolders>
|
||||||
|
<CopyFileToFolders Include="cube.vert">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
|
||||||
|
<FileType>Document</FileType>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
|
||||||
|
</CopyFileToFolders>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
||||||
104
RubiksCube/RubiksCube.vcxproj.filters
Normal file
104
RubiksCube/RubiksCube.vcxproj.filters
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Quelldateien">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Headerdateien">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Ressourcendateien">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Shaders">
|
||||||
|
<UniqueIdentifier>{e0ac6084-492f-4bb0-889c-7fc5792b3c94}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="RubiksCube.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GameInterface.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Cube.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="PartitionedCube.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="SceneInterface.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Color.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Shader.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ShaderUtil.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="KeyObserver.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="InputSystem.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Plane.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="GameInterface.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Cube.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="PartitionedCube.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="SceneInterface.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Color.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Shader.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="VertexData.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="MeshData.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Side.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ShaderUtil.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="KeyObserver.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="InputSystem.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Plane.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<CopyFileToFolders Include="cube.frag">
|
||||||
|
<Filter>Shaders</Filter>
|
||||||
|
</CopyFileToFolders>
|
||||||
|
<CopyFileToFolders Include="cube.vert">
|
||||||
|
<Filter>Shaders</Filter>
|
||||||
|
</CopyFileToFolders>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
391
RubiksCube/SceneInterface.cpp
Normal file
391
RubiksCube/SceneInterface.cpp
Normal file
@ -0,0 +1,391 @@
|
|||||||
|
#include "SceneInterface.h"
|
||||||
|
|
||||||
|
#include "ShaderUtil.h"
|
||||||
|
|
||||||
|
#include "PartitionedCube.h"
|
||||||
|
|
||||||
|
#include "Plane.h"
|
||||||
|
|
||||||
|
#include <glm.hpp>
|
||||||
|
#include <ext.hpp>
|
||||||
|
#include <gtx/string_cast.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
void SceneInterface::Initialize(GLFWwindow* window)
|
||||||
|
{
|
||||||
|
_inputSystem.SetWindow(window);
|
||||||
|
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_SPACE);
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_UP);
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_DOWN);
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_LEFT);
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_RIGHT);
|
||||||
|
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_LEFT_SHIFT);
|
||||||
|
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_KP_1);
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_KP_2);
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_KP_3);
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_KP_4);
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_KP_5);
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_KP_6);
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_KP_7);
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_KP_8);
|
||||||
|
_inputSystem.ObserveKey(GLFW_KEY_KP_9);
|
||||||
|
|
||||||
|
_wasMouseDown = false;
|
||||||
|
|
||||||
|
this->_shaderProgram = ShaderUtil::CreateShaderProgram("cube.vert", "cube.frag");
|
||||||
|
this->_transformLocation = glGetUniformLocation(this->_shaderProgram, "transformation");
|
||||||
|
|
||||||
|
glGenVertexArrays(1, &this->_arrayBufferObject);
|
||||||
|
glGenBuffers(1, &this->_vertexBufferObject);
|
||||||
|
|
||||||
|
glBindVertexArray(_arrayBufferObject);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, this->_vertexBufferObject);
|
||||||
|
|
||||||
|
glVertexAttribPointer(glGetAttribLocation(_shaderProgram, "position"), 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (void*)offsetof(VertexData, position));
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
glVertexAttribPointer(glGetAttribLocation(_shaderProgram, "color"), 4, GL_FLOAT, GL_FALSE, sizeof(VertexData), (void*)offsetof(VertexData, color));
|
||||||
|
glEnableVertexAttribArray(1);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec3 basisCoordinateVectors[] = {
|
||||||
|
glm::vec3(1.0f, 0.0f, 0.0f),
|
||||||
|
glm::vec3(0.0f, 1.0f, 0.0f),
|
||||||
|
glm::vec3(0.0f, 0.0f, 1.0f)
|
||||||
|
};
|
||||||
|
|
||||||
|
glm::ivec3 orthogonalise(const glm::vec3& value) {
|
||||||
|
int minimum = 0;
|
||||||
|
for(int i=0;i<3;i++) {
|
||||||
|
if (abs(value[i])>abs(value[minimum]))
|
||||||
|
minimum = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::ivec3 orthogon = glm::vec3(0.0f);
|
||||||
|
|
||||||
|
orthogon[minimum] = glm::sign(value[minimum]);
|
||||||
|
|
||||||
|
return orthogon;
|
||||||
|
}
|
||||||
|
|
||||||
|
void roundAllScalars(glm::mat3& transforms) {
|
||||||
|
for(int x=0;x<3;x++) {
|
||||||
|
for(int y=0;y<3;y++) {
|
||||||
|
transforms[x][y] = round(transforms[x][y]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::imat3x3 orthogonaliseMatrix(const glm::mat3& value) {
|
||||||
|
glm::mat3 temp = value;
|
||||||
|
|
||||||
|
roundAllScalars(temp);
|
||||||
|
|
||||||
|
glm::imat3x3 result;
|
||||||
|
|
||||||
|
for(int i=0;i<3;i++) {
|
||||||
|
result[i] = orthogonalise(value[i]);
|
||||||
|
|
||||||
|
for(int adjacent=i+1;adjacent<3;adjacent++) {
|
||||||
|
result[adjacent] = result[adjacent] * ( glm::abs(result[i]) * - 1 ) + 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntersectLinePlane(const glm::vec3& lineStart, const glm::vec3& lineDirection, const glm::vec3& planeOrigin, const glm::vec3& planeNormal, float& distance) {
|
||||||
|
glm::vec3 w = lineStart - planeOrigin;
|
||||||
|
|
||||||
|
float intersectionDistance = glm::dot(planeOrigin - lineStart, planeNormal) / glm::dot(lineDirection, planeNormal);
|
||||||
|
if (intersectionDistance > 0) {
|
||||||
|
distance = intersectionDistance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SceneInterface::EnqueueAction(const Action& action) {
|
||||||
|
_actions.push(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SceneInterface::Update(float deltaTime)
|
||||||
|
{
|
||||||
|
_cube.Update(deltaTime);
|
||||||
|
_inputSystem.Update();
|
||||||
|
|
||||||
|
if (_inputSystem.WasKeyPressed(GLFW_KEY_SPACE))
|
||||||
|
_orientation = glm::quat(1.0f, glm::vec3(0.0f, 0.0f, 0.0f));
|
||||||
|
|
||||||
|
glm::fvec2 velocity(0.0f, 0.0f);
|
||||||
|
if (_inputSystem.IsKeyPressed(GLFW_KEY_UP))
|
||||||
|
velocity.x = glm::radians(90.0f);
|
||||||
|
if (_inputSystem.IsKeyPressed(GLFW_KEY_DOWN))
|
||||||
|
velocity.x = glm::radians(-90.0f);
|
||||||
|
|
||||||
|
if (_inputSystem.IsKeyPressed(GLFW_KEY_RIGHT))
|
||||||
|
velocity.y = glm::radians(90.0f);
|
||||||
|
if (_inputSystem.IsKeyPressed(GLFW_KEY_LEFT))
|
||||||
|
velocity.y = glm::radians(-90.0f);
|
||||||
|
|
||||||
|
glm::quat velocityQuaternion = glm::quat(0.0f, glm::vec3(velocity.x, velocity.y, 0.0f));
|
||||||
|
|
||||||
|
_orientation += 0.5f * (float)deltaTime * velocityQuaternion * _orientation;
|
||||||
|
_orientation = glm::normalize(_orientation);
|
||||||
|
|
||||||
|
// int spinIndex = 0;
|
||||||
|
|
||||||
|
// Gather Axis (+x, +y)
|
||||||
|
glm::ivec3 spinAxis;
|
||||||
|
if (_inputSystem.IsKeyPressed(GLFW_KEY_LEFT_SHIFT))
|
||||||
|
spinAxis = glm::ivec3(1, 0, 0);
|
||||||
|
else
|
||||||
|
spinAxis = glm::ivec3(0, 1, 0);
|
||||||
|
|
||||||
|
// Numpad
|
||||||
|
int rotationKey = -1;
|
||||||
|
for(int i=1;i<10;i++) {
|
||||||
|
if (_inputSystem.WasKeyPressed(GLFW_KEY_KP_0 + i)) {
|
||||||
|
rotationKey = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rotationKey != -1) {
|
||||||
|
bool reverseVertical = spinAxis.x == 1 && (rotationKey == 7 || rotationKey == 8 || rotationKey == 9);
|
||||||
|
bool reverseHorizontal = spinAxis.y == 1 && (rotationKey == 1 || rotationKey == 4 || rotationKey == 7);
|
||||||
|
|
||||||
|
static const int keyToIndex[2][9] = { { -1, 0, 1, 0, 0, 0, -1, 0, 1 }, { -1, 0, -1, 0, 0, 0, 1, 0, 1 } };
|
||||||
|
|
||||||
|
bool reverse = reverseVertical || reverseHorizontal;
|
||||||
|
|
||||||
|
// spin which lookup
|
||||||
|
int axisIndex = spinAxis.x == 0; // x => 0, y => 1
|
||||||
|
int spinIndex = keyToIndex[axisIndex][rotationKey - 1];
|
||||||
|
|
||||||
|
if (reverse)
|
||||||
|
spinAxis *= -1;
|
||||||
|
|
||||||
|
// _cube.TransformAnimation(cubeSpinAxis, spinIndex, rotation, 1.0f);
|
||||||
|
|
||||||
|
EnqueueAction(Action(spinAxis, spinIndex, 1.0f));
|
||||||
|
|
||||||
|
std::cout << glm::to_string(spinAxis) << " " << spinIndex << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_wasMouseDown && _inputSystem.IsLeftMouseDown()) {
|
||||||
|
OnDragStart();
|
||||||
|
}
|
||||||
|
else if (_wasMouseDown && !_inputSystem.IsLeftMouseDown()) {
|
||||||
|
OnDragStop();
|
||||||
|
}
|
||||||
|
else if (_wasMouseDown && _inputSystem.IsLeftMouseDown()) {
|
||||||
|
OnDrag(deltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
_wasMouseDown = _inputSystem.IsLeftMouseDown();
|
||||||
|
|
||||||
|
currentAction.duration -= deltaTime;
|
||||||
|
if (currentAction.duration <= 0.0f && _actions.size() > 0) {
|
||||||
|
Action& action = _actions.front();
|
||||||
|
_actions.pop();
|
||||||
|
|
||||||
|
ApplyAction(action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SceneInterface::OnDragStart() {
|
||||||
|
_inputSystem.GetMousePos(_initialMouseLocation);
|
||||||
|
|
||||||
|
Plane planes[6];
|
||||||
|
|
||||||
|
glm::vec3 lineStart;
|
||||||
|
glm::vec3 lineDirection;
|
||||||
|
glm::mat4 viewPerspective = _perspective * _view;
|
||||||
|
|
||||||
|
_inputSystem.GetPickingRay(viewPerspective, lineStart, lineDirection);
|
||||||
|
|
||||||
|
glm::mat4 transform = glm::mat4(1.0f);
|
||||||
|
|
||||||
|
for(int axis=0;axis<3;axis++) {
|
||||||
|
for(int direction=-1;direction<=1;direction+=2) {
|
||||||
|
Plane plane(transform, axis, direction);
|
||||||
|
|
||||||
|
if (glm::dot(plane.Normal(), lineDirection) > 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
float intersectionDistance = -1.0f;
|
||||||
|
IntersectLinePlane(lineStart, lineDirection, plane.Origin(), plane.Normal(), intersectionDistance);
|
||||||
|
|
||||||
|
if (intersectionDistance == -1.0f) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const glm::mat4& planeTransform = plane.Transform();
|
||||||
|
glm::vec4 intersectionPoint = glm::vec4(lineStart + lineDirection * intersectionDistance, 1.0f);
|
||||||
|
glm::vec4 intersectionPlane = glm::inverse(planeTransform) * intersectionPoint;
|
||||||
|
|
||||||
|
bool onPlane = abs(intersectionPlane.x) < 1.501f && abs(intersectionPlane.y) < 1.501f;
|
||||||
|
|
||||||
|
if (!onPlane) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
_plane = plane;
|
||||||
|
|
||||||
|
_mousePositionPlane = intersectionPlane;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SceneInterface::OnDrag(double deltaTime) {
|
||||||
|
glm::vec2 currentMousePosition;
|
||||||
|
|
||||||
|
_inputSystem.GetMousePos(currentMousePosition);
|
||||||
|
|
||||||
|
glm::vec3 lineStart;
|
||||||
|
glm::vec3 lineDirection;
|
||||||
|
glm::mat4 transform = _perspective * _view;
|
||||||
|
_inputSystem.GetPickingRay(transform, lineStart, lineDirection);
|
||||||
|
|
||||||
|
float intersectionDistance = -1.0f;
|
||||||
|
IntersectLinePlane(lineStart, lineDirection, _plane.Origin(), _plane.Normal(), intersectionDistance);
|
||||||
|
|
||||||
|
if (intersectionDistance == -1.0f) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const glm::mat4& planeTransform = _plane.Transform();
|
||||||
|
glm::vec2 intersectionPlane = glm::inverse(planeTransform) * (glm::vec4(lineStart + lineDirection * intersectionDistance, 1.0f));
|
||||||
|
glm::vec2 directionPlane = intersectionPlane - _mousePositionPlane;
|
||||||
|
|
||||||
|
float dragAbsDistance = abs(glm::distance(glm::vec2(0.0f), directionPlane));
|
||||||
|
|
||||||
|
if (dragAbsDistance >= MIN_DRAG_MAGNITUDE) {
|
||||||
|
glm::vec3 mousePosition = glm::inverse(planeTransform) * glm::vec4(_mousePositionPlane, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
glm::vec3 direction = glm::inverse(planeTransform) * glm::vec4(directionPlane, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
direction = glm::normalize(direction);
|
||||||
|
|
||||||
|
glm::vec3 axisSingle = glm::cross(_plane.Normal(), direction);
|
||||||
|
axisSingle = orthogonalise(axisSingle);
|
||||||
|
|
||||||
|
float projection = glm::dot(mousePosition, axisSingle);
|
||||||
|
|
||||||
|
int index = floor((projection + 0.5f));
|
||||||
|
|
||||||
|
glm::ivec3 axis = orthogonalise(axisSingle);
|
||||||
|
|
||||||
|
std::cout << glm::to_string(axisSingle) << std::endl;
|
||||||
|
std::cout << glm::to_string(direction) << std::endl;
|
||||||
|
std::cout << glm::to_string(axis) << std::endl;
|
||||||
|
|
||||||
|
_cube.TransformTemp(axis, index, glm::rotate(glm::mat4(1.0f), glm::radians(abs(glm::distance(glm::vec2(0.0f), directionPlane))), axisSingle));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SceneInterface::OnDragStop() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SceneInterface::ApplyAction(const Action& action) {
|
||||||
|
currentAction = action;
|
||||||
|
|
||||||
|
glm::mat3 cubeMat = _cube.Transform() * glm::mat4_cast(_orientation);
|
||||||
|
|
||||||
|
glm::mat3 orthogonalized = cubeMat;
|
||||||
|
for(int column=0;column<3;column++) {
|
||||||
|
int nearestCardinalisedAxis = 0;
|
||||||
|
for(int i=0;i<3;i++) {
|
||||||
|
if (glm::abs(orthogonalized[column][i]) > glm::abs(orthogonalized[column][nearestCardinalisedAxis])) {
|
||||||
|
nearestCardinalisedAxis = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int columnToPlace=0;columnToPlace<3;columnToPlace++) {
|
||||||
|
for(int i=0;i<3;i++) {
|
||||||
|
if (columnToPlace == column) {
|
||||||
|
if (nearestCardinalisedAxis == i) {
|
||||||
|
orthogonalized[columnToPlace][i] = glm::sign(orthogonalized[columnToPlace][i]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
orthogonalized[columnToPlace][i] = 0.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (nearestCardinalisedAxis == i) {
|
||||||
|
orthogonalized[columnToPlace][i] = 0.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec3 axis = action.axis;
|
||||||
|
|
||||||
|
int direction = axis.x + axis.y + axis.z;
|
||||||
|
|
||||||
|
axis = glm::inverse(orthogonalized) * axis;
|
||||||
|
|
||||||
|
int index = action.index;
|
||||||
|
index *= direction;
|
||||||
|
|
||||||
|
glm::mat4 rotationMat = glm::rotate(glm::mat4(1.0f), glm::radians(90.0f), axis);
|
||||||
|
for(int i=0;i<3;i++) {
|
||||||
|
for(int g=0;g<3;g++) {
|
||||||
|
rotationMat[i][g] = round(rotationMat[i][g]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glm::imat3x3 rotation = glm::imat3x3(rotationMat);
|
||||||
|
|
||||||
|
_cube.TransformAnimation(axis, index, rotation, action.duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SceneInterface::Render(float aspectRatio) {
|
||||||
|
glUseProgram(_shaderProgram);
|
||||||
|
glBindVertexArray(this->_arrayBufferObject);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, this->_vertexBufferObject);
|
||||||
|
|
||||||
|
_view = glm::lookAt(glm::vec3(0.0f, 0.0f, 4.75f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)) * glm::mat4_cast(_orientation);
|
||||||
|
_perspective = glm::perspective(glm::radians(45.0f), aspectRatio, 0.1f, 100.0f);
|
||||||
|
|
||||||
|
auto transformation = _perspective * _view;
|
||||||
|
|
||||||
|
// std::cout << "perspective: " << glm::to_string(glm::perspective(glm::radians(45.0f), aspectRatio, 0.1f, 100.0f)) << std::endl;
|
||||||
|
// std::cout << "view : " << glm::to_string(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))) << std::endl;
|
||||||
|
// std::cout << "model : " << glm::to_string(_cube.Transform()) << std::endl;
|
||||||
|
|
||||||
|
for(int i=0;i<_cube.ChildPartitionsCount;i++) {
|
||||||
|
const PartitionedCube* cube = _cube.Children()[i];
|
||||||
|
|
||||||
|
const MeshData& meshData = cube->MeshData();
|
||||||
|
|
||||||
|
const glm::vec3& position = meshData.data[0].position;
|
||||||
|
|
||||||
|
auto localTransform = transformation * cube->Transform();
|
||||||
|
|
||||||
|
glUniformMatrix4fv(_transformLocation, 1, GL_FALSE, glm::value_ptr(localTransform));
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(VertexData) * meshData.vertexIndex, meshData.data.data(), GL_STATIC_DRAW);
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, meshData.vertexIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
glBindVertexArray(0);
|
||||||
|
glUseProgram(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SceneInterface::ClearResources()
|
||||||
|
{
|
||||||
|
glDeleteBuffers(1, &_vertexBufferObject);
|
||||||
|
glDeleteVertexArrays(1, &_arrayBufferObject);
|
||||||
|
glDeleteProgram(_shaderProgram);
|
||||||
|
}
|
||||||
70
RubiksCube/SceneInterface.h
Normal file
70
RubiksCube/SceneInterface.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
|
#include "Plane.h"
|
||||||
|
#include "InputSystem.h"
|
||||||
|
#include "GameInterface.h"
|
||||||
|
#include "Shader.h"
|
||||||
|
#include "Cube.h"
|
||||||
|
|
||||||
|
#include <ext/quaternion_float.hpp>
|
||||||
|
|
||||||
|
#include <gl/glew.h>
|
||||||
|
|
||||||
|
struct Action {
|
||||||
|
glm::ivec3 axis;
|
||||||
|
int index;
|
||||||
|
double duration;
|
||||||
|
|
||||||
|
Action() : axis(glm::ivec3(0)), index(0), duration(0.0f) { }
|
||||||
|
|
||||||
|
Action(const glm::ivec3& axis, int index, double duration)
|
||||||
|
: axis(axis), index(index), duration(duration) {
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class SceneInterface : public GameInterface
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Cube _cube;
|
||||||
|
std::queue<Action> _actions;
|
||||||
|
Action currentAction;
|
||||||
|
|
||||||
|
InputSystem _inputSystem;
|
||||||
|
|
||||||
|
glm::quat _orientation;
|
||||||
|
|
||||||
|
bool _wasMouseDown;
|
||||||
|
glm::vec2 _initialMouseLocation;
|
||||||
|
Plane _plane;
|
||||||
|
glm::vec2 _mousePositionPlane;
|
||||||
|
|
||||||
|
glm::mat4 _view;
|
||||||
|
glm::mat4 _perspective;
|
||||||
|
|
||||||
|
GLuint _shaderProgram;
|
||||||
|
GLuint _transformLocation;
|
||||||
|
GLuint _arrayBufferObject;
|
||||||
|
GLuint _vertexBufferObject;
|
||||||
|
|
||||||
|
const float MIN_DRAG_MAGNITUDE = 0.16f;
|
||||||
|
|
||||||
|
void ApplyAction(const Action& action);
|
||||||
|
|
||||||
|
void OnDragStart();
|
||||||
|
void OnDrag(double deltaTime);
|
||||||
|
void OnDragStop();
|
||||||
|
|
||||||
|
public:
|
||||||
|
void Initialize(GLFWwindow* window) override;
|
||||||
|
|
||||||
|
void Update(float deltaTime) override;
|
||||||
|
void Render(float aspectRatio) override;
|
||||||
|
|
||||||
|
void EnqueueAction(const Action& action);
|
||||||
|
|
||||||
|
void ClearResources() override;
|
||||||
|
};
|
||||||
|
|
||||||
1
RubiksCube/Shader.cpp
Normal file
1
RubiksCube/Shader.cpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "Shader.h"
|
||||||
5
RubiksCube/Shader.h
Normal file
5
RubiksCube/Shader.h
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
class Shader
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
113
RubiksCube/ShaderUtil.cpp
Normal file
113
RubiksCube/ShaderUtil.cpp
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
#include "ShaderUtil.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
GLuint ShaderUtil::CreateShaderProgram(const char* vertexFilename, const char* fragmentFilename)
|
||||||
|
{
|
||||||
|
std::string vertexProgram = LoadFile(vertexFilename);
|
||||||
|
const char* vertexString = vertexProgram.c_str();
|
||||||
|
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
||||||
|
glShaderSource(vertexShader, 1, &vertexString, NULL);
|
||||||
|
PrintOGlErrors();
|
||||||
|
glCompileShader(vertexShader);
|
||||||
|
PrintOGlErrors();
|
||||||
|
int vertCompiled;
|
||||||
|
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &vertCompiled);
|
||||||
|
if (vertCompiled != 1)
|
||||||
|
{
|
||||||
|
std::cout << "Vertex shader error " << std::endl;
|
||||||
|
PrintShaderLog(vertexShader);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string fragmentProgram = LoadFile(fragmentFilename);
|
||||||
|
const char* fragmentString = fragmentProgram.c_str();
|
||||||
|
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
|
glShaderSource(fragmentShader, 1, &fragmentString, NULL);
|
||||||
|
|
||||||
|
PrintOGlErrors();
|
||||||
|
glCompileShader(fragmentShader);
|
||||||
|
PrintOGlErrors();
|
||||||
|
int fragCompiled;
|
||||||
|
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &fragCompiled);
|
||||||
|
if (fragCompiled != 1)
|
||||||
|
{
|
||||||
|
std::cout << "Fragment shader error " << std::endl;
|
||||||
|
PrintShaderLog(fragmentShader);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint shaderProgram = glCreateProgram();
|
||||||
|
glAttachShader(shaderProgram, vertexShader);
|
||||||
|
glAttachShader(shaderProgram, fragmentShader);
|
||||||
|
glLinkProgram(shaderProgram);
|
||||||
|
PrintOGlErrors();
|
||||||
|
int linked;
|
||||||
|
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &linked);
|
||||||
|
if (linked != 1)
|
||||||
|
{
|
||||||
|
std::cout << "Linking failed:" << std::endl;
|
||||||
|
PrintProgramLog(shaderProgram);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
glDeleteShader(vertexShader);
|
||||||
|
glDeleteShader(fragmentShader);
|
||||||
|
|
||||||
|
return shaderProgram;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ShaderUtil::LoadFile(const char* fileName)
|
||||||
|
{
|
||||||
|
std::string result;
|
||||||
|
std::ifstream fileStream(fileName, std::ios::in);
|
||||||
|
while (!fileStream.eof())
|
||||||
|
{
|
||||||
|
std::string line;
|
||||||
|
std::getline(fileStream, line);
|
||||||
|
result.append(line + "\n");
|
||||||
|
}
|
||||||
|
fileStream.close();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderUtil::PrintShaderLog(GLuint shader)
|
||||||
|
{
|
||||||
|
int memLength;
|
||||||
|
int messageLength;
|
||||||
|
char* log;
|
||||||
|
|
||||||
|
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &memLength);
|
||||||
|
if (memLength == 0)
|
||||||
|
return;
|
||||||
|
log = (char*)malloc(memLength);
|
||||||
|
glGetShaderInfoLog(shader, memLength, &messageLength, log);
|
||||||
|
std::cout << "Shader Info Log: " << log << std::endl;
|
||||||
|
free(log);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderUtil::PrintProgramLog(GLuint program)
|
||||||
|
{
|
||||||
|
int memLength;
|
||||||
|
int messageLength;
|
||||||
|
char* log;
|
||||||
|
|
||||||
|
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &memLength);
|
||||||
|
if (memLength == 0)
|
||||||
|
return;
|
||||||
|
log = (char*)malloc(memLength);
|
||||||
|
glGetProgramInfoLog(program, memLength, &messageLength, log);
|
||||||
|
std::cout << "Program Info Log: " << log << std::endl;
|
||||||
|
free(log);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderUtil::PrintOGlErrors()
|
||||||
|
{
|
||||||
|
int error = glGetError();
|
||||||
|
while (error != GL_NO_ERROR)
|
||||||
|
{
|
||||||
|
std::cout << "OpenGL error: " << error << std::endl;
|
||||||
|
error = glGetError();
|
||||||
|
}
|
||||||
|
}
|
||||||
16
RubiksCube/ShaderUtil.h
Normal file
16
RubiksCube/ShaderUtil.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <GL/glew.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class ShaderUtil
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static GLuint CreateShaderProgram(const char* vertexFilename, const char* fragmentFilename);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static std::string LoadFile(const char* fileName);
|
||||||
|
static void PrintShaderLog(GLuint shader);
|
||||||
|
static void PrintProgramLog(GLuint program);
|
||||||
|
static void PrintOGlErrors();
|
||||||
|
};
|
||||||
2
RubiksCube/Side.h
Normal file
2
RubiksCube/Side.h
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
1
RubiksCube/VertexData.h
Normal file
1
RubiksCube/VertexData.h
Normal file
@ -0,0 +1 @@
|
|||||||
|
#pragma once
|
||||||
9
RubiksCube/cube.frag
Normal file
9
RubiksCube/cube.frag
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#version 330
|
||||||
|
|
||||||
|
out vec4 color;
|
||||||
|
|
||||||
|
in vec4 vertexColor;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
color = vertexColor;
|
||||||
|
}
|
||||||
13
RubiksCube/cube.vert
Normal file
13
RubiksCube/cube.vert
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#version 330
|
||||||
|
|
||||||
|
uniform mat4 transformation;
|
||||||
|
|
||||||
|
layout (location=0) in vec3 position;
|
||||||
|
layout (location=1) in vec4 color;
|
||||||
|
|
||||||
|
out vec4 vertexColor;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
gl_Position = transformation * vec4(position, 1.0f);
|
||||||
|
vertexColor = color;
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user