rayzor

annotate src/modeller.cc @ 12:d94a69933a71

lots of stuff, can't remember
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 12 Apr 2014 23:28:24 +0300
parents 70e332156d02
children a9a948809c6f
rev   line source
nuclear@12 1 #include <stdio.h>
nuclear@9 2 #include <string.h>
nuclear@9 3 #include <assert.h>
nuclear@9 4 #include "modeller.h"
nuclear@9 5 #include "min3d.h"
nuclear@9 6 #include "rayzor.h"
nuclear@9 7 #include "scene.h"
nuclear@12 8 #include "keyb.h"
nuclear@9 9
nuclear@9 10 struct ModellerImpl {
nuclear@9 11 int mx, my;
nuclear@9 12 float cam_theta, cam_phi, cam_dist;
nuclear@9 13
nuclear@9 14 struct m3d_image rbuf;
nuclear@9 15
nuclear@9 16 bool bnstate[8];
nuclear@9 17 int prev_x, prev_y;
nuclear@9 18 };
nuclear@9 19
nuclear@9 20 static void draw_grid(float size, float spacing);
nuclear@9 21
nuclear@9 22 Modeller::Modeller()
nuclear@9 23 {
nuclear@9 24 set_name("modeller");
nuclear@9 25 }
nuclear@9 26
nuclear@9 27 Modeller::~Modeller()
nuclear@9 28 {
nuclear@9 29 shutdown();
nuclear@9 30 }
nuclear@9 31
nuclear@9 32 bool Modeller::init()
nuclear@9 33 {
nuclear@9 34 mod = new ModellerImpl;
nuclear@9 35 memset(mod, 0, sizeof *mod);
nuclear@9 36
nuclear@9 37 mod->cam_phi = 25;
nuclear@9 38 mod->cam_dist = 5;
nuclear@9 39
nuclear@9 40 m3d_init();
nuclear@9 41 mod->rbuf.pixels = fb_pixels;
nuclear@9 42 mod->rbuf.xsz = fb_width;
nuclear@9 43 mod->rbuf.ysz = fb_height;
nuclear@9 44 m3d_set_buffers(&mod->rbuf, 0);
nuclear@9 45
nuclear@9 46 m3d_matrix_mode(M3D_PROJECTION);
nuclear@9 47 m3d_load_identity();
nuclear@9 48 m3d_perspective(50.0, (float)fb_width / (float)fb_height, 0.5, 500.0);
nuclear@9 49
nuclear@9 50 m3d_enable(M3D_CULL_FACE);
nuclear@9 51 return true;
nuclear@9 52 }
nuclear@9 53
nuclear@9 54 void Modeller::shutdown()
nuclear@9 55 {
nuclear@9 56 if(mod) {
nuclear@9 57 m3d_shutdown();
nuclear@9 58
nuclear@9 59 delete mod;
nuclear@9 60 mod = 0;
nuclear@9 61 }
nuclear@9 62 }
nuclear@9 63
nuclear@9 64 void Modeller::draw() const
nuclear@9 65 {
nuclear@9 66 m3d_clear(M3D_COLOR_BUFFER_BIT);
nuclear@9 67
nuclear@9 68 m3d_matrix_mode(M3D_MODELVIEW);
nuclear@9 69 m3d_load_identity();
nuclear@9 70 m3d_translate(0, 0, -mod->cam_dist);
nuclear@9 71 m3d_rotate(mod->cam_phi, 1, 0, 0);
nuclear@9 72 m3d_rotate(mod->cam_theta, 0, 1, 0);
nuclear@9 73
nuclear@9 74 draw_grid(10.0, 1.0);
nuclear@9 75
nuclear@9 76 scene->draw();
nuclear@9 77 }
nuclear@9 78
nuclear@9 79
nuclear@9 80 static void draw_grid(float size, float spacing)
nuclear@9 81 {
nuclear@9 82 int num_lines = size / spacing;
nuclear@9 83 float dist = size / 2.0;
nuclear@9 84
nuclear@9 85 m3d_disable(M3D_LIGHTING);
nuclear@9 86
nuclear@9 87 m3d_begin(M3D_LINES);
nuclear@9 88 m3d_color(0.4, 0.4, 0.4);
nuclear@9 89
nuclear@9 90 float x = -dist;
nuclear@9 91 for(int i=0; i<=num_lines; i++) {
nuclear@9 92 if(i != num_lines / 2) {
nuclear@9 93 m3d_vertex(-dist, 0, x);
nuclear@9 94 m3d_vertex(dist, 0, x);
nuclear@9 95 m3d_vertex(x, 0, -dist);
nuclear@9 96 m3d_vertex(x, 0, dist);
nuclear@9 97 }
nuclear@9 98 x += spacing;
nuclear@9 99 }
nuclear@9 100 m3d_end();
nuclear@9 101
nuclear@9 102 m3d_begin(M3D_LINES);
nuclear@9 103 m3d_color(1.0, 0, 0);
nuclear@9 104 m3d_vertex(-dist, 0, 0);
nuclear@9 105 m3d_vertex(dist, 0, 0);
nuclear@9 106 m3d_color(0, 1.0, 0);
nuclear@9 107 m3d_vertex(0, 0, -dist);
nuclear@9 108 m3d_vertex(0, 0, dist);
nuclear@9 109 m3d_end();
nuclear@9 110 }
nuclear@9 111
nuclear@9 112
nuclear@9 113 void Modeller::handle_keyboard(int key, bool press)
nuclear@9 114 {
nuclear@9 115 if(press) {
nuclear@9 116 switch(key) {
nuclear@12 117 case 'q':
nuclear@12 118 quit_app();
nuclear@12 119 break;
nuclear@12 120
nuclear@9 121 case 27:
nuclear@12 122 scene->clear_selection();
nuclear@12 123 break;
nuclear@12 124
nuclear@12 125 case '\t':
nuclear@12 126 {
nuclear@12 127 int s = scene->get_selection();
nuclear@12 128 if(s >= 0) {
nuclear@12 129 s = (s + 1) % scene->get_node_count();
nuclear@12 130 scene->clear_selection();
nuclear@12 131 } else {
nuclear@12 132 s = 0;
nuclear@12 133 }
nuclear@12 134 scene->select(s);
nuclear@12 135 }
nuclear@9 136 break;
nuclear@9 137
nuclear@9 138 default:
nuclear@9 139 break;
nuclear@9 140 }
nuclear@9 141 }
nuclear@9 142 }
nuclear@9 143
nuclear@9 144 void Modeller::handle_mbutton(int bn, bool press, int x, int y)
nuclear@9 145 {
nuclear@9 146 mod->bnstate[bn] = press;
nuclear@9 147 mod->prev_x = x;
nuclear@9 148 mod->prev_y = y;
nuclear@9 149 }
nuclear@9 150
nuclear@9 151 void Modeller::handle_mmotion(int x, int y)
nuclear@9 152 {
nuclear@9 153 int dx = x - mod->prev_x;
nuclear@9 154 int dy = y - mod->prev_y;
nuclear@9 155 mod->prev_x = x;
nuclear@9 156 mod->prev_y = y;
nuclear@9 157
nuclear@12 158 if(kb_isdown(KB_ALT) || kb_isdown(KB_CTRL)) {
nuclear@12 159 if(mod->bnstate[0]) {
nuclear@12 160 mod->cam_theta += dx * 0.5;
nuclear@12 161 mod->cam_phi += dy * 0.5;
nuclear@9 162
nuclear@12 163 if(mod->cam_phi < -90) mod->cam_phi = -90;
nuclear@12 164 if(mod->cam_phi > 90) mod->cam_phi = 90;
nuclear@12 165 }
nuclear@12 166 if(mod->bnstate[1]) {
nuclear@12 167 mod->cam_dist += dy * 0.1;
nuclear@12 168 if(mod->cam_dist < 0) mod->cam_dist = 0;
nuclear@12 169 }
nuclear@9 170 }
nuclear@9 171 }