source: trunk/orbital/orbital.cpp @ 1330

Last change on this file since 1330 was 1330, checked in by sam, 9 years ago

orbital: get rid of the normal matrix; we can compute it on the fly later.

File size: 5.4 KB
Line 
1//
2// Orbital
3//
4// Copyright: (c) 2012 Various People
5//
6
7#if defined HAVE_CONFIG_H
8#   include "config.h"
9#endif
10
11#if defined _WIN32
12#   include <direct.h>
13#endif
14
15#if USE_SDL && defined __APPLE__
16#   include <SDL_main.h>
17#endif
18
19#include "core.h"
20#include "loldebug.h"
21
22using namespace std;
23using namespace lol;
24
25#include "orbital.h"
26#include "mesh.h"
27#include "particlesystem.h"
28#include "camera.h"
29
30Orbital::Orbital()
31{
32    for (int j = 0; j < 20; j++)
33    {
34        for (int i = 0; i < 20; i++)
35        {
36            m.SendCommand(((i + j) % 2) ? "sc.3,.7,.9,1,scb.3,.7,.9,1"
37                                        : "sc.3,.3,.7,1,scb.3,.3,.7,1");
38            m.SendCommand("ac4,2,44,40,0,0,ty-1,ad4,40,0,ry45");
39            m.Scale(vec3(std::sqrt(0.5f)));
40            m.Translate(vec3(i * 44 - 440, -50, j * 44 - 440));
41            m.Flush();
42        }
43    }
44
45    /* Yellow sphere */
46    m.SendCommand("sc1,1,0,1,asph10,30,20,24");
47    m.SendCommand("t0,0,-60,fl");
48
49    /* Pink box */
50    m.SendCommand("sc1,0,1,1,afcb10,10,10,1,rx45,rz45");
51    m.SendCommand("t-20,-20,0,fl");
52
53    /* Large meteor */
54    m.SendCommand("sc0,0,0.3,1,afcb30,30,30,5,ry45,rx45,afcb30,30,30,5");
55    m.SendCommand("t40,40,0,fl");
56
57    /* Grey/red bonus */
58    m.SendCommand("sc0.6,0.7,0.8,1,afcb7,4,7,0.6,sc1,0,0.3,1,afcb4,7,4,0.6");
59    m.SendCommand("t-40,20,-30,fl");
60
61    /* Orange/white alien */
62    m.SendCommand("sc1,0.7,0,1,afcb12,3,10,0.4,tz3,sc1,1,1,1,afcb2,10,10,0.4");
63    m.SendCommand("rx20,ry30,t0,40,-20,fl");
64
65    /* Tank body + tank head */
66    m.SendCommand("sc0.1,0.1,0,1,ab6,6,15,ty-2,sc1,1,1,1,afcb4,5,16,0.4,tx4,tx60,mx,tx120,fl,sc0.2,0.7,0,1,afcb8,7,10,0.4,tz-4,tx60,fl");
67    m.SendCommand("sc0.2,0.7,0,1,afcb3,6,10,0.4,tx-8,afcb3,6,10,0.4,tx4,ty10,tx60,fl,sc1,1,1,1,afcb3,6,10,0.4,rx-30,ty10,tx60,fl");
68
69    /* Orange player ship */
70    m.SendCommand("sc1,.5,0,1");
71    m.SendCommand("afcb5,1,3,0.6,fl,sc1,1,1,1,afcb1,5,3,0.6,tz-1,irb");
72    m.SendCommand("sc1,.5,0,1");
73    m.SendCommand("afcb3,6,7,.4,t0,0,7,sc1,1,1,1,afcb3,4,4,.4,t4,0,-4,mx,fl");
74    m.SendCommand("sc1,.5,0,1");
75    m.SendCommand("afcb3,6,5,.4,sc1,1,1,1,afcb2,3,9,.4,fl");
76    m.SendCommand("scb1,1,1,1,ac4,15,.2,.6,1,1,tz-2,ac4,15,.2,.6,1,1,rx90,t0,-2,-7,fl");
77
78    /* Orange fire */
79    m.SendCommand("sc1,1,0,1,scb1,0,0,0,at4,1,s1.5,1,4,tz-13,ad6,5.8,1");
80    m.SendCommand("t-40,-40,0,fl");
81
82    /* Lasers */
83    m.SendCommand("sc1,1,1,1,scb0,0,0,1,aq8,1,sx0.25,tx-3,sc1,0,0,1,scb0,0,0,1,aq8,1,tx4,sz50,sx0.3,tz-200,mx,as10,12,8,1,1,ty60,fl");
84
85    /* Thrusters */
86    m.SendCommand("sc0,1,1,scb0,0,0,1,ac5,15,0,1.5,0,1,ac7,35,1.1,4,0,1,rx90,t-3,0,27,mx");
87    m.SendCommand("fl");
88
89    m_particlesystem = new ParticleSystem();
90    m_camera = new Camera(vec3(0, 200, 300),
91                          vec3(0, 0, 0),
92                          vec3(0, 1, 0));
93
94    m_auto_cam_timer = 0.0f;
95
96    m_angle = vec3(0.f);
97    m_angular_velocity = vec3(0.f);
98
99    m_ready = false;
100
101    Ticker::Ref(m_particlesystem);
102    Ticker::Ref(m_camera);
103}
104
105void Orbital::TickGame(float seconds)
106{
107    WorldEntity::TickGame(seconds);
108
109    if (Input::GetButtonState(27 /*SDLK_ESCAPE*/))
110        Ticker::Shutdown();
111
112    if (m_auto_cam_timer > 0.0f)
113        m_auto_cam_timer -= seconds;
114
115    //Doing the query with actual values, cause I want to stay SDL-free for now.
116    int HMovement = Input::GetButtonState(276 /*SDLK_LEFT*/) - Input::GetButtonState(275 /*SDLK_RIGHT*/);
117    int VMovement = Input::GetButtonState(274 /*SDLK_DOWN*/) - Input::GetButtonState(273 /*SDLK_UP*/);
118    int RMovement = Input::GetButtonState(256 /*SDLK_KP0*/) - Input::GetButtonState(305 /*SDLK_RCTRL*/);
119
120    vec3 new_angular_velocity = vec3(0.0f);
121
122    if (VMovement != 0 || HMovement != 0 || RMovement != 0)
123    {
124        new_angular_velocity = vec3(HMovement, VMovement, RMovement) * 50.0f;
125        m_auto_cam_timer = 2.0f;
126    }
127    else if (m_auto_cam_timer <= 0.0f)
128    {
129        /* Order is yaw, pitch, roll */
130        new_angular_velocity = clamp(-m_angle, vec3(40.f, -20.f, -40.f),
131                                               vec3(40.f,  20.f,  40.f));
132    }
133
134    m_angular_velocity += (new_angular_velocity - m_angular_velocity)
135                          * (seconds / (seconds + 0.3f));
136    m_angle += m_angular_velocity * seconds;
137
138    /* TODO: implement "vec3 % float" or "fmod(vec3, float)" */
139    for (int n = 0; n < 3; n++)
140    {
141        if (m_angle[n] > 180.f)
142            m_angle[n] -= 360.f;
143        else if (m_angle[n] < -180.f)
144            m_angle[n] += 360.f;
145    }
146
147    quat q = quat::rotate(-90.f, 0.f, 0.f, 1.f);
148    mat4 anim = mat4(~q * quat::fromeuler(m_angle) * q);
149    mat4 model = mat4::translate(vec3(0));
150
151    m_modelview = m_camera->GetViewMatrix() * model * anim;
152    m_proj = m_camera->GetProjMatrix();
153}
154
155void Orbital::TickDraw(float seconds)
156{
157    WorldEntity::TickDraw(seconds);
158
159    if (!m_ready)
160    {
161        m.SendCommand("irb");
162
163        /* FIXME: this object never cleans up */
164        m_ready = true;
165    }
166
167    Video::SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));
168
169    m.Render(m_modelview, m_proj);
170}
171
172Orbital::~Orbital()
173{
174    Ticker::Unref(m_particlesystem);
175    Ticker::Unref(m_camera);
176}
177
178int main(int argc, char **argv)
179{
180    Application app("Orbital", ivec2(800, 600), 60.0f);
181
182#if defined _MSC_VER && !defined _XBOX
183    _chdir("..");
184#elif defined _WIN32 && !defined _XBOX
185    _chdir("../..");
186#endif
187
188    new DebugFps(5, 5);
189    new Orbital();
190    app.ShowPointer(false);
191
192    app.Run();
193
194    return EXIT_SUCCESS;
195}
196
Note: See TracBrowser for help on using the repository browser.