Author SHA1 Message Date
Jannick van Ballegooijen 6732a55097 dafuq 2016-06-22 02:27:09 +02:00
Jannick van Ballegooijen 6f8c2955eb added all static objects to world TODO enemies 2016-06-22 01:51:25 +02:00
Jannick van Ballegooijen ec83d31065 optimized grass 2016-06-22 01:10:29 +02:00
Jannick van Ballegooijen e69008b083 added models : note to myself : am genius 2016-06-22 01:05:49 +02:00
Jannick van Ballegooijen ddadafecff added ice world base 2016-06-22 00:23:35 +02:00
Jannick van Ballegooijen eaeff6ed7d normal smoothing 2016-06-21 15:28:15 +02:00
kennyboy55 6096e53d94 Merge pull request #21 from CrystalPointA4/feature/Sounds
Bugfixes, added sound to portal and enemy in JSON
2016-06-21 13:53:30 +02:00
kennyboy55 8700aa90af Bugfixes, added sound to portal and enemy in JSON 2016-06-21 13:51:16 +02:00
kennyboy55 7c4805d899 Merge pull request #18 from CrystalPointA4/feature/Menu
Feature/menu
2016-06-20 20:43:00 +02:00
kennyboy55 e42779f6c7 Fixed project files 2016-06-20 20:42:35 +02:00
kennyboy55 ce2f658b61 Merge branch 'developer' into feature/Menu 2016-06-20 20:39:00 +02:00
kennyboy55 3701918ac9 Bugfix 2016-06-20 20:38:56 +02:00
kennyboy55 d887328907 Merge pull request #19 from CrystalPointA4/feature/werkendewav
Feature/werkendewav
2016-06-20 20:37:14 +02:00
kennyboy55 8cf1b02cf7 Merge branch 'developer' into feature/werkendewav 2016-06-20 20:34:35 +02:00
Janco Kock 779cf5cb91 Merge pull request #20 from CrystalPointA4/linux_refactor
Working version for linux
2016-06-20 20:11:10 +02:00
jancoow 030a136e8b Working version for linux 2016-06-20 20:00:58 +02:00
Aaldert f93c09a999 rock heeft muziek 2016-06-20 15:48:57 +02:00
Aaldert 587b79044b Delete 2016-06-20 15:41:39 +02:00
Aaldert dba9c581b1 world aangepast 2016-06-20 15:33:07 +02:00
Aaldert d5406120c6 Enemy speelt cow! 2016-06-20 15:30:38 +02:00
Remco e081373a45 Merge branch 'developer' into feature/Menu
# Conflicts:
#	CrystalPoint.vcxproj.filters
#	Main.cpp
#	Skybox.cpp
#	Skybox.h
2016-06-20 15:23:55 +02:00
Remco 98f3645b6b menu pauses game, able to resume the game. exit game by pause menu 2016-06-20 15:20:12 +02:00
Aaldert 5c776e3d3a Test 2016-06-20 14:53:40 +02:00
Remco 03c06e0974 delete action pointer 2016-06-20 13:44:02 +02:00
Aaldert b7d73c9abe Test 1 2016-06-20 13:43:13 +02:00
Remco 7758f2c294 able to give button a funtion pointer, who will be called when clicked on the button 2016-06-20 13:42:28 +02:00
Remco 2e50d11e07 able to click with cursor, button detect clicking event 2016-06-20 13:29:28 +02:00
Remco 1ec3c8f346 buttons shows when ever the cursor is in the button 2016-06-20 12:50:51 +02:00
Remco 8dcee70324 button, text is placed in middle of button, plane is placed behind text 2016-06-20 12:38:16 +02:00
Remco 6cf9437620 button is draw by menu 2016-06-20 12:11:24 +02:00
kennyboy55 f84fcfa4e2 Merge pull request #17 from CrystalPointA4/worlds
Added Rock world. Updated others
2016-06-10 12:10:28 +02:00
kennyboy55 ad30824057 Added Rock world. Updated others 2016-06-10 12:09:16 +02:00
kennyboy55 04fd3ac0e3 Skybox brightness hotfix 2016-06-10 11:59:43 +02:00
kennyboy55 31c11f3e1f Merge pull request #16 from CrystalPointA4/feature/portal_logic
Feature/portal logic
2016-06-10 11:56:52 +02:00
kennyboy55 656a904a4b Merge remote-tracking branch 'origin/feature/portal_logic' into feature/portal_logic 2016-06-10 11:56:17 +02:00
kennyboy55 348b53c027 Added enemy -> brightness skybox 2016-06-10 11:55:57 +02:00
Remco 71801a30f2 player crystals refresh 2016-06-10 11:06:39 +02:00
Remco 0ca94aef4d when collected all crystals it is possible to move to the next level, by stepping in the portal 2016-06-10 10:56:54 +02:00
kennyboy55 ced3ff4462 Attempt implement menu (unresolved symbol error) 2016-06-09 17:56:37 +02:00
Remco 912a2234a3 crystals will be displayed, when not get with darker icons, when picked up crystals get colors 2016-06-09 17:47:34 +02:00
kennyboy55 0209c8b4e2 Merge pull request #14 from CrystalPointA4/feature/refactor_crystals
Feature/refactor crystals
2016-06-09 13:05:11 +02:00
kennyboy55 6bcd9b1426 Merge pull request #15 from CrystalPointA4/feature/Skybox
Feature/skybox
2016-06-09 13:04:19 +02:00
kennyboy55 579e02728a Merge branch 'developer' into feature/Skybox
# Conflicts:
#	CrystalPoint.vcxproj.filters
#	World.h
2016-06-09 13:03:28 +02:00
kennyboy55 af681b0223 Fixed color issues 2016-06-09 13:01:03 +02:00
Remco 3ed5331437 Merge branch 'developer' into feature/refactor_crystals 2016-06-09 12:41:53 +02:00
kennyboy55 0aad7262d6 Merge pull request #13 from CrystalPointA4/feature/OpenAL
Feature/OpenAL
2016-06-09 12:38:09 +02:00
Remco 9cfaf07eba optimiasted crystal, entity now has a collide methode, which will be called when an entity collison has with the player. 2016-06-09 12:35:00 +02:00
kennyboy55 9659caa1d8 Fix filters 2016-06-09 12:32:13 +02:00
kennyboy55 a4373adc25 Fix image direction / load from JSON 2016-06-09 12:22:40 +02:00
Remco 1f3188376a added new model for crystal, not possible to move through crystals 2016-06-09 12:07:27 +02:00
kennyboy55 69561794d8 Reimplemented into newer develop version 2016-06-09 12:01:24 +02:00
Aaldert 5c24a34202 Merge branch 'developer' into feature/OpenAL
# Conflicts:
#	CrystalPoint.vcxproj.filters
#	Enemy.cpp
#	Enemy.h
#	worlds/small.json
2016-06-09 11:44:45 +02:00
Remco 1164501158 added variables for crystal icons in interface class 2016-06-09 11:12:15 +02:00
kennyboy55 593b9547cf Merge pull request #12 from CrystalPointA4/crystal_capturing
Crystal capturing
2016-06-09 10:34:49 +02:00
kennyboy55 1a4339b49d Merge branch 'developer' into crystal_capturing
# Conflicts:
#	World.cpp
#	worlds/small.json
2016-06-09 10:34:33 +02:00
kennyboy55 2c624ac4c7 Merge pull request #11 from CrystalPointA4/enemy
Enemy
2016-06-09 10:27:24 +02:00
Remco 881b58138c crystal displayed on interface, with fancy gradient and the most beautifull colors for the crystal :) 2016-06-08 13:08:14 +02:00
Remco bba0a2e2a0 picking up crystal(sphere) 2016-06-08 12:41:33 +02:00
Aaldert 117010b9fe OpenAl Werkt! en Setup enzo 2016-06-05 23:49:06 +02:00
Aaldert 47b4d9570d Music Handler 2016-06-05 17:25:04 +02:00
Aaldert 0f8fd67dd3 Merge remote-tracking branch 'refs/remotes/origin/developer' into feature/OpenAL
# Conflicts:
#	CrystalPoint.vcxproj.filters
#	Enemy.h
2016-06-05 16:06:48 +02:00
Aaldert 0afbca8ffc More Generalized 2016-06-05 15:26:14 +02:00
Remco 293ceb0b9f enemy walking around world 2016-06-03 13:58:07 +02:00
Remco b827885f40 enemy collide logic in enemy and out of world 2016-06-03 13:51:54 +02:00
kennyboy55 527394f635 Merge pull request #10 from CrystalPointA4/enemy
Enemy
2016-06-03 11:31:33 +02:00
kennyboy55 95ab1879b4 Merge branch 'developer' into enemy
# Conflicts:
#	CrystalPoint.cpp
#	Entity.cpp
#	Player.cpp
#	Player.h
#	World.cpp
#	World.h
2016-06-03 11:30:19 +02:00
kennyboy55 95febc136f Merge pull request #9 from CrystalPointA4/feature/interface
Feature/interface
2016-06-03 11:14:46 +02:00
kennyboy55 b4a2da4b88 Merge pull request #8 from CrystalPointA4/worldLoading
Added world loading and other various improvements
2016-06-03 11:12:23 +02:00
Remco c3fe041eb1 enemy logic added to enemy and out of world 2016-06-03 11:09:48 +02:00
kennyboy55 1ade6002c1 Bugfix/performance improvement 2016-05-30 13:12:51 +02:00
Daniel f0a8330819 Werkt, maar loopt vast 2016-05-30 12:46:49 +02:00
Daniel a80fc69043 .wav file toegevoegt 2016-05-30 11:59:36 +02:00
Daniel 0c73b5a586 Settings aangepast, als het goed is zit het er nu volledig in 2016-05-30 11:58:34 +02:00
Daniel b53bcac528 OpenAL Test 2016-05-30 11:04:09 +02:00
kennyboy55 ae80c7a5bf Add health/xp/level interface 2016-05-28 16:04:44 +02:00
kennyboy55 34ea491f39 Remove scale 2016-05-28 13:11:11 +02:00
kennyboy55 d83cc6403c Spawn objects from file 2016-05-27 10:56:24 +02:00
kennyboy55 1c59a3bc6f Fix player height (not working with scale) 2016-05-26 18:53:36 +02:00
kennyboy55 2b0e22d4c9 Added height at location 2016-05-26 17:06:34 +02:00
kennyboy55 4c613b606a Implemented getHeight 2016-05-26 13:21:14 +02:00
kennyboy55 56e174ae2f Lord and Savior Johan 2016-05-26 12:53:22 +02:00
kennyboy55 908786897f Added world loading and other various improvements 2016-05-25 22:29:18 +02:00
kennyboy55 33a61ca2ed Merge pull request #7 from CrystalPointA4/enemy
Enemy collision and tracking
2016-05-25 13:44:26 +02:00
Remco b2fa0bc028 Merge branch 'developer' into enemy
# Conflicts:
#	World.h
#	worlds/world1.json
2016-05-25 13:42:02 +02:00
Remco cf124b3f38 enemy collison added, no jittering anymore 2016-05-25 13:38:13 +02:00
kennyboy55 0b6096d3e8 Merge pull request #6 from CrystalPointA4/array-rendering
Implement optimised array rendering
2016-05-25 12:56:17 +02:00
kennyboy55 84fcc346a9 Implement optimised array rendering 2016-05-25 12:44:24 +02:00
kennyboy55 fe1aa7220e Merge pull request #5 from CrystalPointA4/heightmap
Heightmap implemented
2016-05-25 11:53:02 +02:00
Remco d739141b25 enemys always looking at you when you are the target 2016-05-25 11:46:22 +02:00
kennyboy55 2a6cc0fd87 Fix missing Vertex 2016-05-25 11:44:13 +02:00
kennyboy55 965b54c901 Added heightmap 2016-05-25 11:31:37 +02:00
jancoow e7a7cc5588 Fixed capital letters and string return error.. 2016-05-23 12:34:55 +02:00
Remco 9d3cfa7e2a Merge branch 'developer' into johan
# Conflicts:
#	World.cpp
#	worlds/world1.json
2016-05-23 10:34:21 +02:00
Janco Kock 47c228205a Merge pull request #3 from CrystalPointA4/johan_linuxrefactor
Johan linuxrefactor
2016-05-23 10:00:59 +02:00
kennyboy55 b1aa61d5f0 Fix cmath issue 2016-05-23 10:00:31 +02:00
jancoow 5ca5ca194b Fixed capital letters... 2016-05-23 09:46:36 +02:00
jancoow e75f624935 Fixed cmath problem 2016-05-23 08:53:03 +02:00
Remco d01efecb0e enemy comes to you when in his radius 2016-05-23 08:48:23 +02:00
jancoow 7d13269480 Refactor johan branch for compiling with g++ 2016-05-22 23:19:05 +02:00
kennyboy55 a8415db4ac Added new Johan Code 2016-05-20 13:00:04 +02:00
kennyboy55 1120a3e144 Removed gitignore files 2016-05-20 12:40:54 +02:00
kennyboy55 f2af3a7324 Added gitignore 2016-05-20 10:51:23 +02:00
kennyboy55 7c4ee37867 Johan is love, Johan is life 2016-05-19 14:25:03 +02:00
228 changed files with 64246 additions and 954 deletions
+6
View File
@@ -0,0 +1,6 @@
/workspace.xml
/vcs.xml
/modules.xml
/misc.xml
/encodings.xml
/CrystalPoint.iml
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
+76
View File
@@ -0,0 +1,76 @@
#include "Button.h"
#include <string>
#include "Util.h"
#include "Vector.h"
#include "Cursor.h"
Button::Button(const std::string & text, Vec2f position, float width, float height) : Text(text,position)
{
this->width = width;
this->height = height;
this->planePosition = position;
cursorOnButton = false;
alfa = 0.5f;
background = Vec3f(10, 10, 10);
//foreground = Vec3f(255, 255, 255);
this->setColor(Vec3f(255, 255, 255));
this->position.x += width / 2 - textWidth / 2;
this->position.y += height / 2 - textHeight / 2;
}
Button::~Button()
{
/*if (action != nullptr)
delete action;*/
}
void Button::draw(void)
{
glColor4f(background.x/255.0f, background.y / 255.0f, background.z / 255.0f, alfa);
glBegin(GL_QUADS);
glVertex2f(planePosition.x, planePosition.y);
glVertex2f(planePosition.x, planePosition.y + height);
glVertex2f(planePosition.x + width, planePosition.y + height);
glVertex2f(planePosition.x + width, planePosition.y);
glEnd();
/*glColor4f(foreground.x / 255.0f, foreground.y / 255.0f, foreground.z / 255.0f, 1.0f);
Util::glutBitmapString(text, position.x, position.y+height/2+14/2);*/
Text::draw();
}
void Button::update(int x, int y)
{
cursorOnButton =
(x > planePosition.x && x < planePosition.x + width) &&
y > planePosition.y && y < planePosition.y + height;
if (cursorOnButton)
alfa = 1.0f;
else
alfa = 0.5f;
if (cursorOnButton && Cursor::getInstance()->clicked)
if(action != nullptr)
action(this);
}
void Button::addAction(action_function action)
{
this->action = action;
}
void Button::setForeground(Vec3f color)
{
this->setColor(color);
}
void Button::setBackground(Vec3f color)
{
background = color;
}
+30
View File
@@ -0,0 +1,30 @@
#pragma once
#include "Text.h"
class Button : public Text
{
private:
typedef void(*action_function)(Button* b);
float width, height;
Vec3f background;
Vec2f planePosition;
bool cursorOnButton;
float alfa;
action_function action = nullptr;
public:
Button(const std::string &text, Vec2f position, float width, float height);
~Button();
void draw();
void update(int x, int y);
void addAction(action_function action);
void setForeground(Vec3f color);
void setBackground(Vec3f color);
};
+16
View File
@@ -0,0 +1,16 @@
cmake_minimum_required(VERSION 3.5)
project(CrystalPoint)
file(GLOB SOURCE_FILES
"*.h"
"*.cpp"
)
add_executable(CrystalPoint ${SOURCE_FILES})
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
find_package(OpenAL REQUIRED)
include_directories( ${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS} ${OPENAL_INCLUDE_DIRS} )
target_link_libraries(CrystalPoint ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${OPENAL_LIBRARY} )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -lpthread")
-12
View File
@@ -1,12 +0,0 @@
#include "Controller.h"
Controller::Controller()
{
}
Controller::~Controller()
{
}
-10
View File
@@ -1,10 +0,0 @@
#pragma once
#include "Header.h"
class Controller
{
public:
Controller();
~Controller();
};
+48
View File
@@ -0,0 +1,48 @@
#include "Crystal.h"
#include "Model.h"
#include "Player.h"
Crystal::Crystal(const std::string & filled, const std::string & empty, const Vec3f & position, Vec3f & rotation, const float & scale)
{
this->filled = Model::load(filled);
this->empty = Model::load(empty);
model = this->filled;
this->position = position;
this->rotation = rotation;
this->scale = scale;
this->canCollide = true;
isFilled = true;
}
Crystal::~Crystal()
{
if (model)
Model::unload(model);
//if isfilled, means model is model filled, so model empty has to been deleted.
//if is not filled, means model is model empty, so model filled has to been deleted.
if (isFilled)
if(empty)
Model::unload(empty);
else
if(filled)
Model::unload(filled);
}
void Crystal::draw()
{
Entity::draw();
}
void Crystal::collide()
{
if (isFilled)
{
Player::getInstance()->crystals++;
isFilled = false;
model = empty;
}
}
+20
View File
@@ -0,0 +1,20 @@
#pragma once
#include "Entity.h"
#include <string>
class Crystal :
public Entity
{
public:
Crystal(const std::string &filled, const std::string &empty,
const Vec3f &position, Vec3f &rotation, const float &scale);
~Crystal();
bool isFilled;
void draw();
void collide();
private:
Model* filled;
Model* empty;
};
+9 -9
View File
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14 # Visual Studio 14
VisualStudioVersion = 14.0.24720.0 VisualStudioVersion = 14.0.24720.0
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CrystalPoint", "CrystalPoint.vcxproj", "{4986BEC0-4362-46E4-A18D-65587FA97967}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CrystalPoint", "CrystalPoint.vcxproj", "{F82158C7-7345-4CB0-9F90-3AB49A071904}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -13,14 +13,14 @@ Global
Release|x86 = Release|x86 Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4986BEC0-4362-46E4-A18D-65587FA97967}.Debug|x64.ActiveCfg = Debug|x64 {F82158C7-7345-4CB0-9F90-3AB49A071904}.Debug|x64.ActiveCfg = Debug|x64
{4986BEC0-4362-46E4-A18D-65587FA97967}.Debug|x64.Build.0 = Debug|x64 {F82158C7-7345-4CB0-9F90-3AB49A071904}.Debug|x64.Build.0 = Debug|x64
{4986BEC0-4362-46E4-A18D-65587FA97967}.Debug|x86.ActiveCfg = Debug|Win32 {F82158C7-7345-4CB0-9F90-3AB49A071904}.Debug|x86.ActiveCfg = Debug|Win32
{4986BEC0-4362-46E4-A18D-65587FA97967}.Debug|x86.Build.0 = Debug|Win32 {F82158C7-7345-4CB0-9F90-3AB49A071904}.Debug|x86.Build.0 = Debug|Win32
{4986BEC0-4362-46E4-A18D-65587FA97967}.Release|x64.ActiveCfg = Release|x64 {F82158C7-7345-4CB0-9F90-3AB49A071904}.Release|x64.ActiveCfg = Release|x64
{4986BEC0-4362-46E4-A18D-65587FA97967}.Release|x64.Build.0 = Release|x64 {F82158C7-7345-4CB0-9F90-3AB49A071904}.Release|x64.Build.0 = Release|x64
{4986BEC0-4362-46E4-A18D-65587FA97967}.Release|x86.ActiveCfg = Release|Win32 {F82158C7-7345-4CB0-9F90-3AB49A071904}.Release|x86.ActiveCfg = Release|Win32
{4986BEC0-4362-46E4-A18D-65587FA97967}.Release|x86.Build.0 = Release|Win32 {F82158C7-7345-4CB0-9F90-3AB49A071904}.Release|x86.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
+141
View File
@@ -0,0 +1,141 @@
#include "CrystalPoint.h"
#include <GL/freeglut.h>
#include <cmath>
#include <cstring>
#include "WorldHandler.h"
#include "Player.h"
#include "Cursor.h"
#include "Menu.h"
#include "Text.h"
#include "Vector.h"
#include "Button.h"
int CrystalPoint::width = 0;
int CrystalPoint::height = 0;
SoundSystem CrystalPoint::sound_system;
bool state = false;
void CrystalPoint::init()
{
player = Player::getInstance();
worldhandler = WorldHandler::getInstance();
cursor = Cursor::getInstance();
menu = new Menu();
buildMenu();
lastFrameTime = 0;
state = true;
glClearColor(0.7f, 0.7f, 1.0f, 1.0f);
}
void CrystalPoint::draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//Draw world
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(70, width / (float)height, 0.1f, 15000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
worldhandler->draw();
if(!state)
menu->draw();
glutSwapBuffers();
}
void CrystalPoint::update()
{
float frameTime = glutGet(GLUT_ELAPSED_TIME) / 1000.0f;
float deltaTime = frameTime - lastFrameTime;
lastFrameTime = frameTime;
if (keyboardState.keys[27] && !prevKeyboardState.keys[27])
state = !state;
if (state)
{
if (keyboardState.special[GLUT_KEY_LEFT] && !prevKeyboardState.special[GLUT_KEY_LEFT])
worldhandler->PreviousWorld();
if (keyboardState.special[GLUT_KEY_RIGHT] && !prevKeyboardState.special[GLUT_KEY_RIGHT])
worldhandler->NextWorld();
Player* player = Player::getInstance();
player->rotation.y += mouseOffset.x / 10.0f;
player->rotation.x += mouseOffset.y / 10.0f;
if (player->rotation.x > 90)
player->rotation.x = 90;
if (player->rotation.x < -90)
player->rotation.x = -90;
float speed = 10;
Vec3f oldPosition = player->position;
if (keyboardState.keys['a']) player->setPosition(0, deltaTime*speed, false);
if (keyboardState.keys['d']) player->setPosition(180, deltaTime*speed, false);
if (keyboardState.keys['w']) player->setPosition(90, deltaTime*speed, false);
if (keyboardState.keys['s']) player->setPosition(270, deltaTime*speed, false);
if (keyboardState.keys['q']) player->setPosition(1, deltaTime*speed, true);
if (keyboardState.keys['e']) player->setPosition(-1, deltaTime*speed, true);
if (!worldhandler->isPlayerPositionValid())
player->position = oldPosition;
player->position.y = worldhandler->getHeight(player->position.x, player->position.z) + 2.5f;
worldhandler->update(deltaTime);
}
else
{
menu->update();
cursor->update(cursor->mousePosition + mouseOffset);
}
mouseOffset = Vec2f(0, 0);
prevKeyboardState = keyboardState;
glutPostRedisplay();
sound_system.SetListener(player->position, Vec3f(), Vec3f());
}
void CrystalPoint::buildMenu()
{
Button* start = new Button("Resume", Vec2f(1920 / 2 - 50, 1080 / 2 - 30), 100, 50);
auto toWorld = [](Button* b)
{
state = true;
};
start->addAction(toWorld);
menu->AddMenuElement(start);
Button* test = new Button("Exit", Vec2f(1920 / 2 - 50, 1080 / 2 + 30), 100, 50);
test->addAction([](Button* b)
{
exit(0);
});
menu->AddMenuElement(test);
Text* t = new Text("Pause", Vec2f(1920 / 2 - Util::glutTextWidth("Pause") / 2, 1080 / 2 - 75));
t->setColor(Vec3f(255, 255, 0));
menu->AddMenuElement(t);
}
KeyboardState::KeyboardState()
{
memset(keys, 0, sizeof(keys));
memset(special, 0, sizeof(special));
}
+49
View File
@@ -0,0 +1,49 @@
#pragma once
class WorldHandler;
class SoundSystem;
class Player;
class Cursor;
class Menu;
#include "Vector.h"
#include "SoundSystem.h"
class KeyboardState
{
public:
bool keys[256];
bool special[256];
bool control, shift, alt;
KeyboardState();
};
class CrystalPoint
{
public:
void init();
void draw();
void update();
WorldHandler* worldhandler;
Player* player;
Cursor* cursor;
Menu* menu;
static int width, height;
KeyboardState keyboardState;
KeyboardState prevKeyboardState;
Vec2f mouseOffset;
Vec2f mousePosition;
float lastFrameTime;
static SoundSystem& GetSoundSystem() { return sound_system; }
private:
static SoundSystem sound_system;
void buildMenu();
};
+81 -54
View File
@@ -19,9 +19,9 @@
</ProjectConfiguration> </ProjectConfiguration>
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<ProjectGuid>{4986BEC0-4362-46E4-A18D-65587FA97967}</ProjectGuid> <ProjectGuid>{F82158C7-7345-4CB0-9F90-3AB49A071904}</ProjectGuid>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<RootNamespace>CrystalPoint</RootNamespace> <RootNamespace>CrystalJohan</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<ProjectName>CrystalPoint</ProjectName> <ProjectName>CrystalPoint</ProjectName>
</PropertyGroup> </PropertyGroup>
@@ -84,62 +84,65 @@
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
<PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories> <PrecompiledHeaderFile />
<AdditionalIncludeDirectories>freeglut/include; openAL/include</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>freeglut/lib</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>freeglut/lib; openAL/libs/Win32</AdditionalLibraryDirectories>
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;OpenAL32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile> <ClCompile>
<PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories> <PrecompiledHeaderFile />
<AdditionalIncludeDirectories>freeglut/include;C:\Program Files (x86)\OpenAL 1.1 SDK\include</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>freeglut/lib</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>freeglut/lib;C:\Program Files (x86)\OpenAL 1.1 SDK\libs\Win32</AdditionalLibraryDirectories>
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;OpenAL32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization> <Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories> <PrecompiledHeaderFile />
<AdditionalIncludeDirectories>freeglut/include; openAL/include</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>freeglut/lib</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>freeglut/lib; openAL/libs/Win32</AdditionalLibraryDirectories>
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;OpenAL32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization> <Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile />
<AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
@@ -151,46 +154,70 @@
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Controller.h" /> <ClCompile Include="Button.cpp" />
<ClInclude Include="Enemy.h" /> <ClCompile Include="Crystal.cpp" />
<ClInclude Include="Header.h" /> <ClCompile Include="CrystalPoint.cpp" />
<ClInclude Include="InitState.h" /> <ClCompile Include="Cursor.cpp" />
<ClInclude Include="Keyboard.h" /> <ClCompile Include="Enemy.cpp" />
<ClInclude Include="LoadingState.h" /> <ClCompile Include="Entity.cpp" />
<ClInclude Include="MenuState.h" /> <ClCompile Include="HeightMap.cpp" />
<ClInclude Include="Model.h" /> <ClCompile Include="Interface.cpp" />
<ClInclude Include="ModelHandler.h" /> <ClCompile Include="json.cpp" />
<ClInclude Include="ModelInstance.h" /> <ClCompile Include="LevelObject.cpp" />
<ClInclude Include="Mouse.h" /> <ClCompile Include="Main.cpp" />
<ClInclude Include="Player.h" /> <ClCompile Include="Menu.cpp" />
<ClInclude Include="SettingsState.h" /> <ClCompile Include="MenuElement.cpp" />
<ClInclude Include="State.h" /> <ClCompile Include="Model.cpp" />
<ClInclude Include="StateHandler.h" /> <ClCompile Include="Portal.cpp" />
<ClInclude Include="Vector.h" /> <ClCompile Include="Sound.cpp" />
<ClInclude Include="Weapon.h" /> <ClCompile Include="SoundSystem.cpp" />
<ClInclude Include="WorldModel.h" /> <ClCompile Include="Player.cpp" />
<ClInclude Include="WorldState.h" /> <ClCompile Include="Skybox.cpp" />
<ClCompile Include="Text.cpp" />
<ClCompile Include="Util.cpp" />
<ClCompile Include="Vector.cpp" />
<ClCompile Include="Vertex.cpp" />
<ClCompile Include="World.cpp" />
<ClCompile Include="WorldHandler.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Controller.cpp" /> <ClInclude Include="Button.h" />
<ClCompile Include="Enemy.cpp" /> <ClInclude Include="Crystal.h" />
<ClCompile Include="InitState.cpp" /> <ClInclude Include="CrystalPoint.h" />
<ClCompile Include="Keyboard.cpp" /> <ClInclude Include="Cursor.h" />
<ClCompile Include="LoadingState.cpp" /> <ClInclude Include="Enemy.h" />
<ClCompile Include="Main.cpp" /> <ClInclude Include="Entity.h" />
<ClCompile Include="MenuState.cpp" /> <ClInclude Include="HeightMap.h" />
<ClCompile Include="Model.cpp" /> <ClInclude Include="Interface.h" />
<ClCompile Include="ModelHandler.cpp" /> <ClInclude Include="json.h" />
<ClCompile Include="ModelInstance.cpp" /> <ClInclude Include="LevelObject.h" />
<ClCompile Include="Mouse.cpp" /> <ClInclude Include="Main.h" />
<ClCompile Include="Player.cpp" /> <ClInclude Include="Menu.h" />
<ClCompile Include="SettingsState.cpp" /> <ClInclude Include="MenuElement.h" />
<ClCompile Include="State.cpp" /> <ClInclude Include="Model.h" />
<ClCompile Include="StateHandler.cpp" /> <ClInclude Include="Portal.h" />
<ClCompile Include="Vector.cpp" /> <ClInclude Include="Sound.h" />
<ClCompile Include="Weapon.cpp" /> <ClInclude Include="SoundSystem.h" />
<ClCompile Include="WorldModel.cpp" /> <ClInclude Include="Player.h" />
<ClCompile Include="WorldState.cpp" /> <ClInclude Include="Skybox.h" />
<ClInclude Include="stb_image.h" />
<ClInclude Include="Text.h" />
<ClInclude Include="Util.h" />
<ClInclude Include="vector.h" />
<ClInclude Include="Vertex.h" />
<ClInclude Include="World.h" />
<ClInclude Include="WorldHandler.h" />
</ItemGroup>
<ItemGroup>
<None Include="worlds\fire.json" />
<None Include="worlds\ice.json" />
<None Include="worlds\rock.json" />
<None Include="worlds\small.json" />
<None Include="worlds\worlds.json" />
</ItemGroup>
<ItemGroup>
<Media Include="WAVE\bond.wav" />
<Media Include="WAVE\Sound.wav" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
+178 -114
View File
@@ -13,138 +13,202 @@
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> <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> <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter> </Filter>
<Filter Include="Source Files\State"> <Filter Include="Source Files\Object">
<UniqueIdentifier>{6c99658e-2c17-469b-a3d1-2c4d3d61d440}</UniqueIdentifier> <UniqueIdentifier>{1e464995-b141-43fd-9e25-16d6ac47176b}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\Control"> <Filter Include="Source Files\World">
<UniqueIdentifier>{e444364a-17f6-4464-a98c-6bd34d3e6263}</UniqueIdentifier> <UniqueIdentifier>{0de1a037-e536-40df-a0d0-0d929f2fe752}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\Model"> <Filter Include="Source Files\json">
<UniqueIdentifier>{842778c9-ff0f-4a6d-9c86-0a178ad40fcc}</UniqueIdentifier> <UniqueIdentifier>{9c655946-3f99-44ea-bc97-2817656954e0}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\Model\Enemy"> <Filter Include="Source Files\Menu">
<UniqueIdentifier>{1be14b84-6fa7-4cfb-94b9-666f3ee14198}</UniqueIdentifier> <UniqueIdentifier>{e7a88896-78e1-4544-bfc8-cfd55323728e}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\Handler">
<UniqueIdentifier>{1b39afb7-b64b-458a-bba3-755631986211}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Model.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Header.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="StateHandler.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="State.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="MenuState.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="LoadingState.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Keyboard.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Mouse.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Controller.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="WorldModel.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="WorldState.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Enemy.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Player.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Weapon.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Vector.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ModelInstance.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ModelHandler.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="SettingsState.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="InitState.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Main.cpp"> <ClCompile Include="Main.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="State.cpp">
<Filter>Source Files\State</Filter>
</ClCompile>
<ClCompile Include="MenuState.cpp">
<Filter>Source Files\State</Filter>
</ClCompile>
<ClCompile Include="Keyboard.cpp">
<Filter>Source Files\Control</Filter>
</ClCompile>
<ClCompile Include="Mouse.cpp">
<Filter>Source Files\Control</Filter>
</ClCompile>
<ClCompile Include="Controller.cpp">
<Filter>Source Files\Control</Filter>
</ClCompile>
<ClCompile Include="LoadingState.cpp">
<Filter>Source Files\State</Filter>
</ClCompile>
<ClCompile Include="Model.cpp">
<Filter>Source Files\Model</Filter>
</ClCompile>
<ClCompile Include="WorldModel.cpp">
<Filter>Source Files\Model</Filter>
</ClCompile>
<ClCompile Include="WorldState.cpp">
<Filter>Source Files\State</Filter>
</ClCompile>
<ClCompile Include="Enemy.cpp">
<Filter>Source Files\Model\Enemy</Filter>
</ClCompile>
<ClCompile Include="Player.cpp"> <ClCompile Include="Player.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Weapon.cpp"> <ClCompile Include="json.cpp">
<Filter>Source Files\Model</Filter>
</ClCompile>
<ClCompile Include="Vector.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="ModelInstance.cpp"> <ClCompile Include="WorldHandler.cpp">
<Filter>Source Files\Model</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="StateHandler.cpp"> <ClCompile Include="Entity.cpp">
<Filter>Source Files\Handler</Filter> <Filter>Source Files\Object</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="ModelHandler.cpp"> <ClCompile Include="Model.cpp">
<Filter>Source Files\Handler</Filter> <Filter>Source Files\Object</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="SettingsState.cpp"> <ClCompile Include="Vertex.cpp">
<Filter>Source Files\State</Filter> <Filter>Source Files\Object</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="InitState.cpp"> <ClCompile Include="Vector.cpp">
<Filter>Source Files\State</Filter> <Filter>Source Files\Object</Filter>
</ClCompile>
<ClCompile Include="World.cpp">
<Filter>Source Files\World</Filter>
</ClCompile>
<ClCompile Include="HeightMap.cpp">
<Filter>Source Files\World</Filter>
</ClCompile>
<ClCompile Include="LevelObject.cpp">
<Filter>Source Files\World</Filter>
</ClCompile>
<ClCompile Include="Enemy.cpp">
<Filter>Source Files\Object</Filter>
</ClCompile>
<ClCompile Include="CrystalPoint.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Cursor.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Interface.cpp">
<Filter>Source Files\World</Filter>
</ClCompile>
<ClCompile Include="Skybox.cpp">
<Filter>Source Files\World</Filter>
</ClCompile>
<ClCompile Include="Crystal.cpp">
<Filter>Source Files\Object</Filter>
</ClCompile>
<ClCompile Include="SoundSystem.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Sound.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Crystal.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Portal.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Button.cpp">
<Filter>Source Files\Menu</Filter>
</ClCompile>
<ClCompile Include="Menu.cpp">
<Filter>Source Files\Menu</Filter>
</ClCompile>
<ClCompile Include="MenuElement.cpp">
<Filter>Source Files\Menu</Filter>
</ClCompile>
<ClCompile Include="Text.cpp">
<Filter>Source Files\Menu</Filter>
</ClCompile>
<ClCompile Include="Util.cpp">
<Filter>Source Files\Menu</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ClInclude Include="World.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Entity.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Enemy.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="LevelObject.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Model.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="stb_image.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Player.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Main.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="json.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="HeightMap.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Vertex.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="WorldHandler.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="CrystalPoint.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Interface.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Cursor.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="vector.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="SoundSystem.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Sound.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Crystal.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Skybox.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Portal.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Text.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Util.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="MenuElement.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Menu.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Button.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="worlds\worlds.json">
<Filter>Source Files\json</Filter>
</None>
<None Include="worlds\fire.json">
<Filter>Source Files\json</Filter>
</None>
<None Include="worlds\ice.json">
<Filter>Source Files\json</Filter>
</None>
<None Include="worlds\small.json">
<Filter>Source Files\json</Filter>
</None>
<None Include="worlds\rock.json">
<Filter>Source Files\json</Filter>
</None>
</ItemGroup>
<ItemGroup>
<Media Include="WAVE\Sound.wav">
<Filter>Resource Files</Filter>
</Media>
<Media Include="WAVE\bond.wav">
<Filter>Resource Files</Filter>
</Media>
</ItemGroup>
</Project> </Project>
+80
View File
@@ -0,0 +1,80 @@
#include "Cursor.h"
#include <GL/freeglut.h>
#include <cmath>
#include "CrystalPoint.h"
Cursor* Cursor::instance = NULL;
Cursor::Cursor()
{
enabled = false;
mousePosition = Vec2f(CrystalPoint::width / 2, CrystalPoint::height / 2);
clicked = false;
}
Cursor::~Cursor()
{
}
Cursor* Cursor::getInstance(void)
{
if (instance == nullptr)
instance = new Cursor();
return instance;
}
void Cursor::enable(bool enable)
{
enabled = enable;
}
bool Cursor::isEnabled(void)
{
return enabled;
}
void Cursor::draw(void)
{
//Draw Cursor
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, CrystalPoint::width, CrystalPoint::height, 0, -10, 10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glColor4f(1, cos(glutGet(GLUT_ELAPSED_TIME) / 1000.0f), sin(glutGet(GLUT_ELAPSED_TIME) / 1000.0f), 1);
glBegin(GL_TRIANGLES);
glVertex2f(mousePosition.x, mousePosition.y);
glVertex2f(mousePosition.x + 15, mousePosition.y + 15);
glVertex2f(mousePosition.x + 5, mousePosition.y + 20);
glEnd();
}
void Cursor::update(Vec2f newPosition)
{
if (newPosition.x < 0)
newPosition.x = 0;
if (newPosition.y < 0)
newPosition.y = 0;
if (newPosition.x > CrystalPoint::width)
newPosition.x = CrystalPoint::width;
if (newPosition.y > CrystalPoint::height)
newPosition.y = CrystalPoint::height;
mousePosition = newPosition;
if (clicked)
clicked = !clicked;
if (state != prev)
if(state == GLUT_UP)
clicked = true;
prev = state;
}
+28
View File
@@ -0,0 +1,28 @@
#pragma once
#include "Vector.h"
class Cursor
{
private:
Cursor();
static Cursor* instance;
bool enabled;
public:
Vec2f mousePosition;
~Cursor();
static Cursor* getInstance(void);
void enable(bool enable);
bool isEnabled(void);
bool clicked;
int state, prev;
void draw(void);
void update(Vec2f newPosition);
};
+110 -3
View File
@@ -1,12 +1,119 @@
#define _USE_MATH_DEFINES
#include <cmath>
#include "Enemy.h" #include "Enemy.h"
#include "Model.h"
#include <iostream>
Enemy::Enemy(const std::string &fileName,
const std::string &fileMusic,
Enemy::Enemy() const Vec3f &position,
const Vec3f &rotation,
const float &scale)
{ {
model = Model::load(fileName);
this->position = position;
this->rotation = rotation;
this->scale = scale;
this->canCollide = true;
target = position;
speed = 1;
radius = 10;
hasTarget = false;
hit_sound_id = CrystalPoint::GetSoundSystem().LoadSound(fileMusic.c_str(), false);
music = CrystalPoint::GetSoundSystem().GetSound(hit_sound_id);
attack = false;
} }
Enemy::~Enemy() Enemy::~Enemy()
{ {
if (model)
Model::unload(model);
delete music;
}
void Enemy::draw()
{
Entity::draw();
glPushMatrix();
glTranslatef(position.x, position.y, position.z);
glBegin(GL_LINE_LOOP);
for (int i = 0; i < 360; i++)
{
//convert degrees into radians
float degInRad = i*(M_PI / 180.0);
glVertex3f(cos(degInRad)*radius, 1*scale,sin(degInRad)*radius);
}
glEnd();
glPopMatrix();
}
void Enemy::inEyeSight(Vec3f & TargetPosition)
{
if (position.Distance(TargetPosition) <= radius)
{
hasTarget = true;
target = TargetPosition;
}
else
hasTarget = false;
}
void Enemy::collide(const Entity * entity)
{
Vec3f difference = position - entity->position; //zou misschien omgedraait moeten worden
difference.y = 0;
difference.Normalize();
difference = difference * (entity->model->radius + 0.01f);
position.x = difference.x + entity->position.x;
position.z = difference.z + entity->position.z;
}
void Enemy::update(float delta)
{
music->SetPos(position, Vec3f());
if (hasTarget)
{
if (music->IsPlaying() == false)
{
music->Play();
}
//just 2d walking
float dx, dz, length;
dx = target.x - position.x;
dz = target.z - position.z;
length = sqrt(dx*dx + dz*dz);
if (length > 1)
{
attack = false;
dx /= length;
dz /= length;
dx *= speed*delta;
dz *= speed*delta;
position.x += dx;
position.z += dz;
}
else
{
attack = true;
if (music->IsPlaying() == true)
{
// music->Pause();
music->Stop();
}
}
rotation.y = atan2f(dx, dz) * 180 / M_PI;
}
} }
+22 -3
View File
@@ -1,10 +1,29 @@
#pragma once #pragma once
#include "Header.h"
class Enemy #include "Entity.h"
#include <string>
#include "Vector.h"
#include "CrystalPoint.h"
class Enemy : public Entity
{ {
public: public:
Enemy(); Enemy(const std::string &fileName, const std::string &fileMusic, const Vec3f &position, const Vec3f &rotation, const float &scale);
~Enemy(); ~Enemy();
Sound* music;
bool hasTarget;
Vec3f target;
float speed,radius;
bool attack;
void update(float);
void draw();
void inEyeSight(Vec3f &);
void collide(const Entity *entity);
private:
int hit_sound_id;
}; };
+56
View File
@@ -0,0 +1,56 @@
#include "Entity.h"
#include "cmath"
#include <GL/freeglut.h>
#include "Model.h"
Entity::Entity()
{
model = NULL;
scale = 1;
canCollide = true;
}
Entity::~Entity()
{
if(model)
Model::unload(model);
}
void Entity::draw()
{
if (model)
{
glPushMatrix();
glTranslatef(position.x, position.y, position.z);
glRotatef(rotation.x, 1, 0, 0);
glRotatef(rotation.y, 0, 1, 0);
glRotatef(rotation.z, 0, 0, 1);
glScalef(scale, scale, scale);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
model->draw();
glCullFace(GL_FRONT);
model->draw();
glDisable(GL_CULL_FACE);
glPopMatrix();
}
}
bool Entity::inObject(const Vec3f & point)
{
if (!model)
return false;
Vec3f center = position + model->center;
float distance = ((point.x - center.x) * (point.x - center.x) + (point.z - center.z)*(point.z - center.z));
if (distance < model->radius*scale*model->radius*scale)
return true;
return false;
}
+25
View File
@@ -0,0 +1,25 @@
#pragma once
#include "Vector.h"
class Model;
class Entity
{
public:
Entity();
~Entity();
Model* model;
virtual void draw();
virtual void update(float elapsedTime) {};
virtual void collide() {};
Vec3f position;
Vec3f rotation;
float scale;
bool canCollide;
bool inObject(const Vec3f &position);
};
-22
View File
@@ -1,22 +0,0 @@
#pragma once
#include <GL/freeglut.h>
#define _USE_MATH_DEFINES
#include <cmath>
#include <math.h>
#include <string>
#include <vector>
#include <list>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <windows.h>
#include <gl/GL.h>
#include "Vector.h"
using namespace std;
+184
View File
@@ -0,0 +1,184 @@
#include "HeightMap.h"
#include "stb_image.h"
#include "Vector.h"
#include "LevelObject.h"
#include <GL/freeglut.h>
#include <iostream>
#include <string>
#include "World.h"
#define RED 0
#define GREEN 1
#define BLUE 2
#define ALPHA 3
HeightMap::HeightMap(const std::string &file, World* world)
{
int bpp;
unsigned char* imgData = stbi_load(file.c_str(), &width, &height, &bpp, 4);
auto heightAt = [&](int x, int y)
{
return (imgData[(x + y * width) * 4 ] / 256.0f) * 50.0f;
};
auto valueAt = [&](int x, int y, int offset = 0)
{
return imgData[(x + y * width) * 4 + offset];
};
std::vector<std::vector<Vec3f>> faceNormals(width-1, std::vector<Vec3f>(height-1, Vec3f(0,1,0)));
for (int y = 0; y < height - 1; y++)
{
for (int x = 0; x < width - 1; x++)
{
int offsets[4][2] = { { 0, 0 },{ 1, 0 },{ 1, 1 },{ 0, 1 } };
Vec3f ca(0, heightAt(x, y + 1) - heightAt(x, y), 1);
Vec3f ba(1, heightAt(x + 1, y) - heightAt(x, y), 0);
Vec3f normal = ca.cross(ba);
normal.Normalize();
faceNormals[x][y] = normal;
}
}
for (int y = 0; y < height-1; y++)
{
for (int x = 0; x < width-1; x++)
{
int offsets[4][2] = { { 0, 0 },{ 1, 0 },{ 1, 1 },{ 0, 1 } };
if (valueAt(x, y, GREEN) > 0)
{
world->addLevelObject(new LevelObject(world->getObjectFromValue(valueAt(x, y, GREEN)).first, Vec3f(x, heightAt(x, y), y), Vec3f(0, 0, 0), 1, world->getObjectFromValue(valueAt(x, y, GREEN)).second));
}
for (int i = 0; i < 4; i++)
{
int xx = x + offsets[i][0];
int yy = y + offsets[i][1];
Vec3f normal(0, 0, 0);
if(xx < width-1 && yy < height-1)
normal = normal + faceNormals[xx][yy];
if(xx > 0 && yy < height-1)
normal = normal + faceNormals[xx-1][yy];
if (xx > 0 && yy > 0)
normal = normal + faceNormals[xx-1][yy-1];
if (yy > 0 && xx < width-1)
normal = normal + faceNormals[xx][yy-1];
normal.Normalize();
float h = heightAt(xx, yy);
vertices.push_back(Vertex{ (float)(xx), h, (float)(yy),
normal.x, normal.y, normal.z,
(xx) / (float)height, (yy) / (float)width } );
}
}
}
glGenTextures(1, &imageIndex);
glBindTexture(GL_TEXTURE_2D, imageIndex);
glTexImage2D(GL_TEXTURE_2D,
0, //level
GL_RGBA, //internal format
width, //width
height, //height
0, //border
GL_RGBA, //data format
GL_UNSIGNED_BYTE, //data type
imgData); //data
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
stbi_image_free(imgData);
}
HeightMap::~HeightMap()
{
glDeleteTextures(1, &imageIndex);
}
void HeightMap::Draw()
{
glEnable(GL_LIGHTING);
float color[] = { 0.7f, 0.7f, 0.7f, 1 };
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, color);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, color);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, imageIndex);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
//glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), ((float*)vertices.data()) + 0);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), ((float*)vertices.data()) + 6);
glNormalPointer(GL_FLOAT, sizeof(Vertex), ((float*)vertices.data()) + 3);
glDrawArrays(GL_QUADS, 0, vertices.size());
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
//glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
}
float HeightMap::GetHeight(float x, float y)
{
int ix = x;
int iy = y;
int index = (ix + (width - 1) * iy) * 4;
if (index + 3 >= vertices.size())
index = vertices.size() - 4;
if (index < 0)
index = 0;
Vertex& a = vertices[index];
Vertex& b = vertices[index+1];
Vertex& c = vertices[index+3];
float lowervalue = ((b.z - c.z)*(a.x - c.x) + (c.x - b.x)*(a.z - c.z));
float labda1 = ((b.z - c.z)*(x - c.x) + (c.x - b.x)*(y - c.z)) / lowervalue;
float labda2 = ((c.y - a.y)*(x - c.x) + (a.x - c.x)*(y - c.y)) / lowervalue;
float labda3 = 1 - labda1 - labda2;
Vertex z = a * labda1 + b * labda2 + c * labda3;
// Vertex z = (a * labda1) + (b * labda2) ;
return z.y;
}
int HeightMap::GetSize()
{
return height >= width ? height : width;
}
void HeightMap::SetTexture(const std::string &file)
{
int bpp, width2, height2;
unsigned char* imgData = stbi_load(file.c_str(), &width2, &height2, &bpp, 4);
glBindTexture(GL_TEXTURE_2D, imageIndex);
glTexImage2D(GL_TEXTURE_2D,
0, //level
GL_RGBA, //internal format
width2, //width
height2, //height
0, //border
GL_RGBA, //data format
GL_UNSIGNED_BYTE, //data type
imgData); //data
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
stbi_image_free(imgData);
}
+28
View File
@@ -0,0 +1,28 @@
#pragma once
#include "Vertex.h"
#include <string>
#include <vector>
#include <GL/freeglut.h>
class World;
class HeightMap
{
private:
int height;
int width;
GLuint imageIndex;
public:
HeightMap(const std::string &file, World* world);
~HeightMap();
void Draw();
float GetHeight(float x, float y);
int GetSize();
void SetTexture(const std::string &file);
std::vector<Vertex> vertices;
};
-12
View File
@@ -1,12 +0,0 @@
#include "InitState.h"
InitState::InitState()
{
}
InitState::~InitState()
{
}
-11
View File
@@ -1,11 +0,0 @@
#pragma once
#include "Header.h"
#include "State.h"
class InitState : public State
{
public:
InitState();
~InitState();
};
+119
View File
@@ -0,0 +1,119 @@
#include "Interface.h"
#include <GL/freeglut.h>
#include "CrystalPoint.h"
#include <string>
#include "Player.h"
#include "Util.h"
Interface::Interface()
{
crystalWidth = 20;
crystalHeight = 50;
crystalOffset = 5;
maxCrystals = 0;
}
Interface::Interface(int maxCrystal)
{
crystalWidth = 20;
crystalHeight = 50;
crystalOffset = 5;
maxCrystals = maxCrystal;
}
Interface::~Interface()
{
}
void Interface::draw()
{
Player* player = Player::getInstance();
//Switch view to Ortho
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1000, 1000, 0, -10, 10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
//Draw interface
//Health bar
glBegin(GL_QUADS);
glColor4f(0,0,0, 1.0);
glVertex2f(250, 980);
glVertex2f(250, 965);
glVertex2f(750, 965);
glVertex2f(750, 980);
glEnd();
glBegin(GL_QUADS);
glColor4f(1.0f, 0.1f, 0.1f, 1.0);
glVertex2f(250, 980);
glVertex2f(250, 965);
glColor4f(1.0f, 0.5f, 0.5f, 1.0);
glVertex2f(250 + (player->health / 100 * 500), 965);
glVertex2f(250 + (player->health / 100 * 500), 980);
glEnd();
//XP bar
glBegin(GL_QUADS);
glColor4f(0, 0, 0, 1.0);
glVertex2f(250, 950);
glVertex2f(250, 935);
glVertex2f(750, 935);
glVertex2f(750, 950);
glEnd();
glBegin(GL_QUADS);
glColor4f(1.0f, 1.0f, 0.1f, 1.0);
glVertex2f(250, 950);
glVertex2f(250, 935);
glColor4f(1.0f, 1.0f, 0.5f, 1.0);
glVertex2f(250 + (player->xp / 100 * 500), 935);
glVertex2f(250 + (player->xp / 100 * 500), 950);
glEnd();
//Text: level
glColor4f(1.0f, 1.0f, 0.1f, 1.0);
Util::glutBitmapString("Level: " + std::to_string(player->level), 490, 900);
for (int i = 0; i < maxCrystals; i++)
{
glBegin(GL_QUADS);
if(i < player->crystals)
glColor4f(0, 1.0f, 1.0f, 1.0f);
else
glColor4f(0, 0.4f, 0.4f, 1.0f);
glVertex2f(975 - crystalWidth / 2 , crystalOffset*i + crystalHeight*i);
glVertex2f(975 - crystalWidth , crystalHeight / 2 + crystalOffset*i + crystalHeight*i);
if (i < player->crystals)
glColor4f(0, 0.7f, 0.7f, 1.0f);
else
glColor4f(0, 0.2f, 0.2f, 1.0f);
glVertex2f(975 - crystalWidth / 2 , crystalHeight + crystalOffset*i + crystalHeight*i);
glVertex2f(975 , crystalHeight / 2 + crystalOffset*i + crystalHeight*i);
glEnd();
}
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
}
void Interface::update(float deltaTime)
{
}
+15
View File
@@ -0,0 +1,15 @@
#pragma once
class Interface
{
public:
Interface();
Interface(int);
~Interface();
void draw(void);
void update(float deltaTime);
int crystalWidth, crystalHeight, crystalOffset;
int maxCrystals;
};
-12
View File
@@ -1,12 +0,0 @@
#include "Keyboard.h"
Keyboard::Keyboard()
{
}
Keyboard::~Keyboard()
{
}
-10
View File
@@ -1,10 +0,0 @@
#pragma once
#include "Header.h"
class Keyboard
{
public:
Keyboard();
~Keyboard();
};
+22
View File
@@ -0,0 +1,22 @@
#include "LevelObject.h"
#include "Model.h"
LevelObject::LevelObject(const std::string &fileName, const Vec3f &position, const Vec3f &rotation, const float &scale, const bool &hasCollision)
{
model = Model::load(fileName);
this->position = position;
this->position.x -= model->center.x;
this->position.z -= model->center.z;
this->rotation = rotation;
this->scale = scale;
this->canCollide = hasCollision;
}
LevelObject::~LevelObject()
{
if (model)
Model::unload(model);
}
+17
View File
@@ -0,0 +1,17 @@
#pragma once
#include "Entity.h"
#include <string>
class LevelObject : public Entity
{
public:
LevelObject(const std::string &fileName,
const Vec3f &position,
const Vec3f &rotation,
const float &scale,
const bool &hasCollision);
~LevelObject();
};
-12
View File
@@ -1,12 +0,0 @@
#include "LoadingState.h"
LoadingState::LoadingState()
{
}
LoadingState::~LoadingState()
{
}
-11
View File
@@ -1,11 +0,0 @@
#pragma once
#include "Header.h"
#include "State.h"
class LoadingState : public State
{
public:
LoadingState();
~LoadingState();
};
+72 -142
View File
@@ -1,138 +1,78 @@
#include "Header.h" #include <GL/freeglut.h>
#include "Model.h"
#include "Player.h" #include "CrystalPoint.h"
#include "StateHandler.h" #include <stdio.h>
#include "State.h" #include "Vector.h"
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#include "Cursor.h"
//Prototypes
void bindFuncOpenGL(void);
void configureOpenGL(void); void configureOpenGL(void);
void loadModels(void);
static int Width; CrystalPoint* app;
static int Height;
float lastFrameTime = 0; bool justMoved = false;
bool keys[255];
//vector<Model*> models;
//int currentModel = 0;
StateHandler *statehandler;
void display()
{
glClearColor(0.6f, 0.6f, 1, 1);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f, (float)Width / Height, 0.5, 300);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
/*glRotatef(player.eyes.rotX, 1, 0, 0);
glRotatef(player.eyes.rotY, 0, 1, 0);
glTranslatef(player.eyes.posX, player.eyes.posY, player.eyes.posZ);
glPushMatrix();
glScalef(0.5f, 0.5f, 0.5f);
glRotatef(180, 1, 0, 0);
glRotatef(45, 0, 0, 1);
glRotatef(90, 0, 1, 0);
models[currentModel]->draw();
glPopMatrix();*/
//Draw here
statehandler->GetCurrentState()->Display();
//player->Display();
//glutSolidCube(10.0);
glDisable(GL_TEXTURE_2D);
glutSwapBuffers();
}
void idle()
{
float frameTime = glutGet(GLUT_ELAPSED_TIME) / 1000.0f;
float deltaTime = frameTime - lastFrameTime;
lastFrameTime = frameTime;
statehandler->GetCurrentState()->Keyboard(keys,deltaTime);
statehandler->GetCurrentState()->Idle(deltaTime);
glutPostRedisplay();
}
void mousemotion(int x, int y)
{
int dx = x - Width / 2;
int dy = y - Height / 2;
if ((dx != 0 || dy != 0) && abs(dx) < 400 && abs(dy) < 400)
{
statehandler->GetCurrentState()->MouseMove(x, y, dx, dy);
glutWarpPointer(Width / 2, Height / 2);
}
}
void mouse(int button, int type, int x, int y)
{
statehandler->GetCurrentState()->MouseClick(button, type, x, y);
}
void keyboard(unsigned char key, int, int)
{
if (key == 27)
exit(0);
//std::cout << key << std::endl;
keys[key] = true;
}
void keyboardup(unsigned char key, int, int)
{
keys[key] = false;
}
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
//Init GLUT app = new CrystalPoint();
glutInit(&argc, argv); glutInit(&argc, argv);
//Configre OpenGL and FreeGLut
configureOpenGL(); configureOpenGL();
//Bind functions app->init();
bindFuncOpenGL();
//Init models glutDisplayFunc([]() { app->draw(); } );
loadModels(); glutIdleFunc([]() { app->update(); } );
glutReshapeFunc([](int w, int h) { CrystalPoint::width = w; CrystalPoint::height = h; glViewport(0, 0, w, h); });
//Start the main loop
glutMainLoop();
return 0;
}
void bindFuncOpenGL()
{
glutDisplayFunc(display);
glutIdleFunc(idle);
glutReshapeFunc([](int w, int h) { Width = w; Height= h; glViewport(0, 0, w, h); });
//Keyboard //Keyboard
glutKeyboardFunc(keyboard); glutKeyboardFunc([](unsigned char c, int, int) { app->keyboardState.keys[c] = true; });
glutKeyboardUpFunc(keyboardup); glutKeyboardUpFunc([](unsigned char c, int, int) { app->keyboardState.keys[c] = false; });
glutSpecialFunc([](int c, int, int) { app->keyboardState.special[c] = true; });
glutSpecialUpFunc([](int c, int, int) { app->keyboardState.special[c] = false; });
auto mousemotion = [](int x, int y)
{
if (justMoved)
{
justMoved = false;
return;
}
int dx = x - app->width / 2;
int dy = y - app->height / 2;
if ((dx != 0 || dy != 0) && abs(dx) < 400 && abs(dy) < 400)
{
app->mouseOffset = app->mouseOffset + Vec2f(dx, dy);
glutWarpPointer(app->width / 2, app->height / 2);
justMoved = true;
}
};
//Mouse //Mouse
glutMouseFunc(mouse);
glutPassiveMotionFunc(mousemotion); glutPassiveMotionFunc(mousemotion);
glutMotionFunc(mousemotion);
auto mouseclick = [](int button, int state,
int x, int y)
{
if (button == GLUT_LEFT_BUTTON)
Cursor::getInstance()->state = state;
//std::cout << "Left button is down" << std::endl;
};
glutMouseFunc(mouseclick);
CrystalPoint::height = GLUT_WINDOW_HEIGHT;
CrystalPoint::width = GLUT_WINDOW_WIDTH;
glutMainLoop();
delete app;
return 0;
} }
void configureOpenGL() void configureOpenGL()
@@ -140,9 +80,10 @@ void configureOpenGL()
//Init window and glut display mode //Init window and glut display mode
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(800, 600); glutInitWindowSize(800, 600);
//glutInitWindowPosition(glutGet(GLUT_WINDOW_WIDTH) / 2 - 800/2, glutGet(GLUT_WINDOW_HEIGHT) / 2 - 600/2);
glutCreateWindow("Crystal Point"); glutCreateWindow("Crystal Point");
glutFullScreen(); //glutFullScreen();
//glutPositionWindow((glutGet(GLUT_SCREEN_WIDTH) / 2) - (glutGet(GLUT_WINDOW_WIDTH) / 2), (glutGet(GLUT_SCREEN_HEIGHT) / 2) - (glutGet(GLUT_WINDOW_HEIGHT) / 2));
//Depth testing //Depth testing
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
@@ -156,32 +97,21 @@ void configureOpenGL()
glAlphaFunc(GL_GREATER, 0.01f); glAlphaFunc(GL_GREATER, 0.01f);
//Lighting //Lighting
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat mat_specular[] = { 0.2, 0.2, 0.2, 0 };
GLfloat mat_shininess[] = { 20.0 }; //GLfloat mat_shininess[] = { 5.0 };
GLfloat light_position[] = { 30.0, 30.0, 30.0, 1.0 }; GLfloat light_position[] = { 0.0, 2.0, 1.0, 0 };
GLfloat light_diffuse[] = { 2.0, 2.0, 2.0, 1.0 }; GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 0 };
GLfloat light_ambient[] = { 2.0, 2.0, 2.0, 1.0 }; GLfloat light_ambient[] = { 0.3, 0.3, 0.3, 0 };
glClearColor(0.0, 0.0, 0.0, 0.0); glClearColor(0.7, 0.7, 1.0, 1.0);
glShadeModel(GL_SMOOTH);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); //glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); //glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position); //glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); //glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0); glEnable(GL_LIGHT0);
//glEnable(GL_COLOR_MATERIAL);
//Cursor glutSetCursor(GLUT_CURSOR_NONE);
glutWarpPointer(Width / 2, Height / 2);
glutSetCursor(GLUT_CURSOR_CROSSHAIR);
}
void loadModels()
{
statehandler = new StateHandler();
statehandler->Navigate(statehandler->WORLD_STATE);
//models.push_back(new Model("models/weapons/ZwaardMetTextures/TextureZwaard.obj"));
} }
View File
+59
View File
@@ -0,0 +1,59 @@
#include <GL\freeglut.h>
#include "Menu.h"
#include "CrystalPoint.h"
Menu::Menu()
{
cursor = Cursor::getInstance();
}
Menu::~Menu()
{
}
void Menu::draw(void)
{
//Switch view to Ortho
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, CrystalPoint::width, CrystalPoint::height, 0, -10, 10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
glColor4f(60/255.0f, 60/255.0f, 60/255.0f, 0.8f);
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(0, CrystalPoint::height);
glVertex2f(CrystalPoint::width, CrystalPoint::height);
glVertex2f(CrystalPoint::width, 0);
glEnd();
for (MenuElement* e : elements)
{
e->draw();
}
cursor->draw();
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
}
void Menu::update()
{
for (MenuElement* e : elements)
{
e->update(cursor->mousePosition.x, cursor->mousePosition.y);
}
}
void Menu::AddMenuElement(MenuElement * e)
{
elements.push_back(e);
}
+20
View File
@@ -0,0 +1,20 @@
#pragma once
#include <vector>
#include "MenuElement.h"
#include "Cursor.h"
class Menu
{
private:
std::vector<MenuElement*> elements;
Cursor* cursor;
public:
Menu();
~Menu();
void draw(void);
void update(void);
void AddMenuElement(MenuElement* e);
};
+12
View File
@@ -0,0 +1,12 @@
#include "MenuElement.h"
MenuElement::MenuElement(Vec2f position)
{
hover = false;
this->position = position;
}
MenuElement::~MenuElement()
{
}
+17
View File
@@ -0,0 +1,17 @@
#pragma once
#include "Vector.h"
#include <string>
class MenuElement
{
protected:
bool hover;
Vec2f position;
public:
MenuElement(Vec2f position);
~MenuElement();
virtual void draw(void) {};
virtual void update(int x, int y) {};
};
-12
View File
@@ -1,12 +0,0 @@
#include "MenuState.h"
MenuState::MenuState()
{
}
MenuState::~MenuState()
{
}
-10
View File
@@ -1,10 +0,0 @@
#pragma once
#include "Header.h"
#include "State.h"
class MenuState : public State
{
public:
MenuState();
~MenuState();
};
+93 -43
View File
@@ -1,14 +1,19 @@
#include "Model.h" #include "Model.h"
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h" #include "stb_image.h"
//Prototypes #include <iostream>
vector<string> split(string str, string sep); #include <fstream>
string replace(string str, string toReplace, string replacement); #include <string>
string toLower(string data); #include <algorithm>
#include <cmath>
Model::Model(string fileName) //Prototypes
std::vector<std::string> split(std::string str, std::string sep);
std::string replace(std::string str, std::string toReplace, std::string replacement);
std::string toLower(std::string data);
Model::Model(std::string fileName)
{ {
std::string dirName = fileName; std::string dirName = fileName;
if (dirName.rfind("/") != std::string::npos) if (dirName.rfind("/") != std::string::npos)
@@ -70,7 +75,7 @@ Model::Model(string fileName)
for (size_t i = ii - 3; i < ii; i++) //magische forlus om van quads triangles te maken ;) for (size_t i = ii - 3; i < ii; i++) //magische forlus om van quads triangles te maken ;)
{ {
Vertex vertex; VertexIndex vertex;
std::vector<std::string> indices = split(params[i == (ii - 3) ? 1 : i], "/"); std::vector<std::string> indices = split(params[i == (ii - 3) ? 1 : i], "/");
if (indices.size() >= 1) //er is een positie if (indices.size() >= 1) //er is een positie
vertex.position = atoi(indices[0].c_str()) - 1; vertex.position = atoi(indices[0].c_str()) - 1;
@@ -115,24 +120,48 @@ Model::Model(string fileName)
} }
} }
groups.push_back(currentGroup); groups.push_back(currentGroup);
minVertex = vertices[0];
maxVertex = vertices[0];
for (auto v : vertices)
{
for (int i = 0; i < 3; i++)
{
minVertex[i] = fmin(minVertex[i], v[i]);
maxVertex[i] = fmax(maxVertex[i], v[i]);
}
}
center = (minVertex + maxVertex) / 2.0f;
radius = 0;
for (auto v : vertices)
radius = fmax(radius, (center.x - v.x) * (center.x - v.x) + (center.z - v.z) * (center.z - v.z));
radius = sqrt(radius);
for (ObjGroup *group : groups)
{
Optimise(group);
}
} }
Model::Model(void) void Model::Optimise(ObjGroup *t)
{ {
Model("models/TextureZwaard.obj"); for (Face &face : t->faces)
} {
for (auto &vertex : face.vertices)
{
t->VertexArray.push_back(Vertex(vertices[vertex.position].x, vertices[vertex.position].y, vertices[vertex.position].z,
normals[vertex.normal].x, normals[vertex.normal].y, normals[vertex.normal].z,
texcoords[vertex.texcoord].x, texcoords[vertex.texcoord].y));
Model::~Model(void)
{
} }
}
void Model::AddInstance(ModelInstance* inst)
{
instances.push_back(inst);
} }
void Model::draw() void Model::draw()
{ {
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
for (auto &g : groups) for (auto &g : groups)
{ {
if (materials[g->materialIndex]->hasTexture) if (materials[g->materialIndex]->hasTexture)
@@ -163,31 +192,14 @@ void Model::draw()
} }
} }
for (auto &instance : instances) glVertexPointer(3, GL_FLOAT, sizeof(Vertex), ((float*)g->VertexArray.data()) + 0);
{ glNormalPointer(GL_FLOAT, sizeof(Vertex), ((float*)g->VertexArray.data()) + 3);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), ((float*)g->VertexArray.data()) + 6);
glBegin(GL_TRIANGLES); glDrawArrays(GL_TRIANGLES, 0, g->VertexArray.size());
for (auto &f : g->faces)
{
for (auto &v : f.vertices)
{
glPushMatrix();
glTranslatef(instance->translation.x, instance->translation.y, instance->translation.z);
glRotatef(instance->rotation.x, 1, 0, 0);
glRotatef(instance->rotation.y, 0, 1, 0);
glRotatef(instance->rotation.z, 0, 0, 1);
glScalef(instance->scale.x, instance->scale.y, instance->scale.z);
glNormal3f(normals[v.normal].x, normals[v.normal].y, normals[v.normal].z);
glTexCoord2f(texcoords[v.texcoord].x, texcoords[v.texcoord].y);
glVertex3f(vertices[v.position].x, vertices[v.position].y, vertices[v.position].z);
}
}
glEnd();
}
} }
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
} }
void Model::loadMaterialFile(std::string fileName, std::string dirName) void Model::loadMaterialFile(std::string fileName, std::string dirName)
@@ -287,6 +299,9 @@ Model::Texture::Texture(const std::string & fileName)
imgData); //data imgData); //data
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
stbi_image_free(imgData); stbi_image_free(imgData);
} }
@@ -295,7 +310,7 @@ void Model::Texture::bind()
glBindTexture(GL_TEXTURE_2D, index); glBindTexture(GL_TEXTURE_2D, index);
} }
string replace(string str, string toReplace, string replacement) std::string replace(std::string str, std::string toReplace, std::string replacement)
{ {
size_t index = 0; size_t index = 0;
while (true) while (true)
@@ -309,7 +324,7 @@ string replace(string str, string toReplace, string replacement)
return str; return str;
} }
vector<string> split(string str, string sep) std::vector<std::string> split(std::string str, std::string sep)
{ {
std::vector<std::string> ret; std::vector<std::string> ret;
size_t index; size_t index;
@@ -325,8 +340,43 @@ vector<string> split(string str, string sep)
return ret; return ret;
} }
inline string toLower(string data) inline std::string toLower(std::string data)
{ {
std::transform(data.begin(), data.end(), data.begin(), ::tolower); std::transform(data.begin(), data.end(), data.begin(), ::tolower);
return data; return data;
} }
std::map<std::string, std::pair<Model*, int>> Model::cache;
Model* Model::load(const std::string &fileName)
{
if (cache.find(fileName) == cache.end())
cache[fileName] = std::pair<Model*, int>(new Model(fileName), 0);
cache[fileName].second++;
return cache[fileName].first;
}
void Model::unload(Model* model)
{
for (auto m : cache)
{
if (m.second.first == model)
{
m.second.second--;
if (m.second.second == 0)
{
delete m.second.first;
cache.erase(cache.find(m.first));
break;
}
}
}
}
Model::~Model(void)
{
}
+25 -10
View File
@@ -1,11 +1,17 @@
#pragma once #pragma once
#include "Header.h"
#include "ModelInstance.h" #include <GL/freeglut.h>
#include <list>
#include <vector>
#include <map>
#include "Vector.h"
#include "Vertex.h"
class Model class Model
{ {
private: private:
class Vertex
class VertexIndex
{ {
public: public:
int position; int position;
@@ -16,7 +22,7 @@ private:
class Face class Face
{ {
public: public:
list<Vertex> vertices; std::list<VertexIndex> vertices;
}; };
class Texture class Texture
@@ -49,7 +55,8 @@ private:
public: public:
std::string name; std::string name;
int materialIndex; int materialIndex;
list<Face> faces; std::list<Face> faces;
std::vector<Vertex> VertexArray;
}; };
std::vector<Vec3f> vertices; std::vector<Vec3f> vertices;
@@ -58,15 +65,23 @@ private:
std::vector<ObjGroup*> groups; std::vector<ObjGroup*> groups;
std::vector<MaterialInfo*> materials; std::vector<MaterialInfo*> materials;
std::vector<ModelInstance*> instances;
void loadMaterialFile(std::string fileName, std::string dirName); void loadMaterialFile(std::string fileName, std::string dirName);
public:
Model(std::string filename); Model(std::string filename);
Model(void);
~Model(void); ~Model(void);
void AddInstance(ModelInstance* inst); public:
static std::map<std::string, std::pair<Model*, int> > cache;
static Model* load(const std::string &fileName);
static void unload(Model* model);
void draw(); void draw();
void Optimise(ObjGroup *t);
Vec3f minVertex;
Vec3f maxVertex;
Vec3f center;
float radius;
}; };
-12
View File
@@ -1,12 +0,0 @@
#include "ModelHandler.h"
ModelHandler::ModelHandler()
{
}
ModelHandler::~ModelHandler()
{
}
-8
View File
@@ -1,8 +0,0 @@
#pragma once
class ModelHandler
{
public:
ModelHandler();
~ModelHandler();
};
-10
View File
@@ -1,10 +0,0 @@
#include "ModelInstance.h"
ModelInstance::ModelInstance()
{
}
ModelInstance::~ModelInstance()
{
}
-16
View File
@@ -1,16 +0,0 @@
#pragma once
#include "Header.h"
class ModelInstance
{
private:
public:
ModelInstance();
~ModelInstance();
Vec3f translation;
Vec3f rotation;
Vec3f scale;
};
-12
View File
@@ -1,12 +0,0 @@
#include "Mouse.h"
Mouse::Mouse()
{
}
Mouse::~Mouse()
{
}
-10
View File
@@ -1,10 +0,0 @@
#pragma once
#include "Header.h"
class Mouse
{
public:
Mouse();
~Mouse();
};
+39 -60
View File
@@ -1,77 +1,56 @@
#define _USE_MATH_DEFINES
#include <cmath>
#include "Player.h" #include "Player.h"
#include <GL/freeglut.h>
Player* Player::instance = NULL;
Player::Player() Player::Player()
{ {
speed = 10;
health = 50;
xp = 75;
level = 10;
crystals = 0;
} }
Player* Player::getInstance()
Player::~Player()
{ {
if(right != nullptr) if (instance == nullptr)
delete right; instance = new Player();
if(left != nullptr)
delete left;
/*if (player != nullptr)
delete player;*/
}
void Player::Display(void)
{
if (right != nullptr)
{
right->draw_weapon();
}
if (left != nullptr)
{
left->draw_weapon();
}
/*glRotatef(player->eyes.rotX, 1, 0, 0);
glRotatef(player->eyes.rotY, 0, 1, 0);
glTranslatef(player->eyes.posX, player->eyes.posY, player->eyes.posZ);*/
glRotatef(eyes.rotX, 1, 0, 0);
glRotatef(eyes.rotY, 0, 1, 0);
glTranslatef(eyes.posX, eyes.posY, eyes.posZ);
}
Player & Player::GetInstance(void)
{
static Player instance;
return instance; return instance;
} }
//Player * Player::GetInstance(void) void Player::init()
//{
// if (player == nullptr)
// player = new Player();
// return player;
//}
void Player::PlayerMoveEyes(float angle, float fac, bool heigth)
{ {
//player movement instance = new Player();
}
/*if (heigth) Player::~Player()
player->eyes.posY += angle*fac; {
if (leftWeapon)
delete leftWeapon;
if (rightWeapon)
delete rightWeapon;
}
void Player::setCamera()
{
glRotatef(rotation.x, 1, 0, 0);
glRotatef(rotation.y, 0, 1, 0);
glTranslatef(-position.x, -position.y, -position.z);
}
void Player::setPosition(float angle, float fac, bool height)
{
if (height)
position.y += angle*fac;
else else
{ {
player->eyes.posX += (float)cos((player->eyes.rotY + angle) / 180 * M_PI) * fac; position.x -= (float)cos((rotation.y + angle) / 180 * M_PI) * fac;
player->eyes.posZ += (float)sin((player->eyes.rotY + angle) / 180 * M_PI) * fac; position.z -= (float)sin((rotation.y + angle) / 180 * M_PI) * fac;
}*/
if (heigth)
eyes.posY += angle*fac;
else
{
eyes.posX += (float)cos((eyes.rotY + angle) / 180 * M_PI) * fac;
eyes.posZ += (float)sin((eyes.rotY + angle) / 180 * M_PI) * fac;
} }
} }
void Player::PlayerRotateEyes(int dx, int dy)
{
eyes.rotY += dx / 10.0f;
eyes.rotX += dy / 10.0f;
}
+19 -25
View File
@@ -1,38 +1,32 @@
#pragma once #pragma once
#include "Header.h" #include "Vector.h"
#include "Weapon.h"
class Model;
class Player class Player
{ {
private:
static Player* instance;
public: public:
Player();
~Player(); ~Player();
struct Eyes void setCamera();
{ void setPosition(float angle, float fac, bool height);
float posX = 0;
float posY = 0;
float posZ = 0;
float rotX = 0;
float rotY = 0;
} eyes;
void Display(void); static Player* getInstance(void);
//static Player* GetInstance(void); static void init(void);
static Player& GetInstance(void);
Vec3f position;
Vec2f rotation;
void PlayerMoveEyes(const float angle, const float fac, const bool heigth); Model* leftWeapon;
void PlayerRotateEyes(const int dx, const int dy); Model* rightWeapon;
private:
float health;
float xp;
int level; int level;
int xp; int crystals;
Weapon* right = nullptr;
Weapon* left = nullptr;
vector<Weapon> weapons;
Player();
Player(Player const&);
void operator=(Player const&);
//static Player* player; float speed;
}; };
+62
View File
@@ -0,0 +1,62 @@
#include "Portal.h"
#include "Model.h"
#include <iostream>
#include "Player.h"
#include "WorldHandler.h"
Portal::Portal(const std::string &fileName,
const Vec3f &position,
Vec3f &rotation,
const float &scale)
{
model = Model::load(fileName);
this->position = position;
this->rotation = rotation;
this->scale = scale;
this->canCollide = true;
started = false;
delay = 0;
sound_id = CrystalPoint::GetSoundSystem().LoadSound("WAVE/portal.wav", false);
music = CrystalPoint::GetSoundSystem().GetSound(sound_id);
music->SetPos(position, Vec3f());
mayEnter = false;
maxCrystals = 0;
}
Portal::~Portal()
{
// Model::unload(model);
// delete music;
}
void Portal::collide()
{
if (maxCrystals == (Player::getInstance()->crystals) && !mayEnter)
{
canCollide = false;
mayEnter = true;
}
}
bool Portal::enter(float deltaTime)
{
if (delay > 3 && started)
{
delete music;
delay = 0;
return true;
}
if (delay == 0 && !started)
{
music->Play();
started = true;
}
delay += deltaTime;
return false;
}
+27
View File
@@ -0,0 +1,27 @@
#pragma once
#include "Entity.h"
#include <string>
#include "CrystalPoint.h"
class Portal :
public Entity
{
public:
Portal(const std::string &fileName,
const Vec3f &position,
Vec3f &rotation,
const float &scale);
~Portal();
bool enter(float deltaTime);
void collide();
int maxCrystals;
bool mayEnter;
private:
int sound_id;
Sound* music;
bool started;
float delay;
};
-2
View File
@@ -1,2 +0,0 @@
# CrystalPoint
Crystal Point: The Elemental Labyrinth
+40
View File
@@ -0,0 +1,40 @@
========================================================================
CONSOLE APPLICATION : CrystalPoint Project Overview
========================================================================
AppWizard has created this CrystalPoint application for you.
This file contains a summary of what you will find in each of the files that
make up your CrystalPoint application.
CrystalPoint.vcxproj
This is the main project file for VC++ projects generated using an Application Wizard.
It contains information about the version of Visual C++ that generated the file, and
information about the platforms, configurations, and project features selected with the
Application Wizard.
CrystalPoint.vcxproj.filters
This is the filters file for VC++ projects generated using an Application Wizard.
It contains information about the association between the files in your project
and the filters. This association is used in the IDE to show grouping of files with
similar extensions under a specific node (for e.g. ".cpp" files are associated with the
"Source Files" filter).
CrystalPoint.cpp
This is the main application source file.
/////////////////////////////////////////////////////////////////////////////
Other standard files:
StdAfx.h, StdAfx.cpp
These files are used to build a precompiled header (PCH) file
named CrystalPoint.pch and a precompiled types file named StdAfx.obj.
/////////////////////////////////////////////////////////////////////////////
Other notes:
AppWizard uses "TODO:" comments to indicate parts of the source code you
should add to or customize.
/////////////////////////////////////////////////////////////////////////////
-12
View File
@@ -1,12 +0,0 @@
#include "SettingsState.h"
SettingsState::SettingsState()
{
}
SettingsState::~SettingsState()
{
}
-11
View File
@@ -1,11 +0,0 @@
#pragma once
#include "Header.h"
#include "State.h"
class SettingsState : public State
{
public:
SettingsState();
~SettingsState();
};
+166
View File
@@ -0,0 +1,166 @@
#include "cmath"
#include <GL/freeglut.h>
#include "Util.h"
#include "stb_image.h"
#include "Skybox.h"
#include <string>
#include <iostream>
enum{SKY_LEFT=0,SKY_BACK,SKY_RIGHT,SKY_FRONT,SKY_TOP,SKY_BOTTOM};
GLuint skybox[6];
Skybox::Skybox(const float &size, const std::string &folder)
{
this->size = size;
this->folder = folder;
brightness = 80;
targetBrightness = 80;
}
Skybox::~Skybox()
{
glDeleteTextures(6, &skybox[0]);
}
void Skybox::init()
{
skybox[SKY_LEFT] = Util::loadTexture(folder + "left.png");
skybox[SKY_BACK] = Util::loadTexture(folder + "back.png");
skybox[SKY_RIGHT] = Util::loadTexture(folder + "right.png");
skybox[SKY_FRONT] = Util::loadTexture(folder + "front.png");
skybox[SKY_TOP] = Util::loadTexture(folder + "top.png");
skybox[SKY_BOTTOM] = Util::loadTexture(folder + "bottom.png");
}
void Skybox::draw()
{
glColor4f(brightness/255, brightness/255, brightness/255, 1);
bool b1 = glIsEnabled(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glDisable(GL_COLOR_MATERIAL);
glBindTexture(GL_TEXTURE_2D, skybox[SKY_BACK]);
glBegin(GL_QUADS);
glTexCoord2f(1,1);
glVertex3f(size / 2, size / 2, size / 2);
glTexCoord2f(0,1);
glVertex3f(-size / 2, size / 2, size / 2);
glTexCoord2f(0,0);
glVertex3f(-size / 2, -size / 2, size / 2);
glTexCoord2f(1,0);
glVertex3f(size / 2, -size / 2, size / 2);
glEnd();
glBindTexture(GL_TEXTURE_2D, skybox[SKY_LEFT]);
glBegin(GL_QUADS);
//left face
glTexCoord2f(1,1);
glVertex3f(-size / 2, size / 2, size / 2);
glTexCoord2f(0,1);
glVertex3f(-size / 2, size / 2, -size / 2);
glTexCoord2f(0,0);
glVertex3f(-size / 2, -size / 2, -size / 2);
glTexCoord2f(1,0);
glVertex3f(-size / 2, -size / 2, size / 2);
glEnd();
glBindTexture(GL_TEXTURE_2D, skybox[SKY_FRONT]);
glBegin(GL_QUADS);
//front face
glTexCoord2f(0, 1);
glVertex3f(size / 2, size / 2, -size / 2);
glTexCoord2f(1, 1);
glVertex3f(-size / 2, size / 2, -size / 2);
glTexCoord2f(1, 0);
glVertex3f(-size / 2, -size / 2, -size / 2);
glTexCoord2f(0, 0);
glVertex3f(size / 2, -size / 2, -size / 2);
glEnd();
glBindTexture(GL_TEXTURE_2D, skybox[SKY_RIGHT]);
glBegin(GL_QUADS);
//right face
glTexCoord2f(1, 1);
glVertex3f(size / 2, size / 2, -size / 2);
glTexCoord2f(0,1);
glVertex3f(size / 2, size / 2, size / 2);
glTexCoord2f(0,0);
glVertex3f(size / 2, -size / 2, size / 2);
glTexCoord2f(1, 0);
glVertex3f(size / 2, -size / 2, -size / 2);
glEnd();
glBindTexture(GL_TEXTURE_2D, skybox[SKY_TOP]);
glBegin(GL_QUADS); //top face
glTexCoord2f(0,0);
glVertex3f(size / 2, size / 2, size / 2);
glTexCoord2f(0,1);
glVertex3f(-size / 2, size / 2, size / 2);
glTexCoord2f(1,1);
glVertex3f(-size / 2, size / 2, -size / 2);
glTexCoord2f(1,0);
glVertex3f(size / 2, size / 2, -size / 2);
glEnd();
glBindTexture(GL_TEXTURE_2D, skybox[SKY_BOTTOM]);
glBegin(GL_QUADS);
//bottom face
glTexCoord2f(0,1);
glVertex3f(size / 2, -size / 2, size / 2);
glTexCoord2f(0,0);
glVertex3f(-size / 2, -size / 2, size / 2);
glTexCoord2f(1,0);
glVertex3f(-size / 2, -size / 2, -size / 2);
glTexCoord2f(1,1);
glVertex3f(size / 2, -size / 2, -size / 2);
glEnd();
glEnable(GL_LIGHTING); //turn everything back, which we turned on, and turn everything off, which we have turned on.
glEnable(GL_DEPTH_TEST);
if (!b1)
glDisable(GL_TEXTURE_2D);
}
void Skybox::update(float deltaTime, int curr, int max)
{
targetBrightness = 80 + ((255 - 80) / max) * curr;
if (targetBrightness > brightness + 2)
{
brightness += 20 * deltaTime;
}
if (targetBrightness < brightness - 2)
{
brightness -= 20 * deltaTime;
}
}
GLuint Skybox::loadTexture(const std::string & fileName) //load the filename named texture
{
int width, height, bpp;
stbi_set_flip_vertically_on_load(true);
unsigned char* imgData = stbi_load(fileName.c_str(), &width, &height, &bpp, 4);
GLuint num;
glGenTextures(1, &num);
glBindTexture(GL_TEXTURE_2D, num);
glTexImage2D(GL_TEXTURE_2D,
0, //level
GL_RGBA, //internal format
width, //width
height, //height
0, //border
GL_RGBA, //data format
GL_UNSIGNED_BYTE, //data type
imgData); //data
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
stbi_image_free(imgData);
return num;
}
+21
View File
@@ -0,0 +1,21 @@
#pragma once
#include <string>
class Skybox
{
private:
float size;
std::string folder;
float brightness;
float targetBrightness;
public:
Skybox(const float &size, const std::string &folder);
~Skybox();
void init();
void draw();
void update(float deltaTime, int, int);
GLuint loadTexture(const std::string &fileName);
};
+167
View File
@@ -0,0 +1,167 @@
#include "Sound.h"
#include <iostream>
#ifdef WIN32
#include <windows.h>
#include <al.h>
#else
#include <AL/al.h>
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef unsigned int UNINT32;
typedef unsigned char BYTE;
#endif
Sound::Sound(const char* inWavPath, bool inLooping):
buffer_id(0),
source_id(0),
is_looping(inLooping)
{
const char* path = inWavPath;
FILE *fp = fopen(path, "rb"); // Open the WAVE file
if (!fp)
return; // Could not open file
// Check that the WAVE file is OK
char type[4];
fread(type, sizeof(char), 4, fp); // Reads the first bytes in the file
if (type[0] != 'R' || type[1] != 'I' || type[2] != 'F' || type[3] != 'F') // Should be "RIFF"
return; // Not RIFF
DWORD size;
fread(&size, sizeof(DWORD), 1, fp); // Continue to read the file
fread(type, sizeof(char), 4, fp); // Continue to read the file
if (type[0] != 'W' || type[1] != 'A' || type[2] != 'V' || type[3] != 'E') // This part should be "WAVE"
return; // Not WAVE
fread(type, sizeof(char), 4, fp); // Continue to read the file
if (type[0] != 'f' || type[1] != 'm' || type[2] != 't' || type[3] != ' ') // This part should be "fmt "
return; // Not fmt
// Now we know that the file is a acceptable WAVE file
// Info about the WAVE data is now read and stored
DWORD chunkSize;
fread(&chunkSize, sizeof(DWORD), 1, fp);
short formatType;
fread(&formatType, sizeof(short), 1, fp);
short channels;
fread(&channels, sizeof(short), 1, fp);
DWORD sampleRate;
fread(&sampleRate, sizeof(DWORD), 1, fp);
DWORD avgBytesPerSec;
fread(&avgBytesPerSec, sizeof(DWORD), 1, fp);
short bytesPerSample;
fread(&bytesPerSample, sizeof(short), 1, fp);
short bitsPerSample;
fread(&bitsPerSample, sizeof(short), 1, fp);
ALenum format = 0; // The audio format (bits per sample, number of channels)
if (bitsPerSample == 8)
{
if (channels == 1)
format = AL_FORMAT_MONO8;
else if (channels == 2)
format = AL_FORMAT_STEREO8;
}
else if (bitsPerSample == 16)
{
if (channels == 1)
format = AL_FORMAT_MONO16;
else if (channels == 2)
format = AL_FORMAT_STEREO16;
}
if (!format)
return; // Not valid format
fread(type, sizeof(char), 4, fp);
if (type[0] != 'd' || type[1] != 'a' || type[2] != 't' || type[3] != 'a') // This part should be "data"
return; // not data
DWORD dataSize;
fread(&dataSize, sizeof(DWORD), 1, fp); // The size of the sound data is read
// Display the info about the WAVE file
std::cout << "Chunk Size: " << chunkSize << "\n";
std::cout << "Format Type: " << formatType << "\n";
std::cout << "Channels: " << channels << "\n";
std::cout << "Sample Rate: " << sampleRate << "\n";
std::cout << "Average Bytes Per Second: " << avgBytesPerSec << "\n";
std::cout << "Bytes Per Sample: " << bytesPerSample << "\n";
std::cout << "Bits Per Sample: " << bitsPerSample << "\n";
std::cout << "Data Size: " << dataSize << "\n";
unsigned char* buf = new unsigned char[dataSize]; // Allocate memory for the sound data
std::cout << fread(buf, sizeof(BYTE), dataSize, fp) << " bytes loaded\n"; // Read the sound data and display the
fclose(fp);
alGenBuffers(1, &buffer_id); // Generate one OpenAL Buffer and link to "buffer"
alGenSources(1, &source_id); // Generate one OpenAL Source and link to "source"
if (alGetError() != AL_NO_ERROR)
return; // Error during buffer/source generation
alBufferData(buffer_id, format, buf, dataSize, sampleRate); // Store the sound data in the OpenAL Buffer
if (alGetError() != AL_NO_ERROR)
return; // Error during buffer loading
delete[] buf; // Delete the sound data buffer
}
Sound::~Sound()
{
alSourceStop(source_id);
alDeleteSources(1, &source_id); // Delete the OpenAL Source
alDeleteBuffers(1, &buffer_id); // Delete the OpenAL Buffer
}
void Sound::SetPos(const Vec3f& inPos, const Vec3f& inVel)
{
alSourcei(source_id, AL_BUFFER, buffer_id); // Link the buffer to the source
alSourcef(source_id, AL_PITCH, 1.0f); // Set the pitch of the source
alSourcef(source_id, AL_GAIN, 1.0f); // Set the gain of the source
alSourcefv(source_id, AL_POSITION, inPos.v); // Set the position of the source
alSourcefv(source_id, AL_VELOCITY, inVel.v); // Set the velocity of the source
alSourcei(source_id, AL_LOOPING, is_looping ? AL_TRUE : AL_FALSE); // Set if source is looping sound
}
void Sound::Play()
{
alSourcePlay(source_id);
int e = alGetError(); // != AL_NO_ERROR) return;
}
void Sound::Pause()
{
alSourcePause(source_id);
}
void Sound::Stop()
{
alSourceStop(source_id);
}
bool Sound::IsPlaying()
{
ALenum state;
alGetSourcei(source_id, AL_SOURCE_STATE, &state);
return (state == AL_PLAYING);
}
bool Sound::IsStopped()
{
ALenum state;
alGetSourcei(source_id, AL_SOURCE_STATE, &state);
std::cout << "MUSIC STATE: " << state << std::endl;
return (state == AL_STOPPED);
}
+24
View File
@@ -0,0 +1,24 @@
#pragma once
#include "Vector.h"
class Sound
{
public:
Sound(const char* inWavPath, bool inLooping);
~Sound();
void SetPos(const Vec3f& inPos, const Vec3f& inVel);
void Play();
void Pause();
void Stop();
bool IsPlaying();
bool IsStopped();
private:
unsigned int buffer_id;
unsigned int source_id;
bool is_looping;
};
+50
View File
@@ -0,0 +1,50 @@
#include "SoundSystem.h"
SoundSystem::SoundSystem():
device(nullptr),
context(nullptr)
{
device = alcOpenDevice(nullptr);
if (!device)
return;
context = alcCreateContext(device, nullptr);
if (!context)
return;
alcMakeContextCurrent(context);
}
SoundSystem::~SoundSystem()
{
for (auto sound : sounds)
delete sound;
alcMakeContextCurrent(nullptr);
alcDestroyContext(context);
alcCloseDevice(device);
}
void SoundSystem::SetListener(const Vec3f& inPos, const Vec3f& inVel, const Vec3f& inOri)
{
ALfloat orientation[] = { 0.0, 0.0, -1.0, 0.0, 1.0, 0.0 };
alListenerfv(AL_POSITION, inPos.v);
alListenerfv(AL_VELOCITY, inVel.v);
alListenerfv(AL_ORIENTATION, orientation);
}
unsigned int SoundSystem::LoadSound(const char* inWavPath, bool inLooping)
{
Sound* sound = new Sound(inWavPath, inLooping);
sounds.push_back(sound);
return sounds.size() - 1;
}
Sound* SoundSystem::GetSound(unsigned int inID)
{
if (inID > sounds.size())
return nullptr;
return sounds[inID];
}
+32
View File
@@ -0,0 +1,32 @@
#pragma once
#include <vector>
#ifdef WIN32
#include <al.h>
#include <alc.h>
#else
#include <AL/al.h>
#include <AL/alc.h>
#endif
#include "Vector.h"
#include "Sound.h"
class SoundSystem
{
public:
SoundSystem();
~SoundSystem();
void SetListener(const Vec3f& inPos, const Vec3f& inVel, const Vec3f& inOri);
unsigned int LoadSound(const char* inWavPath, bool inLooping);
Sound* GetSound(unsigned int inID);
private:
ALCdevice* device;
ALCcontext* context;
std::vector<Sound*> sounds;
};
-40
View File
@@ -1,40 +0,0 @@
#include "State.h"
State::State()
{
}
State::~State()
{
}
void State::Entry()
{
}
void State::Exit()
{
}
void State::Idle(float delta)
{
}
void State::Display()
{
}
void State::Keyboard(bool keys[255],float deltaTime)
{
}
void State::MouseMove(int x, int y, int dx, int dy)
{
}
void State::MouseClick(int button, int type, int x, int y)
{
}
-26
View File
@@ -1,26 +0,0 @@
#pragma once
#include "Header.h"
class State
{
public:
State();
~State();
virtual void Entry();
virtual void Exit();
virtual void Idle(float delta);
virtual void Display();
virtual void Keyboard(bool keys[255],float deltaTime);
virtual void MouseMove(int x, int y, int dx, int dy);
virtual void MouseClick(int button, int type, int x, int y);
};
#include "InitState.h"
#include "LoadingState.h"
#include "MenuState.h"
#include "SettingsState.h"
#include "WorldState.h"
-33
View File
@@ -1,33 +0,0 @@
#include "StateHandler.h"
StateHandler::StateHandler()
{
StateList.push_back(new InitState()); //INIT_STATE
StateList.push_back(new LoadingState()); //LOADING_STATE
StateList.push_back(new MenuState()); //MENU_STATE
StateList.push_back(new SettingsState()); //SETTINGS_STATE
StateList.push_back(new WorldState()); //WORLD_STATE
//CurrentState = INIT_STATE;
CurrentState = WORLD_STATE;
}
StateHandler::~StateHandler()
{
}
void StateHandler::Navigate(EState state)
{
if (CurrentState == state)
return;
StateList.at(CurrentState)->Exit();
CurrentState = state;
StateList.at(CurrentState)->Entry();
}
State* StateHandler::GetCurrentState()
{
return StateList.at(CurrentState);
}
-19
View File
@@ -1,19 +0,0 @@
#pragma once
#include "Header.h"
#include "State.h"
class StateHandler
{
public:
enum EState { INIT_STATE = 0, LOADING_STATE = 1, MENU_STATE = 2, SETTINGS_STATE = 3, WORLD_STATE = 4 };
StateHandler();
~StateHandler();
void Navigate(EState state);
State* GetCurrentState();
private:
EState CurrentState;
vector<State*> StateList;
};
+31
View File
@@ -0,0 +1,31 @@
#include "Text.h"
Text::Text(const std::string &text, Vec2f position) : MenuElement(position)
{
this->text = text;
color = Vec3f(50, 150, 150);
textHeight = 14;
textWidth = Util::glutTextWidth(text);
}
Text::~Text()
{
}
void Text::draw()
{
glColor4f(color.x/255.0f, color.y/255.0f, color.z/255.0f, 1.0f);
Util::glutBitmapString(text, position.x-1, position.y+textHeight);
}
void Text::update(int x, int y)
{
//Do nothing
}
void Text::setColor(Vec3f color)
{
this->color = color;
}
+23
View File
@@ -0,0 +1,23 @@
#pragma once
#include "MenuElement.h"
#include "Vector.h"
#include "Util.h"
class Text : public MenuElement
{
private:
std::string text;
Vec3f color;
protected:
int textWidth;
int textHeight;
public:
Text(const std::string &text, Vec2f position);
~Text();
virtual void draw();
virtual void update(int x, int y);
void setColor(Vec3f color);
};
+65
View File
@@ -0,0 +1,65 @@
#include "Util.h"
#include "stb_image.h"
Util::Util()
{
}
Util::~Util()
{
}
GLuint Util::loadTexture(const std::string &filename)
{
int width, height, bpp;
stbi_set_flip_vertically_on_load(true);
unsigned char* imgData = stbi_load(filename.c_str(), &width, &height, &bpp, 4);
GLuint num;
glGenTextures(1, &num);
glBindTexture(GL_TEXTURE_2D, num);
glTexImage2D(GL_TEXTURE_2D,
0, //level
GL_RGBA, //internal format
width, //width
height, //height
0, //border
GL_RGBA, //data format
GL_UNSIGNED_BYTE, //data type
imgData); //data
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
stbi_image_free(imgData);
return num;
}
void Util::glutBitmapString(std::string str, int x, int y)
{
glRasterPos2f(x, y);
for (int i = 0; i < str.size(); i++)
{
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, str[i]);
}
}
int Util::glutTextWidth(const std::string str)
{
int total = 0;
for (int i = 0; i < str.size(); i++)
{
total += glutBitmapWidth(GLUT_BITMAP_HELVETICA_18, str[i]);
}
return total;
}
//int Util::glutTextHeight()
//{
// return glutBitmapHeight(GLUT_BITMAP_HELVETICA_18);
//}
+16
View File
@@ -0,0 +1,16 @@
#pragma once
#include <string>
#include <GL\freeglut.h>
class Util
{
private:
Util();
~Util();
public:
static GLuint loadTexture(const std::string &filename);
static void glutBitmapString(std::string str, int x, int y);
static int glutTextWidth(const std::string str);
//static int glutTextHeight();
};
+83 -2
View File
@@ -1,3 +1,5 @@
#define _USE_MATH_DEFINES
#include <cmath>
#include "Vector.h" #include "Vector.h"
Vec3f::Vec3f(float x, float y, float z) Vec3f::Vec3f(float x, float y, float z)
@@ -6,13 +8,36 @@ Vec3f::Vec3f(float x, float y, float z)
this->y = y; this->y = y;
this->z = z; this->z = z;
} }
/*The length of the vector*/
float Vec3f::Length()
{
return (float)sqrt(x*x+y*y+z*z);
}
void Vec3f::Normalize()
{
float length = this->Length();
if (length != 0)
{
x = x / length;
y = y / length;
z = z / length;
}
}
float Vec3f::Distance(const Vec3f &other)
{
return (float)sqrt(pow(other.x - x, 2)+pow(other.y - y, 2)+pow(other.z - z, 2));
}
Vec3f::Vec3f() Vec3f::Vec3f()
{ {
this->x = 0; this->x = 0;
this->y = 0; this->y = 0;
this->z = 0; this->z = 0;
} }
Vec3f::Vec3f(Vec3f &other) Vec3f::Vec3f(const Vec3f &other)
{ {
this->x = other.x; this->x = other.x;
this->y = other.y; this->y = other.y;
@@ -24,6 +49,51 @@ float& Vec3f::operator [](int index)
return v[index]; return v[index];
} }
Vec3f Vec3f::operator+(const Vec3f & other)
{
return Vec3f(x + other.x, y + other.y, z + other.z);
}
Vec3f Vec3f::operator-(const Vec3f & other)
{
return Vec3f(x - other.x, y - other.y, z - other.z);
}
Vec3f Vec3f::operator/(float value)
{
return Vec3f(x / value, y / value, z / value);
}
bool Vec3f::operator==(const Vec3f & other)
{
/*bool xb, yb,zb;
xb = x == other.x;
yb = y == other.y;
zb = z == other.z;
if (xb & yb & zb)
return true;*/
return x == other.x & y == other.y & z == other.z;
}
bool Vec3f::operator!=(const Vec3f & other)
{
return x != other.x & y != other.y & z != other.z;
}
Vec3f Vec3f::operator*(const float & other)
{
return Vec3f(x*other, y*other, z*other);
}
Vec3f Vec3f::cross(const Vec3f & other)
{
return Vec3f(
y*other.z - other.y*z,
z*other.x - other.z*x,
x*other.y - other.x*y
);
}
Vec2f::Vec2f(float x, float y) Vec2f::Vec2f(float x, float y)
@@ -36,7 +106,7 @@ Vec2f::Vec2f()
this->x = 0; this->x = 0;
this->y = 0; this->y = 0;
} }
Vec2f::Vec2f(Vec2f &other) Vec2f::Vec2f(const Vec2f &other)
{ {
this->x = other.x; this->x = other.x;
this->y = other.y; this->y = other.y;
@@ -46,3 +116,14 @@ float& Vec2f::operator [](int index)
{ {
return v[index]; return v[index];
} }
Vec2f Vec2f::operator+(const Vec2f & other)
{
return Vec2f(x + other.x, y+other.y);
}
float Vec2f::length()
{
return (float)sqrt(x*x + y*y);
}
+16 -3
View File
@@ -1,5 +1,4 @@
#pragma once #pragma once
#include "Header.h"
class Vec3f class Vec3f
{ {
@@ -13,9 +12,21 @@ public:
float v[3]; float v[3];
}; };
Vec3f(); Vec3f();
Vec3f(Vec3f &other); Vec3f(const Vec3f &other);
Vec3f(float x, float y, float z); Vec3f(float x, float y, float z);
float Length();
void Normalize();
float Distance(const Vec3f &);
float& operator [](int); float& operator [](int);
Vec3f operator + (const Vec3f &other);
Vec3f operator -(const Vec3f &other);
Vec3f operator / (float value);
bool operator ==(const Vec3f &other);
bool operator !=(const Vec3f &other);
Vec3f operator *(const float &other);
Vec3f cross(const Vec3f &other);
}; };
class Vec2f class Vec2f
@@ -31,7 +42,9 @@ public:
}; };
Vec2f(); Vec2f();
Vec2f(float x, float y); Vec2f(float x, float y);
Vec2f(Vec2f &other); Vec2f(const Vec2f &other);
float& operator [](int); float& operator [](int);
Vec2f operator + (const Vec2f &other);
float length();
}; };
+39
View File
@@ -0,0 +1,39 @@
#include "Vertex.h"
Vertex::Vertex(float x, float y, float z, float nx, float ny, float nz, float tx, float ty)
{
this->x = x;
this->y = y;
this->z = z;
this->normalX = nx;
this->normalY = ny;
this->normalZ = nz;
this->texX = tx;
this->texY = ty;
}
Vertex::~Vertex()
{
}
Vertex Vertex::operator/(const float &other) const
{
return Vertex(x / other, y / other, z / other, normalX, normalY, normalZ, texX, texY);
}
Vertex Vertex::operator*(const Vertex & other) const
{
return Vertex(x*other.x, y*other.y, z*other.z, normalX, normalY, normalZ, texX, texY);
}
Vertex Vertex::operator*(const float & other) const
{
return Vertex(x*other, y*other, z*other, normalX, normalY, normalZ, texX, texY);
}
Vertex Vertex::operator+(const Vertex & other) const
{
return Vertex(x+other.x, y+other.y, z+other.z, normalX, normalY, normalZ, texX, texY);
}
+24
View File
@@ -0,0 +1,24 @@
#pragma once
class Vertex
{
public:
Vertex(float x, float y, float z, float nx, float ny, float nz, float tx, float ty);
~Vertex();
float x;
float y;
float z;
float normalX;
float normalY;
float normalZ;
float texX;
float texY;
Vertex operator/(const float &other) const;
Vertex operator*(const Vertex &other) const;
Vertex operator*(const float &other) const;
Vertex operator+(const Vertex &other) const;
};
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
-28
View File
@@ -1,28 +0,0 @@
#include "Weapon.h"
Weapon::Weapon(const string &filename)
{
weaponModel = new Model(filename);
}
Weapon::Weapon()
{
}
Weapon::~Weapon()
{
}
void Weapon::draw_weapon(void)
{
if (weaponModel != nullptr)
{
glScalef(scale,scale,scale);
glRotatef(135, 1, 0, 0);
weaponModel->draw();
}
}
-16
View File
@@ -1,16 +0,0 @@
#pragma once
#include "Header.h"
#include "Model.h"
class Weapon
{
public:
Weapon(const string &filename);
Weapon();
~Weapon();
void draw_weapon(void);
private:
Model *weaponModel = nullptr;
float scale = 0.5f;
};
+349
View File
@@ -0,0 +1,349 @@
#include "World.h"
#include <GL/freeglut.h>
#include "Entity.h"
#include "json.h"
#include "Model.h"
#include <fstream>
#include <iostream>
#include <algorithm>
#include "WorldHandler.h"
World::World(const std::string &fileName):
music_id(-1)
{
nextworld = false;
//Store player instance
player = Player::getInstance();
//Create the interface
interface = new Interface();
//Open world json file
std::ifstream file(fileName);
if(!file.is_open())
std::cout<<"Error, can't open world file - " << fileName << "\n";
json::Value v = json::readJson(file);
file.close();
//Check file
if(v["world"].isNull() || v["world"]["heightmap"].isNull() || v["world"]["skybox"].isNull())
std::cout << "Invalid world file: world - " << fileName << "\n";
if (v["world"]["object-templates"].isNull())
std::cout << "Invalid world file: object templates - " << fileName << "\n";
if (v["player"].isNull() || v["player"]["startposition"].isNull())
std::cout << "Invalid world file: player - " << fileName << "\n";
if (v["objects"].isNull())
std::cout << "Invalid world file: objects - " << fileName << "\n";
if (v["enemies"].isNull())
std::cout << "Invalid world file: enemies - " << fileName << "\n";
if (v["crystals"].isNull())
std::cout << "Invalid world file: crystals - " << fileName << "\n";
//Load object templates
for (auto objt : v["world"]["object-templates"])
{
//collision
bool cancollide = true;
if (!objt["collision"].isNull())
cancollide = objt["collision"].asBool();
objecttemplates.push_back(std::pair<int, std::pair<std::string, bool>>(objt["color"], std::pair<std::string, bool>(objt["file"], cancollide)));
}
//Generate heightmap for this world
heightmap = new HeightMap(v["world"]["heightmap"].asString(), this);
//Load skybox
skybox = new Skybox(15000.0f, v["world"]["skybox"].asString());
skybox->init();
//Map different texture to heightmap if available
if(!v["world"]["texture"].isNull())
heightmap->SetTexture(v["world"]["texture"].asString());
//Set player starting position
player->position.x = v["player"]["startposition"][0].asFloat();
player->position.y = v["player"]["startposition"][1].asFloat();
player->position.z = v["player"]["startposition"][2].asFloat();
//Load and place objects into world
for (auto object : v["objects"])
{
//Collision
bool hasCollision = true;
if (!object["collide"].isNull())
hasCollision = object["collide"].asBool();
//Rotation
Vec3f rotation(0, 0, 0);
if(!object["rot"].isNull())
rotation = Vec3f(object["rot"][0].asFloat(), object["rot"][1].asFloat(), object["rot"][2].asFloat());
//Scale
float scale = 1;
if (!object["scale"].isNull())
scale = object["scale"].asFloat();
//Position
if (object["pos"].isNull())
std::cout << "Invalid world file: objects pos - " << fileName << "\n";
//File
if (object["file"].isNull())
std::cout << "Invalid world file: objects file - " << fileName << "\n";
//Create
Vec3f position(object["pos"][0].asFloat(), object["pos"][1].asFloat(), object["pos"][2].asFloat());
position.y = getHeight(position.x, position.z);
entities.push_back(new LevelObject(object["file"].asString(), position, rotation, scale, hasCollision));
}
maxEnemies = 0;
//Load and place enemies into world
for (auto e : v["enemies"])
{
//Rotation
Vec3f rotation(0, 0, 0);
if (!e["rot"].isNull())
rotation = Vec3f(e["rot"][0].asFloat(), e["rot"][1].asFloat(), e["rot"][2].asFloat());
//Scale
float scale = 1.0f;
if (!e["scale"].isNull())
scale = e["scale"].asFloat();
//Position
if (e["pos"].isNull())
std::cout << "Invalid world file: enemies pos - " << fileName << "\n";
//File
if (e["file"].isNull())
std::cout << "Invalid world file: enemies file - " << fileName << "\n";
//Music
if (e["music"].isNull())
std::cout << "Invalid world file: enemies music - " << fileName << "\n";
//Create
Vec3f position(e["pos"][0].asFloat(), e["pos"][1].asFloat(), e["pos"][2].asFloat());
position.y = getHeight(position.x, position.z) + 2.0f;
maxEnemies++;
enemies.push_back(new Enemy(e["file"].asString(), e["music"].asString(), position, rotation, scale));
}
maxCrystals = 0;
if (!v["crystal"].isNull())
{
std::string filled = "unknown";
std::string empty = "unknown";
if(!v["crystal"]["full texture"].isNull())
filled = v["crystal"]["full texture"].asString();
if(!v["crystal"]["empty texture"].isNull())
empty = v["crystal"]["empty texture"].asString();
if (!v["crystal"]["instances"].isNull())
{
for (auto instance : v["crystal"]["instances"])
{
Vec3f position(0, 0, 0);
Vec3f rotation(0, 0, 0);
float scale = 1.0f;
if (!instance["pos"].isNull())
{
position.x = instance["pos"][0];
position.y = instance["pos"][1];
position.z = instance["pos"][2];
}
if (!instance["rot"].isNull())
{
rotation.x = instance["rot"][0];
rotation.y = instance["rot"][1];
rotation.z = instance["rot"][2];
}
if (!instance["scale"].isNull())
scale = instance["scale"].asFloat();
position.y = getHeight(position.x, position.z);
maxCrystals++;
Crystal *c = new Crystal(filled, empty, position, rotation, scale);
entities.push_back(c);
}
interface->maxCrystals = maxCrystals;
}
}
if (!v["world"]["music"].isNull())
{
music_id = CrystalPoint::GetSoundSystem().LoadSound(v["world"]["music"].asString().c_str(), true);
music = CrystalPoint::GetSoundSystem().GetSound(music_id);
}
if (!v["portal"].isNull())
{
Vec3f pos(0, 0, 0);
if (!v["portal"]["pos"].isNull())
pos = Vec3f(v["portal"]["pos"][0].asFloat(),
v["portal"]["pos"][1].asFloat(),
v["portal"]["pos"][0].asFloat());
pos.y = getHeight(pos.x, pos.z);
Vec3f rot(0, 0, 0);
if (!v["portal"]["rot"].isNull())
pos = Vec3f(v["portal"]["rot"][0].asFloat(),
v["portal"]["rot"][1].asFloat(),
v["portal"]["rot"][0].asFloat());
float scale = 1.0f;
if (!v["portal"]["scale"].isNull())
scale = !v["portal"]["scale"].asFloat();
portal = new Portal(v["portal"]["file"], pos, rot, scale);
entities.push_back(portal);
portal->maxCrystals = maxCrystals;
}
}
World::~World()
{
delete heightmap;
music->Stop();
delete music;
delete skybox;
delete portal;
}
std::pair<std::string, bool> World::getObjectFromValue(int val)
{
for (auto i : objecttemplates)
{
if (i.first == val)
return i.second;
}
return objecttemplates[0].second;
}
float World::getHeight(float x, float y)
{
return heightmap->GetHeight(x, y);
}
void World::draw()
{
player->setCamera();
float lightPosition[4] = { 0, 12, 1, 0 };
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
GLfloat lightAmbient[] = { 0.05, 0.05, 0.05, 0 };
GLfloat light_diffuse[] = { 0.9, 0.9, 0.9, 0 };
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
GLfloat mat_specular[] = { 0.15, 0.15, 0.15, 0 };
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
skybox->draw();
heightmap->Draw();
for (auto &enemy : enemies)
enemy->draw();
for (auto &entity : entities)
entity->draw();
interface->draw();
}
void World::update(float elapsedTime)
{
if (nextworld)
{
WorldHandler::getInstance()->NextWorld();
return;
}
music->SetPos(player->position, Vec3f());
if (music->IsPlaying() == false)
{
music->Play();
}
for (auto &entity : entities)
entity->update(elapsedTime);
int count = 0;
int remove = false;
for (auto &enemy : enemies)
{
//Al deze code zou in enemy moeten staan
enemy->inEyeSight(player->position);
enemy->update(elapsedTime);
if (enemy->hasTarget)
{
for (auto e : entities)
{
if (e->canCollide && e->inObject(enemy->position))
{
enemy->collide(e);
break;
}
}
if (enemy->attack)
{
remove = true;
continue;
}
}
enemy->position.y = getHeight(enemy->position.x, enemy->position.z) + 2.0f;
if(!remove)
count++;
}
if(remove)
enemies.erase(enemies.begin() + count);
skybox->update(elapsedTime, maxEnemies - enemies.size(), maxEnemies);
if (portal->mayEnter)
{
if (portal->enter(elapsedTime))
nextworld = true;
}
}
void World::addLevelObject(LevelObject* obj)
{
entities.push_back(obj);
}
bool World::isPlayerPositionValid()
{
for (auto &e : entities)
{
if (e->canCollide && e->inObject(player->position))
{
e->collide();
return false;
}
}
return true;
}
+47
View File
@@ -0,0 +1,47 @@
#pragma once
#include <vector>
#include "HeightMap.h"
#include "Player.h"
#include "Enemy.h"
#include "LevelObject.h"
#include "Interface.h"
#include "Crystal.h"
#include "Skybox.h"
#include "CrystalPoint.h"
#include "Portal.h"
class Entity;
class World
{
private:
std::vector<std::pair<int, std::pair<std::string, bool>>> objecttemplates;
Sound* music;
Player* player;
HeightMap* heightmap;
Interface* interface;
Skybox* skybox;
Portal* portal;
bool nextworld;
int music_id,maxCrystals,maxEnemies;
std::vector<Entity*> entities;
std::vector<Enemy*> enemies;
//std::vector<Crystal*> crystals;
public:
World(const std::string &fileName);
~World();
void draw();
void update(float elapsedTime);
bool isPlayerPositionValid();
float getHeight(float x, float y);
void addLevelObject(LevelObject* obj);
std::pair<std::string, bool> getObjectFromValue(int i);
};
+140
View File
@@ -0,0 +1,140 @@
#include "WorldHandler.h"
#include "World.h"
#include "json.h"
#include <fstream>
#include <iostream>
#include <string>
WorldHandler* WorldHandler::instance = nullptr;
void WorldHandler::ChangeWorld(int i)
{
if (i < 0)
i = worldfiles.size() - 1;
else if (i >= worldfiles.size())
i = 0;
if (i != worldIndex)
{
loadingWorld = true;
if(worldIndex != -1)
delete world;
world = new World(worldfiles[i]);
worldIndex = i;
loadingWorld = false;
}
}
WorldHandler::WorldHandler()
{
loadingWorld = true;
worldIndex = -1;
//Find worlds.json
std::ifstream file("worlds/worlds.json");
if (!file.is_open())
std::cout << "Error, can't open worlds overview file\n";
json::Value v = json::readJson(file);
file.close();
//Load file names into vector
if (v["worlds"].isNull() || !v["worlds"].isArray())
std::cout << "Error, no content in worlds overview file\n";
for (auto line : v["worlds"])
{
std::cout << "Found world: " << line << "\n";
worldfiles.push_back(line);
}
if (worldfiles.size() > 0)
{
ChangeWorld(0);
}
}
WorldHandler::~WorldHandler()
{
worldIndex = -1;
delete world;
}
WorldHandler* WorldHandler::getInstance()
{
if (instance == nullptr)
instance = new WorldHandler();
return instance;
}
void WorldHandler::init()
{
instance = new WorldHandler();
}
void WorldHandler::draw(void)
{
if(!loadingWorld)
world->draw();
else
{
//Draw Loading screen
}
}
void WorldHandler::update(float deltaTime)
{
if(!loadingWorld)
world->update(deltaTime);
}
bool WorldHandler::isPlayerPositionValid(void)
{
if(!loadingWorld)
return world->isPlayerPositionValid();
return false;
}
float WorldHandler::getHeight(float x, float y)
{
if (!loadingWorld)
return world->getHeight(x, y);
else
return 0.0f;
}
void WorldHandler::Navigate(const std::string &fileName)
{
if (!loadingWorld)
{
for (int i = 0; i < worldfiles.size(); i++)
{
if (worldfiles[i] == fileName)
ChangeWorld(i);
}
}
}
void WorldHandler::NextWorld()
{
if (!loadingWorld)
{
ChangeWorld(worldIndex + 1);
Player::getInstance()->crystals = 0;
}
}
void WorldHandler::PreviousWorld()
{
if (!loadingWorld)
{
ChangeWorld(worldIndex - 1);
Player::getInstance()->crystals = 0;
}
}
+36
View File
@@ -0,0 +1,36 @@
#pragma once
#include <string>
#include <vector>
class World;
class WorldHandler
{
private:
WorldHandler();
static WorldHandler* instance;
bool loadingWorld;
World* world;
int worldIndex;
void ChangeWorld(int i);
public:
~WorldHandler();
static WorldHandler* getInstance(void);
static void init();
void draw(void);
void update(float deltaTime);
bool isPlayerPositionValid(void);
float getHeight(float x, float y);
void Navigate(const std::string &fileName);
void NextWorld();
void PreviousWorld();
std::vector<std::string> worldfiles;
};
-12
View File
@@ -1,12 +0,0 @@
#include "WorldModel.h"
WorldModel::WorldModel()
{
}
WorldModel::~WorldModel()
{
}
-10
View File
@@ -1,10 +0,0 @@
#pragma once
#include "Header.h"
class WorldModel
{
public:
WorldModel();
~WorldModel();
};
-49
View File
@@ -1,49 +0,0 @@
#include "WorldState.h"
#include "Player.h"
WorldState::WorldState()
{
/*player = Player::GetInstance();*/
}
WorldState::~WorldState()
{
//if (player != nullptr)
//delete player;
}
void WorldState::Keyboard(bool keys[255],float deltaTime)
{
float speed = 10;
std::cout << "Keyboard doet het in de world state" << std::endl;
/*if (keys['a']) player->PlayerMoveEyes(0, deltaTime*speed, false);
if (keys['d']) player->PlayerMoveEyes(180, deltaTime*speed, false);
if (keys['w']) player->PlayerMoveEyes(90, deltaTime*speed, false);
if (keys['s']) player->PlayerMoveEyes(270, deltaTime*speed, false);
if (keys['q']) player->PlayerMoveEyes(1, deltaTime*speed, true);
if (keys['e']) player->PlayerMoveEyes(-1, deltaTime*speed, true); */
if (keys['a']) Player::GetInstance().PlayerMoveEyes(0, deltaTime*speed, false);
if (keys['d']) Player::GetInstance().PlayerMoveEyes(180, deltaTime*speed, false);
if (keys['w']) Player::GetInstance().PlayerMoveEyes(90, deltaTime*speed, false);
if (keys['s']) Player::GetInstance().PlayerMoveEyes(270, deltaTime*speed, false);
if (keys['q']) Player::GetInstance().PlayerMoveEyes(1, deltaTime*speed, true);
if (keys['e']) Player::GetInstance().PlayerMoveEyes(-1, deltaTime*speed, true);
}
void WorldState::MouseMove(int x, int y, int dx, int dy)
{
//player->PlayerRotateEyes(dx, dy);
Player::GetInstance().PlayerRotateEyes(dx, dy);
}
void WorldState::Display()
{
Player::GetInstance().Display();
glutSolidCube(10.0);
}
-18
View File
@@ -1,18 +0,0 @@
#pragma once
#include "Header.h"
#include "State.h"
#include "Player.h"
class WorldState : public State
{
public:
WorldState();
~WorldState();
void Keyboard(bool keys[255],float deltaTime);
void MouseMove(int x, int y, int dx, int dy);
void Display();
private:
//Player* player;
};
+730
View File
@@ -0,0 +1,730 @@
#include "json.h"
#include <iomanip>
#include <sstream>
#include <iostream>
#include <cmath>
#include <cfloat>
#include <set>
#include <cstdlib>
#include <math.h>
#include <stdlib.h>
namespace json
{
Value Value::null;
//constructors
Value::Value()
{
type = Type::nullValue;
value.objectValue = NULL;
}
Value::Value(Type type)
{
this->type = type;
if (type == Type::stringValue)
value.stringValue = new std::string();
if (type == Type::arrayValue)
value.arrayValue = new std::vector<Value>();
if (type == Type::objectValue)
value.objectValue = new std::map<std::string, Value>();
}
Value::Value(int value)
{
type = Type::intValue;
this->value.intValue = value;
}
Value::Value(float value)
{
type = Type::floatValue;
this->value.floatValue = value;
}
Value::Value(bool value)
{
type = Type::boolValue;
this->value.boolValue = value;
}
Value::Value(const std::string &value)
{
type = Type::stringValue;
this->value.stringValue = new std::string();
this->value.stringValue->assign(value);
}
Value::Value(const char* value)
{
type = Type::stringValue;
this->value.stringValue = new std::string();
this->value.stringValue->assign(value);
}
Value::Value(const Value& other) : Value(other.type)
{
if (type == Type::objectValue)
*this->value.objectValue = *other.value.objectValue;
else if (type == Type::arrayValue)
*this->value.arrayValue = *other.value.arrayValue;
else if (type == Type::stringValue)
this->value.stringValue->assign(*other.value.stringValue);
else
this->value = other.value;
}
void Value::operator=(const Value& other)
{
if (type != other.type)
{
if (type == Type::stringValue)
delete value.stringValue;
if (type == Type::arrayValue)
delete value.arrayValue;
if (type == Type::objectValue)
delete value.objectValue;
this->type = other.type;
if (type == Type::stringValue)
value.stringValue = new std::string();
if (type == Type::arrayValue)
value.arrayValue = new std::vector<Value>();
if (type == Type::objectValue)
value.objectValue = new std::map<std::string, Value>();
}
if (type == Type::objectValue)
*this->value.objectValue = *other.value.objectValue;
else if (type == Type::arrayValue)
*this->value.arrayValue = *other.value.arrayValue;
else if (type == Type::stringValue)
this->value.stringValue->assign(*other.value.stringValue);
else
this->value = other.value;
}
Value::~Value()
{
if (type == Type::stringValue)
delete value.stringValue;
else if (type == Type::arrayValue)
delete value.arrayValue;
else if (type == Type::objectValue)
delete value.objectValue;
}
size_t Value::size() const
{
assert(type == Type::arrayValue || type == Type::objectValue);
if (type == Type::arrayValue)
return value.arrayValue->size();
else if (type == Type::objectValue)
return value.objectValue->size();
throw "Unsupported";
}
void Value::push_back(const Value& value)
{
assert(type == Type::arrayValue || type == Type::nullValue);
if (type == Type::nullValue)
{
type = Type::arrayValue;
this->value.arrayValue = new std::vector<Value>();
}
this->value.arrayValue->push_back(value);
}
Value& Value::operator[](const std::string &key)
{
assert(type == Type::objectValue);
return (*value.objectValue)[key];
}
Value& Value::operator[](const std::string &key) const
{
assert(type == Type::objectValue);
return (*value.objectValue)[key];
}
Value& Value::operator[](const char* key)
{
assert(type == Type::objectValue || type == Type::nullValue);
if (type == Type::nullValue)
{
type = Type::objectValue;
value.objectValue = new std::map<std::string, Value>();
}
return (*value.objectValue)[std::string(key)];
}
Value& Value::operator[](const char* key) const
{
assert(type == Type::objectValue);
return (*value.objectValue)[std::string(key)];
}
Value& Value::operator[](size_t index)
{
assert(type == Type::arrayValue);
return (*value.arrayValue)[index];
}
Value& Value::operator[](size_t index) const
{
assert(type == Type::arrayValue);
return (*value.arrayValue)[index];
}
Value& Value::operator[](int index)
{
assert(type == Type::arrayValue);
return (*value.arrayValue)[index];
}
Value& Value::operator[](int index) const
{
assert(type == Type::arrayValue);
return (*value.arrayValue)[index];
}
void Value::erase(size_t index)
{
throw "Cannot cast";
}
Value::Iterator Value::end() const
{
if (type == Type::objectValue)
return Iterator(value.objectValue->end());
else if (type == Type::arrayValue)
return Iterator(value.arrayValue->end());
throw "oops";
}
Value::Iterator Value::begin() const
{
if (type == Type::objectValue)
return Iterator(value.objectValue->begin());
else if (type == Type::arrayValue)
return Iterator(value.arrayValue->begin());
throw "oops";
}
///iterator stuff
Value Value::Iterator::operator*()
{
if (type == Type::objectValue)
return this->objectIterator->second;
else if (type == Type::arrayValue)
return *arrayIterator;
throw "Oops";
}
bool Value::Iterator::operator!=(const Iterator &other)
{
if (type == Type::objectValue)
return this->objectIterator != other.objectIterator;
else if (type == Type::arrayValue)
return this->arrayIterator != other.arrayIterator;
throw "Oops";
}
void Value::Iterator::operator++()
{
if (type == Type::objectValue)
this->objectIterator++;
else if (type == Type::arrayValue)
this->arrayIterator++;
}
void Value::Iterator::operator++(int)
{
if (type == Type::objectValue)
this->objectIterator++;
else if (type == Type::arrayValue)
this->arrayIterator++;
}
Value::Iterator::Iterator(const std::vector<Value>::iterator& arrayIterator)
{
type = Type::arrayValue;
this->arrayIterator = arrayIterator;
}
Value::Iterator::Iterator(const std::map<std::string, Value>::iterator& objectIterator)
{
type = Type::objectValue;
this->objectIterator = objectIterator;
}
std::string Value::Iterator::key()
{
assert(type == Type::objectValue);
return this->objectIterator->first;
}
Value& Value::Iterator::value()
{
assert(type == Type::objectValue);
return this->objectIterator->second;
}
static void ltrim(std::istream& stream);
static void eatComment(std::istream& stream);
static Value eatString(std::istream& stream);
static Value eatObject(std::istream& stream);
static Value eatArray(std::istream& stream);
static Value eatNumeric(std::istream& stream, char firstChar);
static Value eatBool(std::istream& stream);
static Value eatNull(std::istream& stream);
static Value eatValue(std::istream& stream);
//reading
static void ltrim(std::istream& stream)
{
char c = stream.peek();
while (c == ' ' || c == '\t' || c == '\n' || c == '\r')
{
stream.get();
c = stream.peek();
}
};
static Value eatString(std::istream& stream)
{
std::string value = "";
bool escaped = false;
while (!stream.eof())
{
char c = stream.get();
if (c == '\\' && !escaped)
escaped = !escaped;
else if (c == '\"' && !escaped)
return Value(value);
else
{
value += c;
escaped = false;
}
}
return Value(value);
};
static Value eatObject(std::istream& stream)
{
Value obj(Type::objectValue);
while (!stream.eof())
{
ltrim(stream);
char token = stream.get();
if (token == '}')
break; //empty object
if (token == '/')
{
eatComment(stream);
token = stream.get();
}
assert(token == '"');
Value key = eatString(stream);
ltrim(stream);
token = stream.get();
assert(token == ':');
ltrim(stream);
Value val = eatValue(stream);
obj[key.asString()] = val;
ltrim(stream);
token = stream.get();
if (token == '}')
break;
assert(token == ',');
}
return obj;
};
static Value eatArray(std::istream& stream)
{
Value obj(Type::arrayValue);
while (!stream.eof())
{
ltrim(stream);
if (stream.peek() == ']')
{
stream.get();
break;
}
obj.push_back(eatValue(stream));
ltrim(stream);
char token = stream.get();
if (token == '/')
{
eatComment(stream);
token = stream.get();
}
if (token == ']')
break;
assert(token == ',');
}
return obj;
};
static Value eatNumeric(std::istream& stream, char firstChar)
{
std::string numeric(1, firstChar);
while (!stream.eof())
{
char token = stream.peek();
if ((token >= '0' && token <= '9') || token == '.' || token == '-')
numeric += stream.get();
else
break;
}
if (numeric.find('.') == std::string::npos)
return Value(atoi(numeric.c_str()));
else
return Value((float)atof(numeric.c_str()));
};
static Value eatBool(std::istream& stream)
{
char token = stream.get();
if (token == 'a') //fAlse
{
stream.get(); //l
stream.get(); //s
stream.get(); //e
return false;
}
else if (token == 'r') //tRue
{
stream.get(); // u
stream.get(); // e
return true;
}
return Value(Type::nullValue);
};
static Value eatNull(std::istream& stream)
{
return Value(Type::nullValue);
};
//precondition: / is already eaten
static void eatComment(std::istream& stream)
{
char token = stream.get();
assert(token == '/' || token == '*');
if (token == '*')
{
char last = token;
while ((last != '*' || token != '/') && !stream.eof())
{
last = token;
token = stream.get();
}
}
else if (token == '/')
while (token != '\n' && !stream.eof())
token = stream.get();
ltrim(stream);
}
static Value eatValue(std::istream& stream)
{
ltrim(stream);
char token = stream.get();
if (token == '{')
return eatObject(stream);
if (token == '[')
return eatArray(stream);
if ((token >= '0' && token <= '9') || token == '.' || token == '-')
return eatNumeric(stream, token);
if (token == '"')
return eatString(stream);
if (token == 't' || token == 'f')
return eatBool(stream);
if (token == 'n')
return eatNull(stream);
if (token == '/')
{
eatComment(stream);
return eatValue(stream);
}
throw "Unable to parse json";
};
Value readJson(const std::string &data)
{
std::stringstream stream;
stream << data;
printf("%s", "test");
return eatValue(stream);
}
Value readJson(std::istream &stream)
{
return eatValue(stream);
}
std::ostream& indent(std::ostream& stream, int level)
{
for (int i = 0; i < level; i++)
stream << '\t';
return stream;
}
std::ostream& Value::prettyPrint(std::ostream& stream, json::Value& printConfig, int level) const
{
stream << std::fixed << std::setprecision(6);
switch (type)
{
case Type::intValue:
stream << value.intValue;
break;
case Type::floatValue:
assert(!isnan(value.floatValue));
//assert(isnormal(value.floatValue));
if (value.floatValue >= 0)
stream << " ";
stream << value.floatValue;
break;
case Type::boolValue:
stream << (value.boolValue ? "true" : "false");
break;
case Type::stringValue:
stream << "\"" << *value.stringValue << "\""; //TODO: escape \'s
break;
case Type::arrayValue:
{
stream << "[";
int wrap = 99999;
if (value.arrayValue->size() > 10)
wrap = 1;
if (value.arrayValue->at(0).isArray() || value.arrayValue->at(0).isObject())
wrap = 1;
else
wrap = 3;
std::string seperator = " ";
if (!printConfig.isNull() && printConfig.isMember("wrap"))
wrap = printConfig["wrap"];
if (!printConfig.isNull() && printConfig.isMember("seperator"))
seperator = printConfig["seperator"].asString();
int index = 0;
if ((long)size() > wrap)
{
stream << "\n";
indent(stream, level + 1);
}
for (auto v : *this)
{
if (index > 0)
{
stream << "," << seperator;
if (index % wrap == 0)
{
stream << "\n";
indent(stream, level + 1);
}
}
json::Value childPrintConfig = json::Value::null;
if (!printConfig.isNull())
{
if (printConfig.isMember("elements"))
childPrintConfig = printConfig["elements"];
else if (printConfig.isMember("recursive") && printConfig["recursive"].asBool() == true)
childPrintConfig = printConfig;
}
v.prettyPrint(stream, childPrintConfig, level + 1);
index++;
}
if ((long)size() > wrap)
{
stream << "\n";
indent(stream, level);
}
stream << "]";
break;
}
case Type::objectValue:
{
stream << "{\n";
int wrap = 99999;
if (value.arrayValue->size() > 10)
wrap = 1;
if (value.arrayValue->at(0).isArray() || value.arrayValue->at(0).isObject())
wrap = 1;
else
wrap = 3;
std::string seperator = " ";
if (!printConfig.isNull() && printConfig.isMember("wrap"))
wrap = printConfig["wrap"];
if (!printConfig.isNull() && printConfig.isMember("seperator"))
seperator = printConfig["seperator"].asString();
int index = 0;
indent(stream, level + 1);
//for (auto v : *value.objectValue)
auto printEl = [&](const std::pair<const std::string&, const Value&> v)
{
if (index > 0)
{
stream << "," << seperator;
if (index % wrap == 0)
{
stream << "\n";
indent(stream, level + 1);
}
}
stream << "\"" << v.first << "\" : ";
if (
(v.second.isArray() || v.second.isObject()) &&
(printConfig.isNull() ||
(
printConfig.isMember(v.first) &&
printConfig[v.first].isObject() &&
printConfig[v.first].isMember("wrap") &&
printConfig[v.first]["wrap"].asInt() < (int)v.second.size())
)
)
{
stream << "\n";
indent(stream, level + 1);
}
json::Value childPrintConfig = json::Value::null;
if (!printConfig.isNull())
{
if (printConfig.isMember(v.first))
childPrintConfig = printConfig[v.first];
else if (printConfig.isMember("recursive") && printConfig["recursive"].asBool() == true)
childPrintConfig = printConfig;
}
v.second.prettyPrint(stream, childPrintConfig, level + 1);;
index++;
};
std::set<std::string> printed;
if (!printConfig.isNull())
{
if (printConfig.isMember("sort"))
{
for (std::string el : printConfig["sort"])
{
if (isMember(el))
{
printEl(std::pair<const std::string&, const Value&>(el, (*value.objectValue)[el]));
printed.insert(el);
}
}
}
}
for (auto v : *value.objectValue)
if (printed.find(v.first) == printed.end())
printEl(v);
stream << "\n";
indent(stream, level);
stream << "}";
break;
}
case Type::nullValue:
stream << "null";
break;
}
return stream;
}
std::ostream & operator<<(std::ostream &stream, const Value& value)
{
stream << std::fixed<< std::setprecision(6);
switch (value.type)
{
case Type::intValue:
stream << value.value.intValue;
break;
case Type::floatValue:
assert(!isnan(value.value.floatValue));
//assert(isnormal(value.value.floatValue));
stream << value.value.floatValue;
break;
case Type::boolValue:
stream << (value.value.boolValue ? "true" : "false");
break;
case Type::stringValue:
stream << "\"" << *value.value.stringValue << "\""; //TODO: escape \'s
break;
case Type::arrayValue:
{
stream << "[";
bool first = true;
for (auto v : value)
{
if (!first)
stream << ", ";
stream << v;
first = false;
}
stream << "]";
break;
}
case Type::objectValue:
{
stream << "{";
bool first = true;
for (auto v : *value.value.objectValue)
{
if (!first)
stream << ", ";
stream << "\"" << v.first << "\" : " << v.second << std::endl;
first = false;
}
stream << "}";
break;
}
case Type::nullValue:
stream << "null";
break;
}
return stream;
}
}
+124
View File
@@ -0,0 +1,124 @@
#pragma once
#include <string>
#include <map>
#include <vector>
#include <assert.h>
namespace json
{
enum class Type
{
intValue,
floatValue,
boolValue,
stringValue,
arrayValue,
objectValue,
nullValue
};
class Value
{
public:
Type type;
union ValueHolder
{
int intValue;
float floatValue;
bool boolValue;
std::string* stringValue;
std::vector<Value>* arrayValue;
std::map<std::string, Value>* objectValue;
} value;
static Value null;
Value();
Value(Type type);
Value(int value);
Value(float value);
Value(bool value);
Value(const std::string &value);
Value(const char* value);
Value(const Value& other);
virtual ~Value();
void operator = (const Value& other);
inline operator int() const { return asInt(); }
inline operator float() const { return asFloat(); }
inline operator bool() const { return asBool(); }
inline operator const std::string&() const { return asString(); }
inline int asInt() const { assert(type == Type::intValue); return value.intValue; }
inline float asFloat() const { assert(type == Type::floatValue || type == Type::intValue); return type == Type::floatValue ? value.floatValue : value.intValue; }
inline bool asBool() const { assert(type == Type::boolValue); return value.boolValue; }
inline const std::string& asString() const { assert(type == Type::stringValue); return *value.stringValue; }
inline bool isNull() const { return type == Type::nullValue; }
inline bool isString() const { return type == Type::stringValue; }
inline bool isInt() const { return type == Type::intValue; }
inline bool isBool() const { return type == Type::boolValue; }
inline bool isFloat() const { return type == Type::floatValue; }
inline bool isObject() const { return type == Type::objectValue; }
inline bool isArray() const { return type == Type::arrayValue; }
inline bool isMember(const std::string &name) const { assert(type == Type::objectValue); return value.objectValue->find(name) != value.objectValue->end(); }
//array/object
virtual size_t size() const;
//array
virtual void push_back(const Value& value);
virtual void erase(size_t index);
virtual Value& operator [] (size_t index);
virtual Value& operator [] (int index);
virtual Value& operator [] (size_t index) const;
virtual Value& operator [] (int index) const;
virtual Value& operator [] (const std::string &key);
virtual Value& operator [] (const char* key);
virtual Value& operator [] (const std::string &key) const;
virtual Value& operator [] (const char* key) const;
virtual bool operator == (const std::string &other) { return asString() == other; }
virtual bool operator == (const int other) { return asInt() == other; }
virtual bool operator == (const float other) { return asFloat() == other; }
std::ostream& prettyPrint(std::ostream& stream, json::Value& printConfig = null, int level = 0) const;
class Iterator;
Iterator begin() const;
Iterator end() const;
};
class Value::Iterator
{
private:
Type type;
std::map<std::string, Value>::iterator objectIterator;
std::vector<Value>::iterator arrayIterator;
public:
Iterator(const std::map<std::string, Value>::iterator& objectIterator);
Iterator(const std::vector<Value>::iterator& arrayIterator);
void operator ++();
void operator ++(int);
bool operator != (const Iterator &other);
Value operator*();
std::string key();
Value& value();
};
Value readJson(const std::string &data);
Value readJson(std::istream &stream);
std::ostream &operator << (std::ostream &stream, const Value& value); //serializes json data
}
+6
View File
@@ -0,0 +1,6 @@
newmtl Cave1:pasted__lambert4SG
illum 4
Kd 0.13 0.14 0.16
Ka 0.00 0.00 0.00
Tf 1.00 1.00 1.00
Ni 1.00
File diff suppressed because it is too large Load Diff
+6
View File
@@ -0,0 +1,6 @@
newmtl lambert2SG
illum 4
Kd 1.00 1.00 1.00
Ka 0.00 0.00 0.00
Tf 1.00 1.00 1.00
Ni 1.00
File diff suppressed because it is too large Load Diff
+13
View File
@@ -0,0 +1,13 @@
newmtl Cave1:pasted__lambert4SG
illum 4
Kd 0.13 0.14 0.16
Ka 0.00 0.00 0.00
Tf 1.00 1.00 1.00
Ni 1.00
newmtl lambert2SG
illum 4
Kd 0.00 0.00 0.00
Ka 0.00 0.00 0.00
Tf 1.00 1.00 1.00
map_Kd DragonWallAwesome.png
Ni 1.00
+509
View File
@@ -0,0 +1,509 @@
# This file uses centimeters as units for non-parametric coordinates.
mtllib DragonWall1.mtl
g default
v 31.479097 0.032439 -6.902821
v -31.479097 0.032439 -6.902821
v 31.479097 37.811227 -7.156591
v -31.479097 37.811227 -7.156591
v 31.479097 37.755655 4.670846
v -31.479097 37.765894 2.489812
v 33.071286 -0.014894 3.168986
v -31.479097 -0.027298 5.808684
v 0.000000 18.856953 6.775930
v 0.000000 37.743745 6.815244
v -0.000000 -0.032441 6.902821
v 31.479097 18.856953 6.775930
v 31.479097 19.806234 -7.035645
v -31.479097 19.806234 -7.035645
v -33.219027 18.856953 6.775930
v 15.739548 37.746344 6.649046
v 15.739548 28.301650 6.712488
v 15.739548 9.412260 6.839373
v 15.739548 -0.016573 3.526865
v 15.739548 18.854960 8.669850
v -15.739548 37.744744 6.751334
v -15.739548 28.294204 8.320270
v -15.739548 18.850288 7.202108
v -15.739548 9.405386 7.278817
v -15.739548 -0.022680 6.278613
v 33.762048 28.317519 3.336535
v 0.000000 28.303989 9.058642
v -31.479097 28.301650 6.712488
v -31.479097 9.415253 6.202581
v 0.000000 9.409420 9.521046
v 32.843955 9.428125 3.463421
v -7.869774 23.581444 7.644574
v 7.869774 23.573183 9.630958
v 7.869774 14.131984 8.590231
v -7.869774 14.108179 8.497199
v -23.609324 4.689909 6.871096
v -23.609324 14.127120 9.157310
v -23.609324 23.559216 8.028686
v -23.609324 33.005188 8.902707
v -7.869774 33.026725 6.506093
v 7.869774 33.018276 7.046262
v 23.609324 33.028606 6.385878
v 23.609324 23.583752 6.460023
v 23.609324 14.134605 6.807655
v 23.609324 4.714278 5.313189
v 7.869774 4.689909 6.871096
v -7.869774 4.679063 9.179434
v 34.217941 19.089080 3.398532
v -34.325875 33.612990 -1.033724
v -31.479097 28.808740 -7.096119
v -31.479097 23.952114 -0.326363
v -31.479097 14.375229 -0.116500
v -31.479097 9.919341 -6.969232
v -33.938226 5.088499 0.159210
v 34.829148 32.894605 -1.722389
v 31.479097 28.808740 -7.096119
v 31.479097 24.009146 -1.913821
v 32.610234 14.557205 -1.725438
v 31.479097 9.919341 -6.969232
v 33.671430 5.250531 -1.145710
v 7.869774 37.746344 6.649046
v 7.869774 28.272630 9.815706
v 7.869774 18.875384 6.480806
v 7.869774 9.403860 8.626516
v 7.869774 -0.024507 5.214843
v 23.261588 37.750794 5.703650
v 24.750799 28.322892 4.173673
v 23.609324 18.851017 8.038712
v 24.291751 9.425791 4.793524
v 24.405418 -0.015655 3.342998
v -7.857922 37.746344 6.649046
v -7.869774 28.316095 7.602681
v -7.869774 18.846561 7.440290
v -7.869774 9.397081 9.059896
v -7.869774 -0.032441 6.902821
v -23.609324 -0.029871 6.355752
v -23.609324 9.412749 6.585387
v -24.479289 18.828812 8.575101
v -23.609324 28.268887 9.373000
v -23.609324 37.756119 4.569429
v -31.479097 33.033772 4.601150
v -15.739548 33.017513 7.661214
v 0.000000 33.011427 8.732246
v 15.739548 33.023997 6.680767
v 32.620573 33.036587 4.003690
v 32.620573 23.587235 5.056233
v 15.739548 23.576169 7.827765
v 0.000000 23.575834 8.213789
v -15.739548 23.575492 7.553615
v -32.349062 23.579301 6.744209
v -32.349062 14.136103 6.489256
v -15.739548 14.117970 7.871304
v 0.000000 14.129481 8.385483
v 15.739548 14.131662 7.879160
v 32.161526 14.142540 5.119675
v 32.957620 4.706616 3.316203
v 15.739548 4.697844 5.183119
v 0.000000 4.685021 8.433733
v -15.739548 4.708207 5.701237
v -31.479097 4.693977 6.005632
vt 0.003508 0.474197
vt 0.003720 0.304675
vt 0.173029 0.474409
vt 0.173241 0.304887
vt 0.190029 0.096736
vt 0.173010 0.823395
vt 0.002961 0.827333
vt 0.991265 0.897972
vt 0.002961 0.996854
vt 0.172483 0.996854
vt 0.003932 0.135154
vt 0.173453 0.135366
vt 0.003296 0.643718
vt 0.172818 0.643930
vt 0.590647 0.497354
vt 0.590647 0.096736
vt 0.590647 0.897972
vt 0.088057 0.643824
vt 0.190029 0.497354
vt 0.092237 0.474308
vt 0.092449 0.304786
vt 0.991265 0.497354
vt 0.088693 0.135260
vt 0.390338 0.096736
vt 0.390338 0.297045
vt 0.390338 0.697663
vt 0.390338 0.897972
vt 0.390338 0.497354
vt 0.790956 0.096736
vt 0.790956 0.297045
vt 0.790956 0.497354
vt 0.790956 0.697663
vt 0.790956 0.897972
vt 0.130437 0.643877
vt 0.190029 0.297045
vt 0.590647 0.297045
vt 0.991265 0.297045
vt 0.131073 0.135313
vt 0.991265 0.697663
vt 0.046312 0.135207
vt 0.590647 0.697663
vt 0.045677 0.643771
vt 0.190029 0.697663
vt 0.690802 0.397199
vt 0.490493 0.397199
vt 0.490493 0.597508
vt 0.690802 0.597508
vt 0.891111 0.797817
vt 0.891111 0.597508
vt 0.891111 0.397199
vt 0.891111 0.196890
vt 0.690802 0.196890
vt 0.490493 0.196890
vt 0.290184 0.196890
vt 0.290184 0.397199
vt 0.290184 0.597508
vt 0.290184 0.797817
vt 0.490493 0.797817
vt 0.690802 0.797817
vt 0.089079 0.602372
vt 0.154625 0.230024
vt 0.132845 0.304837
vt 0.111298 0.222081
vt 0.068335 0.216153
vt 0.048085 0.304731
vt 0.026672 0.213355
vt 0.150972 0.562173
vt 0.132633 0.474358
vt 0.111101 0.558042
vt 0.068688 0.560019
vt 0.047873 0.474252
vt 0.026927 0.568374
vt 0.130103 0.827333
vt 0.172483 0.827333
vt 0.045342 0.827333
vt 0.087722 0.827333
vt 0.190029 0.897972
vt 0.130629 0.823395
vt 0.991265 0.096736
vt 0.045869 0.823395
vt 0.088249 0.823395
vt 0.003488 0.823395
vt 0.003488 0.653873
vt 0.173010 0.653873
vt 0.490493 0.096736
vt 0.067059 0.823395
vt 0.490493 0.297045
vt 0.490493 0.497354
vt 0.490493 0.697663
vt 0.066532 0.827333
vt 0.490493 0.897972
vt 0.294609 0.096736
vt 0.025615 0.823395
vt 0.290184 0.297045
vt 0.290184 0.497354
vt 0.290184 0.697663
vt 0.024152 0.827333
vt 0.290184 0.897972
vt 0.690651 0.096736
vt 0.109407 0.823395
vt 0.690802 0.297045
vt 0.690802 0.497354
vt 0.690802 0.697663
vt 0.108912 0.827333
vt 0.690802 0.897972
vt 0.151293 0.827333
vt 0.891111 0.897972
vt 0.891111 0.697663
vt 0.891111 0.497354
vt 0.891111 0.297045
vt 0.891111 0.096736
vt 0.151820 0.823395
vt 0.991265 0.196890
vt 0.152263 0.135340
vt 0.790956 0.196890
vt 0.590647 0.196890
vt 0.390338 0.196890
vt 0.151627 0.643904
vt 0.190029 0.196890
vt 0.109247 0.643851
vt 0.190029 0.397199
vt 0.390338 0.397199
vt 0.590647 0.397199
vt 0.790956 0.397199
vt 0.991265 0.397199
vt 0.109883 0.135287
vt 0.991265 0.597508
vt 0.067502 0.135234
vt 0.790956 0.597508
vt 0.590647 0.597508
vt 0.390338 0.597508
vt 0.066867 0.643798
vt 0.190029 0.597508
vt 0.024486 0.643745
vt 0.190029 0.797817
vt 0.390338 0.797817
vt 0.590647 0.797817
vt 0.790956 0.797817
vt 0.991265 0.797817
vt 0.025122 0.135181
vn 0.020668 -0.006359 -0.999766
vn -0.027113 -0.006730 -0.999610
vn -0.029610 -0.008886 -0.999522
vn -0.018928 0.582161 -0.812853
vn 0.018016 0.582415 -0.812692
vn 0.023788 -0.008855 -0.999678
vn -0.035951 0.998946 0.028539
vn -0.005927 0.999621 0.026889
vn -0.001724 0.998900 0.046871
vn -0.000099 0.999594 0.028507
vn -0.001066 0.999450 0.033146
vn 0.000239 0.999616 0.027720
vn 0.001383 0.999481 0.032180
vn 0.002838 0.999623 0.027315
vn 0.023608 0.999075 0.035929
vn 0.321404 0.009046 0.946899
vn 0.110315 0.035313 0.993269
vn 0.162658 -0.287097 0.943990
vn 0.033801 -0.998996 0.029409
vn 0.000533 -0.999771 0.021368
vn 0.002117 -0.999772 0.021246
vn 0.005055 -0.999808 0.018948
vn 0.004850 -0.999488 0.031631
vn -0.001233 -0.999714 0.023866
vn -0.005046 -0.999505 0.031049
vn -0.000854 -0.999738 0.022885
vn -0.035927 -0.998989 0.027020
vn -0.024015 -0.532076 -0.846356
vn 0.019313 -0.540765 -0.840952
vn -0.991482 -0.122312 -0.044749
vn -0.897928 0.012500 0.439965
vn -0.894575 0.167584 0.414309
vn -0.801506 0.141204 0.581076
vn 0.989720 0.036899 -0.138174
vn 0.165553 -0.113456 0.979653
vn -0.058512 0.164315 0.984671
vn 0.042469 0.059133 0.997346
vn 0.045935 0.008850 0.998905
vn 0.106547 -0.157211 0.981801
vn -0.026154 -0.085747 0.995974
vn -0.103022 0.084266 0.991103
vn -0.049959 0.130769 0.990153
vn -0.136659 0.069647 0.988167
vn 0.049676 -0.020355 0.998558
vn 0.991902 -0.032619 0.122745
vn 0.983991 0.037132 -0.174309
vn -0.030035 -0.005291 -0.999535
vn 0.024103 -0.006156 -0.999691
vn -0.994879 0.090637 -0.044724
vn -0.832236 -0.103331 0.544707
vn -0.900561 -0.189709 0.391152
vn 0.205618 0.141269 0.968382
vn 0.114354 0.198929 0.973319
vn 0.033116 -0.190324 0.981163
vn 0.015462 0.158566 0.987227
vn 0.110222 -0.188450 0.975878
vn 0.014253 -0.046187 0.998831
vn 0.156558 -0.170027 0.972924
vn 0.161772 -0.255237 0.953249
vn 0.166367 0.319661 0.932812
vn 0.194003 0.199631 0.960474
vn 0.024099 -0.115882 0.992971
vn -0.143572 0.288295 0.946717
vn -0.038624 0.118202 0.992238
vn -0.066326 -0.069376 0.995383
vn -0.037925 -0.104006 0.993853
vn -0.013212 -0.055146 0.998391
vn 0.716275 0.075177 0.693757
vn -0.030135 0.181445 0.982939
vn 0.128242 0.267820 0.954896
vn -0.041887 0.145090 0.988531
vn -0.711577 0.286281 0.641640
vn -0.701297 -0.029712 0.712249
vn 0.139225 -0.261755 0.955040
vn -0.104466 -0.180682 0.977978
vn 0.189812 -0.320573 0.928011
vn 0.712014 -0.004752 0.702150
vn 0.508499 -0.218956 0.832759
vn 0.476244 0.196654 0.857041
vn -0.001261 -0.032857 0.999459
vn 0.028390 0.094182 0.995150
vn -0.123244 -0.237082 0.963641
vn -0.076397 -0.099868 0.992063
vn -0.006115 0.280804 0.959746
vn -0.112554 -0.075206 0.990795
vn -0.064545 -0.230261 0.970986
vn -0.081762 -0.070291 0.994170
vn 0.148438 0.162087 0.975548
vn 0.041915 0.006711 0.999099
vn 0.895551 0.046444 0.442529
vn 0.142393 0.007242 0.989784
vn 0.852500 -0.090421 0.514847
vn 0.178792 -0.150608 0.972291
vn 0.093487 -0.330005 0.939338
vn 0.990864 -0.012272 -0.134309
vn 0.965078 -0.124817 -0.230316
vn -0.998266 -0.058861 -0.000783
vn -0.999945 0.007754 0.007012
vn 0.100111 -0.010887 0.994917
vn -0.125087 -0.227456 0.965721
s 1
g pCube1
usemtl lambert2SG
f 13/20/1 14/21/2 50/62/3 4/4/4 3/3/5 56/68/6
f 3/83/5 4/84/4 6/6/7 80/112/8 21/78/9 71/100/10 10/81/11 61/86/12 16/80/13 66/93/14 5/82/15
f 12/19/16 68/95/17 44/56/18
f 7/7/19 70/97/20 19/75/21 65/90/22 11/76/23 75/104/24 25/73/25 76/106/26 8/74/27 2/10/28 1/9/29
f 51/63/30 15/23/31 90/126/32 28/38/33
f 5/14/15 55/67/34 3/3/5
f 5/5/15 66/92/14 42/54/35
f 35/47/36 23/31/37 92/129/38
f 7/77/19 45/57/39 70/98/20
f 32/44/40 27/36/41 72/101/42
f 35/47/36 74/103/43 30/41/44
f 48/60/45 58/70/46 13/20/1
f 1/1/29 2/2/28 53/65/47 14/21/2 13/20/1 59/71/48
f 15/23/31 52/64/49 29/40/50 91/128/51
f 17/25/52 62/87/53 33/45/54
f 34/46/55 94/131/56 20/28/57
f 34/46/55 64/89/58 18/26/59
f 12/19/16 43/55/60 68/95/17
f 33/45/54 20/28/57 87/122/61
f 23/31/37 32/44/40 89/124/62
f 39/51/63 80/111/8 6/79/7
f 78/109/64 38/50/65 15/22/31
f 37/49/66 78/109/64 15/22/31
f 76/107/26 36/48/67 8/8/27
f 5/5/15 42/54/35 85/119/68
f 83/116/69 41/53/70 10/16/11
f 40/52/71 83/116/69 10/16/11
f 81/113/72 39/51/63 6/79/7
f 36/48/67 100/139/73 8/8/27
f 11/17/23 98/137/74 47/59/75
f 11/17/23 46/58/76 98/137/74
f 96/135/77 45/57/39 7/77/19
f 19/27/21 46/58/76 65/91/22
f 12/19/16 44/56/18 95/133/78
f 86/121/79 43/55/60 12/19/16
f 41/53/70 16/24/13 61/85/12
f 71/99/10 40/52/71 10/16/11
f 15/22/31 38/50/65 90/125/32
f 91/127/51 37/49/66 15/22/31
f 11/17/23 47/59/75 75/105/24
f 9/15/80 32/44/40 73/102/81
f 9/15/80 88/123/82 32/44/40
f 33/45/54 88/123/82 9/15/80
f 33/45/54 63/88/83 20/28/57
f 34/46/55 20/28/57 63/88/83
f 93/130/84 34/46/55 9/15/80
f 35/47/36 93/130/84 9/15/80
f 9/15/80 73/102/81 35/47/36
f 25/33/25 99/138/85 36/48/67
f 36/48/67 77/108/86 29/39/50
f 77/108/86 37/49/66 29/39/50
f 37/49/66 92/129/38 23/31/37
f 23/31/37 89/124/62 38/50/65
f 28/37/33 38/50/65 79/110/87
f 28/37/33 79/110/87 39/51/63
f 39/51/63 82/115/88 21/29/9
f 82/115/88 40/52/71 21/29/9
f 40/52/71 72/101/42 27/36/41
f 17/25/52 41/53/70 62/87/53
f 41/53/70 84/117/89 16/24/13
f 42/54/35 16/24/13 84/117/89
f 26/35/90 42/54/35 67/94/91
f 26/35/90 67/94/91 43/55/60
f 20/28/57 43/55/60 87/122/61
f 44/56/18 20/28/57 94/131/56
f 31/43/92 44/56/18 69/96/93
f 31/43/92 69/96/93 45/57/39
f 19/27/21 45/57/39 97/136/94
f 19/27/21 97/136/94 46/58/76
f 64/89/58 46/58/76 18/26/59
f 47/59/75 30/41/44 74/103/43
f 25/33/25 47/59/75 99/138/85
f 55/67/34 56/68/6 3/3/5
f 12/18/16 48/60/45 26/34/90 86/120/79
f 31/42/92 48/60/45 12/18/16 95/132/78
f 7/13/19 1/1/29 60/72/95
f 58/70/46 59/71/48 13/20/1
f 57/69/96 48/60/45 13/20/1
f 50/62/3 51/63/30 28/38/33 49/61/97
f 54/66/98 8/11/27 100/140/73 29/40/50
f 53/65/47 54/66/98 29/40/50 52/64/49
f 6/12/7 49/61/97 28/38/33 81/114/72
f 4/4/4 49/61/97 6/12/7
f 50/62/3 49/61/97 4/4/4
f 14/21/2 51/63/30 50/62/3
f 14/21/2 15/23/31 51/63/30
f 14/21/2 52/64/49 15/23/31
f 53/65/47 52/64/49 14/21/2
f 2/2/28 54/66/98 53/65/47
f 2/2/28 8/11/27 54/66/98
f 26/34/90 55/67/34 5/14/15 85/118/68
f 56/68/6 57/69/96 13/20/1
f 26/34/90 57/69/96 56/68/6 55/67/34
f 26/34/90 48/60/45 57/69/96
f 31/42/92 58/70/46 48/60/45
f 59/71/48 60/72/95 1/1/29
f 31/42/92 60/72/95 59/71/48 58/70/46
f 7/13/19 60/72/95 31/42/92 96/134/77
f 41/53/70 61/85/12 10/16/11
f 62/87/53 41/53/70 27/36/41
f 33/45/54 62/87/53 27/36/41
f 9/15/80 63/88/83 33/45/54
f 34/46/55 63/88/83 9/15/80
f 30/41/44 64/89/58 34/46/55
f 30/41/44 46/58/76 64/89/58
f 65/91/22 46/58/76 11/17/23
f 42/54/35 66/92/14 16/24/13
f 67/94/91 42/54/35 17/25/52
f 43/55/60 67/94/91 17/25/52
f 68/95/17 43/55/60 20/28/57
f 44/56/18 68/95/17 20/28/57
f 69/96/93 44/56/18 18/26/59
f 45/57/39 69/96/93 18/26/59
f 70/98/20 45/57/39 19/27/21
f 21/29/9 40/52/71 71/99/10
f 22/30/99 72/101/42 40/52/71
f 32/44/40 72/101/42 22/30/99
f 73/102/81 32/44/40 23/31/37
f 35/47/36 73/102/81 23/31/37
f 24/32/100 74/103/43 35/47/36
f 47/59/75 74/103/43 24/32/100
f 75/105/24 47/59/75 25/33/25
f 25/33/25 36/48/67 76/107/26
f 24/32/100 77/108/86 36/48/67
f 24/32/100 37/49/66 77/108/86
f 37/49/66 23/31/37 78/109/64
f 23/31/37 38/50/65 78/109/64
f 79/110/87 38/50/65 22/30/99
f 39/51/63 79/110/87 22/30/99
f 39/51/63 21/29/9 80/111/8
f 28/37/33 39/51/63 81/113/72
f 22/30/99 82/115/88 39/51/63
f 22/30/99 40/52/71 82/115/88
f 40/52/71 27/36/41 83/116/69
f 27/36/41 41/53/70 83/116/69
f 17/25/52 84/117/89 41/53/70
f 42/54/35 84/117/89 17/25/52
f 85/119/68 42/54/35 26/35/90
f 26/35/90 43/55/60 86/121/79
f 87/122/61 43/55/60 17/25/52
f 33/45/54 87/122/61 17/25/52
f 33/45/54 27/36/41 88/123/82
f 32/44/40 88/123/82 27/36/41
f 89/124/62 32/44/40 22/30/99
f 38/50/65 89/124/62 22/30/99
f 90/125/32 38/50/65 28/37/33
f 29/39/50 37/49/66 91/127/51
f 24/32/100 92/129/38 37/49/66
f 35/47/36 92/129/38 24/32/100
f 35/47/36 30/41/44 93/130/84
f 30/41/44 34/46/55 93/130/84
f 18/26/59 94/131/56 34/46/55
f 44/56/18 94/131/56 18/26/59
f 95/133/78 44/56/18 31/43/92
f 31/43/92 45/57/39 96/135/77
f 97/136/94 45/57/39 18/26/59
f 46/58/76 97/136/94 18/26/59
f 98/137/74 46/58/76 30/41/44
f 47/59/75 98/137/74 30/41/44
f 99/138/85 47/59/75 24/32/100
f 36/48/67 99/138/85 24/32/100
f 36/48/67 29/39/50 100/139/73

Some files were not shown because too many files have changed in this diff Show More