rayzor

view src/modeller.cc @ 14:a9a948809c6f

starting the renderer screen, plus misc stuff
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 13 Apr 2014 08:06:21 +0300
parents d94a69933a71
children be616b58df99
line source
1 #include <stdio.h>
2 #include <string.h>
3 #include <assert.h>
4 #include "modeller.h"
5 #include "min3d.h"
6 #include "rayzor.h"
7 #include "scene.h"
8 #include "keyb.h"
9 #include "scrman.h"
10 #include "logger.h"
12 struct ModellerImpl {
13 int mx, my;
14 float cam_theta, cam_phi, cam_dist;
16 struct m3d_image rbuf;
18 bool bnstate[8];
19 int prev_x, prev_y;
20 };
22 static void draw_grid(float size, float spacing);
24 Modeller::Modeller()
25 {
26 set_name("modeller");
27 }
29 Modeller::~Modeller()
30 {
31 shutdown();
32 }
34 bool Modeller::init()
35 {
36 mod = new ModellerImpl;
37 memset(mod, 0, sizeof *mod);
39 mod->cam_phi = 25;
40 mod->cam_dist = 5;
42 m3d_init();
43 mod->rbuf.pixels = fb_pixels;
44 mod->rbuf.xsz = fb_width;
45 mod->rbuf.ysz = fb_height;
46 m3d_set_buffers(&mod->rbuf, 0);
48 m3d_matrix_mode(M3D_PROJECTION);
49 m3d_load_identity();
50 m3d_perspective(50.0, (float)fb_width / (float)fb_height, 0.5, 500.0);
52 m3d_enable(M3D_CULL_FACE);
53 return true;
54 }
56 void Modeller::shutdown()
57 {
58 if(mod) {
59 m3d_shutdown();
61 delete mod;
62 mod = 0;
63 }
64 }
66 void Modeller::draw() const
67 {
68 m3d_clear(M3D_COLOR_BUFFER_BIT);
70 m3d_matrix_mode(M3D_MODELVIEW);
71 m3d_load_identity();
72 m3d_translate(0, 0, -mod->cam_dist);
73 m3d_rotate(mod->cam_phi, 1, 0, 0);
74 m3d_rotate(mod->cam_theta, 0, 1, 0);
76 draw_grid(10.0, 1.0);
78 scene->draw();
79 }
82 static void draw_grid(float size, float spacing)
83 {
84 int num_lines = size / spacing;
85 float dist = size / 2.0;
87 m3d_disable(M3D_LIGHTING);
89 m3d_begin(M3D_LINES);
90 m3d_color(0.4, 0.4, 0.4);
92 float x = -dist;
93 for(int i=0; i<=num_lines; i++) {
94 if(i != num_lines / 2) {
95 m3d_vertex(-dist, 0, x);
96 m3d_vertex(dist, 0, x);
97 m3d_vertex(x, 0, -dist);
98 m3d_vertex(x, 0, dist);
99 }
100 x += spacing;
101 }
102 m3d_end();
104 m3d_begin(M3D_LINES);
105 m3d_color(0.8, 0, 0);
106 m3d_vertex(-dist, 0, 0);
107 m3d_vertex(dist, 0, 0);
108 m3d_color(0.1, 0.3, 0.8);
109 m3d_vertex(0, 0, -dist);
110 m3d_vertex(0, 0, dist);
111 m3d_end();
112 }
115 void Modeller::handle_keyboard(int key, bool press)
116 {
117 if(press) {
118 switch(key) {
119 case 'q':
120 quit_app();
121 break;
123 case 27:
124 scene->clear_selection();
125 break;
127 case '\t':
128 {
129 int s = scene->get_selection();
130 if(s >= 0) {
131 s = (s + 1) % scene->get_node_count();
132 scene->clear_selection();
133 } else {
134 s = 0;
135 }
136 scene->select(s);
137 }
138 break;
140 case 'r':
141 case 'R':
142 if(kb_isdown(KB_ALT) || kb_isdown(KB_CTRL)) {
143 Screen *rs = get_screen("renderer");
144 if(rs) {
145 activate_screen(rs);
146 } else {
147 printlog("failed to find renderer screen!\n");
148 }
149 }
150 break;
152 default:
153 break;
154 }
155 }
156 }
158 void Modeller::handle_mbutton(int bn, bool press, int x, int y)
159 {
160 mod->bnstate[bn] = press;
161 mod->prev_x = x;
162 mod->prev_y = y;
163 }
165 void Modeller::handle_mmotion(int x, int y)
166 {
167 int dx = x - mod->prev_x;
168 int dy = y - mod->prev_y;
169 mod->prev_x = x;
170 mod->prev_y = y;
172 if(kb_isdown(KB_ALT) || kb_isdown(KB_CTRL)) {
173 if(mod->bnstate[0]) {
174 mod->cam_theta += dx * 0.5;
175 mod->cam_phi += dy * 0.5;
177 if(mod->cam_phi < -90) mod->cam_phi = -90;
178 if(mod->cam_phi > 90) mod->cam_phi = 90;
179 }
180 if(mod->bnstate[1]) {
181 mod->cam_dist += dy * 0.1;
182 if(mod->cam_dist < 0) mod->cam_dist = 0;
183 }
184 }
185 }