-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
MeshGame.cpp
106 lines (88 loc) · 2.44 KB
/
MeshGame.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "MeshGame.h"
// Declare our game instance
MeshGame game;
MeshGame::MeshGame()
: _font(NULL), _scene(NULL),_modelNode(NULL), _touched(false), _touchX(0)
{
}
MeshGame::~MeshGame()
{
}
void MeshGame::initialize()
{
// Load font
_font = Font::create("res/arial40.gpb");
// Load mesh/scene from file
Package* pkg = Package::create("res/duck.gpb");
_scene = pkg->loadScene();
SAFE_RELEASE(pkg);
// Get the duck node
_modelNode = _scene->findNode("duck");
// Bind the material to the model
_modelNode->getModel()->setMaterial("res/duck.material");
// Find the light node
Node* lightNode = _scene->findNode("directionalLight1");
// Bind the light node's direction into duck's material.
_modelNode->getModel()->getMaterial()->getParameter("u_lightDirection")->bindValue(lightNode, &Node::getForwardVectorView);
}
void MeshGame::finalize()
{
SAFE_RELEASE(_font);
SAFE_RELEASE(_scene);
}
void MeshGame::update(long elapsedTime)
{
// Rotate model
if (!_touched)
_modelNode->rotateY(MATH_DEG_TO_RAD(0.5f));
}
void MeshGame::render(long elapsedTime)
{
// Clear the color and depth buffers.
clear(CLEAR_COLOR_DEPTH, Vector4::zero(), 1.0f, 0);
// Visit all the nodes in the scene, drawing the models/mesh.
_scene->visit(this, &MeshGame::drawScene);
// Draw the fps
drawFrameRate(_font, Vector4(0, 0.5f, 1, 1), 5, 5, getFrameRate());
}
void MeshGame::touch(int x, int y, int touchEvent)
{
switch (touchEvent)
{
case Input::TOUCHEVENT_PRESS:
{
_touched = true;
_touchX = x;
}
break;
case Input::TOUCHEVENT_RELEASE:
{
_touched = false;
_touchX = 0;
}
break;
case Input::TOUCHEVENT_MOVE:
{
int deltaX = x - _touchX;
_touchX = x;
_modelNode->rotateY(MATH_DEG_TO_RAD(deltaX * 0.5f));
}
break;
default:
break;
};
}
void MeshGame::drawScene(Node* node, long cookie)
{
Model* model = node->getModel();
if (model)
model->draw();
}
void MeshGame::drawFrameRate(Font* font, const Vector4& color, unsigned int x, unsigned int y, unsigned int fps)
{
char buffer[10];
sprintf(buffer, "%u", fps);
font->begin();
font->drawText(buffer, x, y, color);
font->end();
}