Compare commits
103
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6732a55097 | ||
|
|
6f8c2955eb | ||
|
|
ec83d31065 | ||
|
|
e69008b083 | ||
|
|
ddadafecff | ||
|
|
eaeff6ed7d | ||
|
|
6096e53d94 | ||
|
|
8700aa90af | ||
|
|
7c4805d899 | ||
|
|
e42779f6c7 | ||
|
|
ce2f658b61 | ||
|
|
3701918ac9 | ||
|
|
d887328907 | ||
|
|
8cf1b02cf7 | ||
|
|
779cf5cb91 | ||
|
|
030a136e8b | ||
|
|
f93c09a999 | ||
|
|
587b79044b | ||
|
|
dba9c581b1 | ||
|
|
d5406120c6 | ||
|
|
e081373a45 | ||
|
|
98f3645b6b | ||
|
|
5c776e3d3a | ||
|
|
03c06e0974 | ||
|
|
b7d73c9abe | ||
|
|
7758f2c294 | ||
|
|
2e50d11e07 | ||
|
|
1ec3c8f346 | ||
|
|
8dcee70324 | ||
|
|
6cf9437620 | ||
|
|
f84fcfa4e2 | ||
|
|
ad30824057 | ||
|
|
04fd3ac0e3 | ||
|
|
31c11f3e1f | ||
|
|
656a904a4b | ||
|
|
348b53c027 | ||
|
|
71801a30f2 | ||
|
|
0ca94aef4d | ||
|
|
ced3ff4462 | ||
|
|
912a2234a3 | ||
|
|
0209c8b4e2 | ||
|
|
6bcd9b1426 | ||
|
|
579e02728a | ||
|
|
af681b0223 | ||
|
|
3ed5331437 | ||
|
|
0aad7262d6 | ||
|
|
9cfaf07eba | ||
|
|
9659caa1d8 | ||
|
|
a4373adc25 | ||
|
|
1f3188376a | ||
|
|
69561794d8 | ||
|
|
5c24a34202 | ||
|
|
1164501158 | ||
|
|
593b9547cf | ||
|
|
1a4339b49d | ||
|
|
2c624ac4c7 | ||
|
|
881b58138c | ||
|
|
bba0a2e2a0 | ||
|
|
117010b9fe | ||
|
|
47b4d9570d | ||
|
|
0f8fd67dd3 | ||
|
|
0afbca8ffc | ||
|
|
293ceb0b9f | ||
|
|
b827885f40 | ||
|
|
527394f635 | ||
|
|
95ab1879b4 | ||
|
|
95febc136f | ||
|
|
b4a2da4b88 | ||
|
|
c3fe041eb1 | ||
|
|
1ade6002c1 | ||
|
|
f0a8330819 | ||
|
|
a80fc69043 | ||
|
|
0c73b5a586 | ||
|
|
b53bcac528 | ||
|
|
ae80c7a5bf | ||
|
|
34ea491f39 | ||
|
|
d83cc6403c | ||
|
|
1c59a3bc6f | ||
|
|
2b0e22d4c9 | ||
|
|
4c613b606a | ||
|
|
56e174ae2f | ||
|
|
908786897f | ||
|
|
33a61ca2ed | ||
|
|
b2fa0bc028 | ||
|
|
cf124b3f38 | ||
|
|
0b6096d3e8 | ||
|
|
84fcc346a9 | ||
|
|
fe1aa7220e | ||
|
|
d739141b25 | ||
|
|
2a6cc0fd87 | ||
|
|
965b54c901 | ||
|
|
e7a7cc5588 | ||
|
|
9d3cfa7e2a | ||
|
|
47c228205a | ||
|
|
b1aa61d5f0 | ||
|
|
5ca5ca194b | ||
|
|
e75f624935 | ||
|
|
d01efecb0e | ||
|
|
7d13269480 | ||
|
|
a8415db4ac | ||
|
|
1120a3e144 | ||
|
|
f2af3a7324 | ||
|
|
7c4ee37867 |
Generated
+6
@@ -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
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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")
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "Controller.h"
|
||||
|
||||
|
||||
|
||||
Controller::Controller()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Controller::~Controller()
|
||||
{
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
#pragma once
|
||||
#include "Header.h"
|
||||
|
||||
class Controller
|
||||
{
|
||||
public:
|
||||
Controller();
|
||||
~Controller();
|
||||
};
|
||||
|
||||
+48
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 14
|
||||
VisualStudioVersion = 14.0.24720.0
|
||||
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
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@@ -13,14 +13,14 @@ Global
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{4986BEC0-4362-46E4-A18D-65587FA97967}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{4986BEC0-4362-46E4-A18D-65587FA97967}.Debug|x64.Build.0 = Debug|x64
|
||||
{4986BEC0-4362-46E4-A18D-65587FA97967}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{4986BEC0-4362-46E4-A18D-65587FA97967}.Debug|x86.Build.0 = Debug|Win32
|
||||
{4986BEC0-4362-46E4-A18D-65587FA97967}.Release|x64.ActiveCfg = Release|x64
|
||||
{4986BEC0-4362-46E4-A18D-65587FA97967}.Release|x64.Build.0 = Release|x64
|
||||
{4986BEC0-4362-46E4-A18D-65587FA97967}.Release|x86.ActiveCfg = Release|Win32
|
||||
{4986BEC0-4362-46E4-A18D-65587FA97967}.Release|x86.Build.0 = Release|Win32
|
||||
{F82158C7-7345-4CB0-9F90-3AB49A071904}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{F82158C7-7345-4CB0-9F90-3AB49A071904}.Debug|x64.Build.0 = Debug|x64
|
||||
{F82158C7-7345-4CB0-9F90-3AB49A071904}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{F82158C7-7345-4CB0-9F90-3AB49A071904}.Debug|x86.Build.0 = Debug|Win32
|
||||
{F82158C7-7345-4CB0-9F90-3AB49A071904}.Release|x64.ActiveCfg = Release|x64
|
||||
{F82158C7-7345-4CB0-9F90-3AB49A071904}.Release|x64.Build.0 = Release|x64
|
||||
{F82158C7-7345-4CB0-9F90-3AB49A071904}.Release|x86.ActiveCfg = Release|Win32
|
||||
{F82158C7-7345-4CB0-9F90-3AB49A071904}.Release|x86.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@@ -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));
|
||||
}
|
||||
@@ -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
@@ -19,9 +19,9 @@
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{4986BEC0-4362-46E4-A18D-65587FA97967}</ProjectGuid>
|
||||
<ProjectGuid>{F82158C7-7345-4CB0-9F90-3AB49A071904}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>CrystalPoint</RootNamespace>
|
||||
<RootNamespace>CrystalJohan</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
||||
<ProjectName>CrystalPoint</ProjectName>
|
||||
</PropertyGroup>
|
||||
@@ -84,62 +84,65 @@
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
|
||||
<PrecompiledHeaderFile />
|
||||
<AdditionalIncludeDirectories>freeglut/include; openAL/include</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<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>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
|
||||
<PrecompiledHeaderFile />
|
||||
<AdditionalIncludeDirectories>freeglut/include;C:\Program Files (x86)\OpenAL 1.1 SDK\include</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<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>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
|
||||
<PrecompiledHeaderFile />
|
||||
<AdditionalIncludeDirectories>freeglut/include; openAL/include</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<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>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeaderFile />
|
||||
<AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
@@ -151,46 +154,70 @@
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Controller.h" />
|
||||
<ClInclude Include="Enemy.h" />
|
||||
<ClInclude Include="Header.h" />
|
||||
<ClInclude Include="InitState.h" />
|
||||
<ClInclude Include="Keyboard.h" />
|
||||
<ClInclude Include="LoadingState.h" />
|
||||
<ClInclude Include="MenuState.h" />
|
||||
<ClInclude Include="Model.h" />
|
||||
<ClInclude Include="ModelHandler.h" />
|
||||
<ClInclude Include="ModelInstance.h" />
|
||||
<ClInclude Include="Mouse.h" />
|
||||
<ClInclude Include="Player.h" />
|
||||
<ClInclude Include="SettingsState.h" />
|
||||
<ClInclude Include="State.h" />
|
||||
<ClInclude Include="StateHandler.h" />
|
||||
<ClInclude Include="Vector.h" />
|
||||
<ClInclude Include="Weapon.h" />
|
||||
<ClInclude Include="WorldModel.h" />
|
||||
<ClInclude Include="WorldState.h" />
|
||||
<ClCompile Include="Button.cpp" />
|
||||
<ClCompile Include="Crystal.cpp" />
|
||||
<ClCompile Include="CrystalPoint.cpp" />
|
||||
<ClCompile Include="Cursor.cpp" />
|
||||
<ClCompile Include="Enemy.cpp" />
|
||||
<ClCompile Include="Entity.cpp" />
|
||||
<ClCompile Include="HeightMap.cpp" />
|
||||
<ClCompile Include="Interface.cpp" />
|
||||
<ClCompile Include="json.cpp" />
|
||||
<ClCompile Include="LevelObject.cpp" />
|
||||
<ClCompile Include="Main.cpp" />
|
||||
<ClCompile Include="Menu.cpp" />
|
||||
<ClCompile Include="MenuElement.cpp" />
|
||||
<ClCompile Include="Model.cpp" />
|
||||
<ClCompile Include="Portal.cpp" />
|
||||
<ClCompile Include="Sound.cpp" />
|
||||
<ClCompile Include="SoundSystem.cpp" />
|
||||
<ClCompile Include="Player.cpp" />
|
||||
<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>
|
||||
<ClCompile Include="Controller.cpp" />
|
||||
<ClCompile Include="Enemy.cpp" />
|
||||
<ClCompile Include="InitState.cpp" />
|
||||
<ClCompile Include="Keyboard.cpp" />
|
||||
<ClCompile Include="LoadingState.cpp" />
|
||||
<ClCompile Include="Main.cpp" />
|
||||
<ClCompile Include="MenuState.cpp" />
|
||||
<ClCompile Include="Model.cpp" />
|
||||
<ClCompile Include="ModelHandler.cpp" />
|
||||
<ClCompile Include="ModelInstance.cpp" />
|
||||
<ClCompile Include="Mouse.cpp" />
|
||||
<ClCompile Include="Player.cpp" />
|
||||
<ClCompile Include="SettingsState.cpp" />
|
||||
<ClCompile Include="State.cpp" />
|
||||
<ClCompile Include="StateHandler.cpp" />
|
||||
<ClCompile Include="Vector.cpp" />
|
||||
<ClCompile Include="Weapon.cpp" />
|
||||
<ClCompile Include="WorldModel.cpp" />
|
||||
<ClCompile Include="WorldState.cpp" />
|
||||
<ClInclude Include="Button.h" />
|
||||
<ClInclude Include="Crystal.h" />
|
||||
<ClInclude Include="CrystalPoint.h" />
|
||||
<ClInclude Include="Cursor.h" />
|
||||
<ClInclude Include="Enemy.h" />
|
||||
<ClInclude Include="Entity.h" />
|
||||
<ClInclude Include="HeightMap.h" />
|
||||
<ClInclude Include="Interface.h" />
|
||||
<ClInclude Include="json.h" />
|
||||
<ClInclude Include="LevelObject.h" />
|
||||
<ClInclude Include="Main.h" />
|
||||
<ClInclude Include="Menu.h" />
|
||||
<ClInclude Include="MenuElement.h" />
|
||||
<ClInclude Include="Model.h" />
|
||||
<ClInclude Include="Portal.h" />
|
||||
<ClInclude Include="Sound.h" />
|
||||
<ClInclude Include="SoundSystem.h" />
|
||||
<ClInclude Include="Player.h" />
|
||||
<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>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
||||
+178
-114
@@ -13,138 +13,202 @@
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\State">
|
||||
<UniqueIdentifier>{6c99658e-2c17-469b-a3d1-2c4d3d61d440}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\Object">
|
||||
<UniqueIdentifier>{1e464995-b141-43fd-9e25-16d6ac47176b}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\Control">
|
||||
<UniqueIdentifier>{e444364a-17f6-4464-a98c-6bd34d3e6263}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\World">
|
||||
<UniqueIdentifier>{0de1a037-e536-40df-a0d0-0d929f2fe752}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\Model">
|
||||
<UniqueIdentifier>{842778c9-ff0f-4a6d-9c86-0a178ad40fcc}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\json">
|
||||
<UniqueIdentifier>{9c655946-3f99-44ea-bc97-2817656954e0}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\Model\Enemy">
|
||||
<UniqueIdentifier>{1be14b84-6fa7-4cfb-94b9-666f3ee14198}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\Menu">
|
||||
<UniqueIdentifier>{e7a88896-78e1-4544-bfc8-cfd55323728e}</UniqueIdentifier>
|
||||
</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>
|
||||
<ClCompile Include="Main.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</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">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Weapon.cpp">
|
||||
<Filter>Source Files\Model</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Vector.cpp">
|
||||
<ClCompile Include="json.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ModelInstance.cpp">
|
||||
<Filter>Source Files\Model</Filter>
|
||||
<ClCompile Include="WorldHandler.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="StateHandler.cpp">
|
||||
<Filter>Source Files\Handler</Filter>
|
||||
<ClCompile Include="Entity.cpp">
|
||||
<Filter>Source Files\Object</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ModelHandler.cpp">
|
||||
<Filter>Source Files\Handler</Filter>
|
||||
<ClCompile Include="Model.cpp">
|
||||
<Filter>Source Files\Object</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SettingsState.cpp">
|
||||
<Filter>Source Files\State</Filter>
|
||||
<ClCompile Include="Vertex.cpp">
|
||||
<Filter>Source Files\Object</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="InitState.cpp">
|
||||
<Filter>Source Files\State</Filter>
|
||||
<ClCompile Include="Vector.cpp">
|
||||
<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>
|
||||
</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>
|
||||
+80
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -1,12 +1,119 @@
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <cmath>
|
||||
#include "Enemy.h"
|
||||
#include "Model.h"
|
||||
#include <iostream>
|
||||
|
||||
|
||||
|
||||
Enemy::Enemy()
|
||||
Enemy::Enemy(const std::string &fileName,
|
||||
const std::string &fileMusic,
|
||||
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()
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,10 +1,29 @@
|
||||
#pragma once
|
||||
#include "Header.h"
|
||||
|
||||
class Enemy
|
||||
#include "Entity.h"
|
||||
#include <string>
|
||||
#include "Vector.h"
|
||||
#include "CrystalPoint.h"
|
||||
|
||||
class Enemy : public Entity
|
||||
{
|
||||
public:
|
||||
Enemy();
|
||||
Enemy(const std::string &fileName, const std::string &fileMusic, const Vec3f &position, const Vec3f &rotation, const float &scale);
|
||||
~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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
};
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "InitState.h"
|
||||
|
||||
|
||||
|
||||
InitState::InitState()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
InitState::~InitState()
|
||||
{
|
||||
}
|
||||
-11
@@ -1,11 +0,0 @@
|
||||
#pragma once
|
||||
#include "Header.h"
|
||||
#include "State.h"
|
||||
|
||||
class InitState : public State
|
||||
{
|
||||
public:
|
||||
InitState();
|
||||
~InitState();
|
||||
};
|
||||
|
||||
+119
@@ -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
@@ -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;
|
||||
};
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "Keyboard.h"
|
||||
|
||||
|
||||
|
||||
Keyboard::Keyboard()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Keyboard::~Keyboard()
|
||||
{
|
||||
}
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
#pragma once
|
||||
#include "Header.h"
|
||||
|
||||
class Keyboard
|
||||
{
|
||||
public:
|
||||
Keyboard();
|
||||
~Keyboard();
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "LoadingState.h"
|
||||
|
||||
|
||||
|
||||
LoadingState::LoadingState()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
LoadingState::~LoadingState()
|
||||
{
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
#pragma once
|
||||
#include "Header.h"
|
||||
#include "State.h"
|
||||
|
||||
class LoadingState : public State
|
||||
{
|
||||
public:
|
||||
LoadingState();
|
||||
~LoadingState();
|
||||
};
|
||||
|
||||
@@ -1,138 +1,78 @@
|
||||
#include "Header.h"
|
||||
#include "Model.h"
|
||||
#include "Player.h"
|
||||
#include "StateHandler.h"
|
||||
#include "State.h"
|
||||
#include <GL/freeglut.h>
|
||||
|
||||
#include "CrystalPoint.h"
|
||||
#include <stdio.h>
|
||||
#include "Vector.h"
|
||||
|
||||
#define STB_IMAGE_IMPLEMENTATION
|
||||
#include "stb_image.h"
|
||||
|
||||
#include "Cursor.h"
|
||||
|
||||
//Prototypes
|
||||
void bindFuncOpenGL(void);
|
||||
void configureOpenGL(void);
|
||||
void loadModels(void);
|
||||
|
||||
static int Width;
|
||||
static int Height;
|
||||
CrystalPoint* app;
|
||||
|
||||
float lastFrameTime = 0;
|
||||
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;
|
||||
}
|
||||
bool justMoved = false;
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
//Init GLUT
|
||||
app = new CrystalPoint();
|
||||
glutInit(&argc, argv);
|
||||
|
||||
//Configre OpenGL and FreeGLut
|
||||
configureOpenGL();
|
||||
|
||||
//Bind functions
|
||||
bindFuncOpenGL();
|
||||
app->init();
|
||||
|
||||
//Init models
|
||||
loadModels();
|
||||
|
||||
//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); });
|
||||
glutDisplayFunc([]() { app->draw(); } );
|
||||
glutIdleFunc([]() { app->update(); } );
|
||||
glutReshapeFunc([](int w, int h) { CrystalPoint::width = w; CrystalPoint::height = h; glViewport(0, 0, w, h); });
|
||||
|
||||
//Keyboard
|
||||
glutKeyboardFunc(keyboard);
|
||||
glutKeyboardUpFunc(keyboardup);
|
||||
glutKeyboardFunc([](unsigned char c, int, int) { app->keyboardState.keys[c] = true; });
|
||||
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
|
||||
glutMouseFunc(mouse);
|
||||
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()
|
||||
@@ -140,9 +80,10 @@ void configureOpenGL()
|
||||
//Init window and glut display mode
|
||||
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
|
||||
glutInitWindowSize(800, 600);
|
||||
//glutInitWindowPosition(glutGet(GLUT_WINDOW_WIDTH) / 2 - 800/2, glutGet(GLUT_WINDOW_HEIGHT) / 2 - 600/2);
|
||||
glutCreateWindow("Crystal Point");
|
||||
glutFullScreen();
|
||||
//glutPositionWindow((glutGet(GLUT_SCREEN_WIDTH) / 2) - (glutGet(GLUT_WINDOW_WIDTH) / 2), (glutGet(GLUT_SCREEN_HEIGHT) / 2) - (glutGet(GLUT_WINDOW_HEIGHT) / 2));
|
||||
//glutFullScreen();
|
||||
|
||||
|
||||
//Depth testing
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
@@ -156,32 +97,21 @@ void configureOpenGL()
|
||||
glAlphaFunc(GL_GREATER, 0.01f);
|
||||
|
||||
//Lighting
|
||||
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
|
||||
GLfloat mat_shininess[] = { 20.0 };
|
||||
GLfloat light_position[] = { 30.0, 30.0, 30.0, 1.0 };
|
||||
GLfloat light_diffuse[] = { 2.0, 2.0, 2.0, 1.0 };
|
||||
GLfloat light_ambient[] = { 2.0, 2.0, 2.0, 1.0 };
|
||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||
glShadeModel(GL_SMOOTH);
|
||||
GLfloat mat_specular[] = { 0.2, 0.2, 0.2, 0 };
|
||||
//GLfloat mat_shininess[] = { 5.0 };
|
||||
GLfloat light_position[] = { 0.0, 2.0, 1.0, 0 };
|
||||
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 0 };
|
||||
GLfloat light_ambient[] = { 0.3, 0.3, 0.3, 0 };
|
||||
glClearColor(0.7, 0.7, 1.0, 1.0);
|
||||
|
||||
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
|
||||
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_AMBIENT, light_ambient);
|
||||
//glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
|
||||
//glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
|
||||
//glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
|
||||
//glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
|
||||
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_LIGHT0);
|
||||
//glEnable(GL_COLOR_MATERIAL);
|
||||
|
||||
//Cursor
|
||||
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"));
|
||||
glutSetCursor(GLUT_CURSOR_NONE);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
#include "MenuElement.h"
|
||||
|
||||
MenuElement::MenuElement(Vec2f position)
|
||||
{
|
||||
hover = false;
|
||||
this->position = position;
|
||||
}
|
||||
|
||||
|
||||
MenuElement::~MenuElement()
|
||||
{
|
||||
}
|
||||
@@ -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) {};
|
||||
};
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "MenuState.h"
|
||||
|
||||
|
||||
|
||||
MenuState::MenuState()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
MenuState::~MenuState()
|
||||
{
|
||||
}
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
#pragma once
|
||||
#include "Header.h"
|
||||
#include "State.h"
|
||||
|
||||
class MenuState : public State
|
||||
{
|
||||
public:
|
||||
MenuState();
|
||||
~MenuState();
|
||||
};
|
||||
@@ -1,14 +1,19 @@
|
||||
#include "Model.h"
|
||||
|
||||
#define STB_IMAGE_IMPLEMENTATION
|
||||
#include "stb_image.h"
|
||||
|
||||
//Prototypes
|
||||
vector<string> split(string str, string sep);
|
||||
string replace(string str, string toReplace, string replacement);
|
||||
string toLower(string data);
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#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;
|
||||
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 ;)
|
||||
{
|
||||
Vertex vertex;
|
||||
VertexIndex vertex;
|
||||
std::vector<std::string> indices = split(params[i == (ii - 3) ? 1 : i], "/");
|
||||
if (indices.size() >= 1) //er is een positie
|
||||
vertex.position = atoi(indices[0].c_str()) - 1;
|
||||
@@ -115,24 +120,48 @@ Model::Model(string fileName)
|
||||
}
|
||||
}
|
||||
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()
|
||||
{
|
||||
glEnableClientState(GL_VERTEX_ARRAY);
|
||||
glEnableClientState(GL_NORMAL_ARRAY);
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
for (auto &g : groups)
|
||||
{
|
||||
if (materials[g->materialIndex]->hasTexture)
|
||||
@@ -163,31 +192,14 @@ void Model::draw()
|
||||
}
|
||||
}
|
||||
|
||||
for (auto &instance : instances)
|
||||
{
|
||||
|
||||
glBegin(GL_TRIANGLES);
|
||||
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();
|
||||
|
||||
}
|
||||
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);
|
||||
glDrawArrays(GL_TRIANGLES, 0, g->VertexArray.size());
|
||||
}
|
||||
glDisableClientState(GL_VERTEX_ARRAY);
|
||||
glDisableClientState(GL_NORMAL_ARRAY);
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
}
|
||||
|
||||
void Model::loadMaterialFile(std::string fileName, std::string dirName)
|
||||
@@ -287,6 +299,9 @@ Model::Texture::Texture(const std::string & fileName)
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -295,7 +310,7 @@ void Model::Texture::bind()
|
||||
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;
|
||||
while (true)
|
||||
@@ -309,7 +324,7 @@ string replace(string str, string toReplace, string replacement)
|
||||
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;
|
||||
size_t index;
|
||||
@@ -325,8 +340,43 @@ vector<string> split(string str, string sep)
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline string toLower(string data)
|
||||
inline std::string toLower(std::string data)
|
||||
{
|
||||
std::transform(data.begin(), data.end(), data.begin(), ::tolower);
|
||||
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)
|
||||
{
|
||||
|
||||
}
|
||||
@@ -1,11 +1,17 @@
|
||||
#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
|
||||
{
|
||||
private:
|
||||
class Vertex
|
||||
|
||||
class VertexIndex
|
||||
{
|
||||
public:
|
||||
int position;
|
||||
@@ -16,7 +22,7 @@ private:
|
||||
class Face
|
||||
{
|
||||
public:
|
||||
list<Vertex> vertices;
|
||||
std::list<VertexIndex> vertices;
|
||||
};
|
||||
|
||||
class Texture
|
||||
@@ -49,7 +55,8 @@ private:
|
||||
public:
|
||||
std::string name;
|
||||
int materialIndex;
|
||||
list<Face> faces;
|
||||
std::list<Face> faces;
|
||||
std::vector<Vertex> VertexArray;
|
||||
};
|
||||
|
||||
std::vector<Vec3f> vertices;
|
||||
@@ -58,15 +65,23 @@ private:
|
||||
std::vector<ObjGroup*> groups;
|
||||
std::vector<MaterialInfo*> materials;
|
||||
|
||||
std::vector<ModelInstance*> instances;
|
||||
|
||||
void loadMaterialFile(std::string fileName, std::string dirName);
|
||||
public:
|
||||
|
||||
Model(std::string filename);
|
||||
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 Optimise(ObjGroup *t);
|
||||
|
||||
Vec3f minVertex;
|
||||
Vec3f maxVertex;
|
||||
|
||||
Vec3f center;
|
||||
float radius;
|
||||
};
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "ModelHandler.h"
|
||||
|
||||
|
||||
|
||||
ModelHandler::ModelHandler()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
ModelHandler::~ModelHandler()
|
||||
{
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
#pragma once
|
||||
class ModelHandler
|
||||
{
|
||||
public:
|
||||
ModelHandler();
|
||||
~ModelHandler();
|
||||
};
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
#include "ModelInstance.h"
|
||||
|
||||
ModelInstance::ModelInstance()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
ModelInstance::~ModelInstance()
|
||||
{
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
#pragma once
|
||||
#include "Header.h"
|
||||
|
||||
class ModelInstance
|
||||
{
|
||||
private:
|
||||
public:
|
||||
ModelInstance();
|
||||
~ModelInstance();
|
||||
|
||||
Vec3f translation;
|
||||
Vec3f rotation;
|
||||
Vec3f scale;
|
||||
|
||||
};
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
#pragma once
|
||||
#include "Header.h"
|
||||
|
||||
class Mouse
|
||||
{
|
||||
public:
|
||||
Mouse();
|
||||
~Mouse();
|
||||
};
|
||||
|
||||
+39
-60
@@ -1,77 +1,56 @@
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <cmath>
|
||||
#include "Player.h"
|
||||
#include <GL/freeglut.h>
|
||||
|
||||
Player* Player::instance = NULL;
|
||||
|
||||
Player::Player()
|
||||
{
|
||||
|
||||
speed = 10;
|
||||
health = 50;
|
||||
xp = 75;
|
||||
level = 10;
|
||||
crystals = 0;
|
||||
}
|
||||
|
||||
|
||||
Player::~Player()
|
||||
Player* Player::getInstance()
|
||||
{
|
||||
if(right != nullptr)
|
||||
delete right;
|
||||
if(left != nullptr)
|
||||
delete left;
|
||||
/*if (player != nullptr)
|
||||
delete player;*/
|
||||
}
|
||||
if (instance == nullptr)
|
||||
instance = new 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;
|
||||
}
|
||||
|
||||
//Player * Player::GetInstance(void)
|
||||
//{
|
||||
// if (player == nullptr)
|
||||
// player = new Player();
|
||||
// return player;
|
||||
//}
|
||||
|
||||
void Player::PlayerMoveEyes(float angle, float fac, bool heigth)
|
||||
void Player::init()
|
||||
{
|
||||
//player movement
|
||||
instance = new Player();
|
||||
}
|
||||
|
||||
/*if (heigth)
|
||||
player->eyes.posY += angle*fac;
|
||||
Player::~Player()
|
||||
{
|
||||
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
|
||||
{
|
||||
player->eyes.posX += (float)cos((player->eyes.rotY + angle) / 180 * M_PI) * fac;
|
||||
player->eyes.posZ += (float)sin((player->eyes.rotY + 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;
|
||||
position.x -= (float)cos((rotation.y + angle) / 180 * M_PI) * fac;
|
||||
position.z -= (float)sin((rotation.y + angle) / 180 * M_PI) * fac;
|
||||
}
|
||||
}
|
||||
|
||||
void Player::PlayerRotateEyes(int dx, int dy)
|
||||
{
|
||||
eyes.rotY += dx / 10.0f;
|
||||
eyes.rotX += dy / 10.0f;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,38 +1,32 @@
|
||||
#pragma once
|
||||
#include "Header.h"
|
||||
#include "Weapon.h"
|
||||
#include "Vector.h"
|
||||
|
||||
class Model;
|
||||
|
||||
class Player
|
||||
{
|
||||
private:
|
||||
static Player* instance;
|
||||
public:
|
||||
Player();
|
||||
~Player();
|
||||
|
||||
struct Eyes
|
||||
{
|
||||
float posX = 0;
|
||||
float posY = 0;
|
||||
float posZ = 0;
|
||||
float rotX = 0;
|
||||
float rotY = 0;
|
||||
} eyes;
|
||||
void setCamera();
|
||||
void setPosition(float angle, float fac, bool height);
|
||||
|
||||
void Display(void);
|
||||
//static Player* GetInstance(void);
|
||||
static Player& GetInstance(void);
|
||||
static Player* getInstance(void);
|
||||
static void init(void);
|
||||
|
||||
Vec3f position;
|
||||
Vec2f rotation;
|
||||
|
||||
void PlayerMoveEyes(const float angle, const float fac, const bool heigth);
|
||||
void PlayerRotateEyes(const int dx, const int dy);
|
||||
private:
|
||||
Model* leftWeapon;
|
||||
Model* rightWeapon;
|
||||
|
||||
float health;
|
||||
float xp;
|
||||
int level;
|
||||
int xp;
|
||||
Weapon* right = nullptr;
|
||||
Weapon* left = nullptr;
|
||||
vector<Weapon> weapons;
|
||||
Player();
|
||||
Player(Player const&);
|
||||
void operator=(Player const&);
|
||||
int crystals;
|
||||
|
||||
//static Player* player;
|
||||
float speed;
|
||||
};
|
||||
|
||||
|
||||
+62
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
+40
@@ -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.
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "SettingsState.h"
|
||||
|
||||
|
||||
|
||||
SettingsState::SettingsState()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
SettingsState::~SettingsState()
|
||||
{
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
#pragma once
|
||||
#include "Header.h"
|
||||
#include "State.h"
|
||||
|
||||
class SettingsState : public State
|
||||
{
|
||||
public:
|
||||
SettingsState();
|
||||
~SettingsState();
|
||||
};
|
||||
|
||||
+166
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
@@ -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];
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
//}
|
||||
|
||||
@@ -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
@@ -1,3 +1,5 @@
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <cmath>
|
||||
#include "Vector.h"
|
||||
|
||||
Vec3f::Vec3f(float x, float y, float z)
|
||||
@@ -6,13 +8,36 @@ Vec3f::Vec3f(float x, float y, float z)
|
||||
this->y = y;
|
||||
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()
|
||||
{
|
||||
this->x = 0;
|
||||
this->y = 0;
|
||||
this->z = 0;
|
||||
}
|
||||
Vec3f::Vec3f(Vec3f &other)
|
||||
Vec3f::Vec3f(const Vec3f &other)
|
||||
{
|
||||
this->x = other.x;
|
||||
this->y = other.y;
|
||||
@@ -24,6 +49,51 @@ float& Vec3f::operator [](int 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)
|
||||
@@ -36,7 +106,7 @@ Vec2f::Vec2f()
|
||||
this->x = 0;
|
||||
this->y = 0;
|
||||
}
|
||||
Vec2f::Vec2f(Vec2f &other)
|
||||
Vec2f::Vec2f(const Vec2f &other)
|
||||
{
|
||||
this->x = other.x;
|
||||
this->y = other.y;
|
||||
@@ -46,3 +116,14 @@ float& Vec2f::operator [](int 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);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#pragma once
|
||||
#include "Header.h"
|
||||
|
||||
class Vec3f
|
||||
{
|
||||
@@ -13,9 +12,21 @@ public:
|
||||
float v[3];
|
||||
};
|
||||
Vec3f();
|
||||
Vec3f(Vec3f &other);
|
||||
Vec3f(const Vec3f &other);
|
||||
Vec3f(float x, float y, float z);
|
||||
float Length();
|
||||
void Normalize();
|
||||
float Distance(const Vec3f &);
|
||||
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
|
||||
@@ -31,7 +42,9 @@ public:
|
||||
};
|
||||
Vec2f();
|
||||
Vec2f(float x, float y);
|
||||
Vec2f(Vec2f &other);
|
||||
Vec2f(const Vec2f &other);
|
||||
float& operator [](int);
|
||||
Vec2f operator + (const Vec2f &other);
|
||||
float length();
|
||||
};
|
||||
|
||||
|
||||
+39
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-28
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "WorldModel.h"
|
||||
|
||||
|
||||
|
||||
WorldModel::WorldModel()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
WorldModel::~WorldModel()
|
||||
{
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
#pragma once
|
||||
#include "Header.h"
|
||||
|
||||
class WorldModel
|
||||
{
|
||||
public:
|
||||
WorldModel();
|
||||
~WorldModel();
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
|
||||
@@ -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
Reference in New Issue
Block a user