gpmark

view src/engine3d.cpp @ 0:5019d031b485

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 05 Jun 2013 22:33:37 +0300
parents
children
line source
1 #include <math.h>
2 #include <stdio.h>
4 #include "engine3d.h"
5 #include "generate3d.h"
6 #include "render3d.h"
7 #include "main.h"
9 point3d fpts[MAXDATA];
10 point3d norms[MAXDATA];
11 point3d pt_norms[MAXDATA];
12 point2d spts[MAXDATA];
13 point3d spls[MAXDATA];
15 unsigned short swp[MAXDATA];
17 int lightcalc = LIGHTVIEW;
19 #define fp_mul 256
20 #define fp_shr 8
21 #define proj_shr 8
24 vector3d CrossProduct(vector3d v1, vector3d v2)
25 {
26 vector3d v;
27 v.x=v1.y*v2.z-v1.z*v2.y;
28 v.y=v1.z*v2.x-v1.x*v2.z;
29 v.z=v1.x*v2.y-v1.y*v2.x;
30 return v;
31 }
34 int DotProduct(vector3d v1, vector3d v2)
35 {
36 return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
37 }
40 vector3d Normalize(vector3d v)
41 {
42 int d=(int)(sqrt(v.x*v.x+v.y*v.y+v.z*v.z));
43 if (d!=0)
44 {
45 v.x=(v.x<<fp_shr)/d;
46 v.y=(v.y<<fp_shr)/d;
47 v.z=(v.z<<fp_shr)/d;
48 }
49 else
50 {
51 v.x = 0;
52 v.y = 0;
53 v.z = 0;
54 }
55 return v;
56 }
59 vector3d NegVec(vector3d v)
60 {
61 v.x=-v.x;
62 v.y=-v.y;
63 v.z=-v.z;
64 return v;
65 }
68 void translate3d (object3d *obj)
69 {
70 int i;
71 int objposx = (int)(obj->pos.x * fp_mul);
72 int objposy = (int)(obj->pos.y * fp_mul);
73 int objposz = (int)(obj->pos.z * fp_mul);
75 for (i=0; i<obj->npts; i++)
76 {
77 fpts[i].x += objposx;
78 fpts[i].y += objposy;
79 fpts[i].z += objposz;
80 }
81 }
83 void rotate3d (object3d *obj)
84 {
85 float cosxr = cos(obj->rot.x); float cosyr = cos(obj->rot.y); float coszr = cos(obj->rot.z);
86 float sinxr = sin(obj->rot.x); float sinyr = sin(obj->rot.y); float sinzr = sin(obj->rot.z);
88 int xvx = (int)((cosyr * coszr) * fp_mul); int xvy = (int)((sinxr * sinyr * coszr - cosxr * sinzr) * fp_mul); int xvz = (int)((cosxr * sinyr * coszr + sinxr * sinzr) * fp_mul);
89 int yvx = (int)((cosyr * sinzr) * fp_mul); int yvy = (int)((cosxr * coszr + sinxr * sinyr * sinzr) * fp_mul); int yvz = (int)((-sinxr * coszr + cosxr * sinyr * sinzr) * fp_mul);
90 int zvx = (int)((-sinyr) * fp_mul); int zvy = (int)((sinxr * cosyr) * fp_mul); int zvz = (int)((cosxr * cosyr) * fp_mul);
92 int x, y, z;
93 int i;
94 for (i=0; i<obj->npts; i++)
95 {
96 x = obj->point[i].x;
97 y = obj->point[i].y;
98 z = obj->point[i].z;
99 fpts[i].x = x * xvx + y * xvy + z * xvz;
100 fpts[i].y = x * yvx + y * yvy + z * yvz;
101 fpts[i].z = x * zvx + y * zvy + z * zvz;
102 }
103 }
106 void rotate3d_normals (object3d *obj)
107 {
108 float cosxr = cos(obj->rot.x); float cosyr = cos(obj->rot.y); float coszr = cos(obj->rot.z);
109 float sinxr = sin(obj->rot.x); float sinyr = sin(obj->rot.y); float sinzr = sin(obj->rot.z);
111 int xvx = (int)((cosyr * coszr) * fp_mul); int xvy = (int)((sinxr * sinyr * coszr - cosxr * sinzr) * fp_mul); int xvz = (int)((cosxr * sinyr * coszr + sinxr * sinzr) * fp_mul);
112 int yvx = (int)((cosyr * sinzr) * fp_mul); int yvy = (int)((cosxr * coszr + sinxr * sinyr * sinzr) * fp_mul); int yvz = (int)((-sinxr * coszr + cosxr * sinyr * sinzr) * fp_mul);
113 int zvx = (int)((-sinyr) * fp_mul); int zvy = (int)((sinxr * cosyr) * fp_mul); int zvz = (int)((cosxr * cosyr) * fp_mul);
115 int x, y, z;
116 int i;
117 for (i=0; i<obj->npls; i++)
118 {
119 x = obj->normal[i].x;
120 y = obj->normal[i].y;
121 z = obj->normal[i].z;
122 norms[i].x = x * xvx + y * xvy + z * xvz;
123 norms[i].y = x * yvx + y * yvy + z * yvz;
124 norms[i].z = x * zvx + y * zvy + z * zvz;
125 }
126 }
129 void rotate3d_pt_normals (object3d *obj)
130 {
131 float cosxr = cos(obj->rot.x); float cosyr = cos(obj->rot.y); float coszr = cos(obj->rot.z);
132 float sinxr = sin(obj->rot.x); float sinyr = sin(obj->rot.y); float sinzr = sin(obj->rot.z);
134 int xvx = (int)((cosyr * coszr) * fp_mul); int xvy = (int)((sinxr * sinyr * coszr - cosxr * sinzr) * fp_mul); int xvz = (int)((cosxr * sinyr * coszr + sinxr * sinzr) * fp_mul);
135 int yvx = (int)((cosyr * sinzr) * fp_mul); int yvy = (int)((cosxr * coszr + sinxr * sinyr * sinzr) * fp_mul); int yvz = (int)((-sinxr * coszr + cosxr * sinyr * sinzr) * fp_mul);
136 int zvx = (int)((-sinyr) * fp_mul); int zvy = (int)((sinxr * cosyr) * fp_mul); int zvz = (int)((cosxr * cosyr) * fp_mul);
138 int x, y, z;
139 int i;
140 for (i=0; i<obj->npts; i++)
141 {
142 x = obj->pt_normal[i].x;
143 y = obj->pt_normal[i].y;
144 z = obj->pt_normal[i].z;
145 pt_norms[i].x = x * xvx + y * xvy + z * xvz;
146 pt_norms[i].y = x * yvx + y * yvy + z * yvz;
147 pt_norms[i].z = x * zvx + y * zvy + z * zvz;
148 }
149 }
151 void project3d (object3d *obj)
152 {
153 int i;
154 int smul = 1;
156 for (i=0; i<obj->npts; i++)
157 if (fpts[i].z > 0)
158 {
159 spts[i].x = ((fpts[i].x << proj_shr) / (fpts[i].z/smul)) + (ScreenWidth>>1);
160 spts[i].y = ((fpts[i].y << proj_shr) / (fpts[i].z/smul)) + (ScreenHeight>>1);
161 }
162 }
164 void CalcPolyColorStatic(object3d *obj)
165 {
166 int i, c;
167 for (i=0; i<obj->npls; i++)
168 {
169 c = norms[i].z>>8;
170 if (c<0) c=0;
171 if (c>255) c=255;
172 spls[i].c = c;
173 }
174 }
176 void CalcPointColorStatic(object3d *obj)
177 {
178 int i, c;
179 for (i=0; i<obj->npts; i++)
180 {
181 c = pt_norms[i].z>>8;
182 if (c<0) c=0;
183 if (c>255) c=255;
184 spts[i].c = c;
185 }
186 }
188 void CalcPolyColorDynamic(object3d *obj)
189 {
190 vector3d light, v;
191 light.x = 0;
192 light.y = 0;
193 light.z = 256;
194 float c;
196 int i;
197 for (i=0; i<obj->npls; i++)
198 {
199 v.x = norms[i].x;
200 v.y = norms[i].y;
201 v.z = norms[i].z;
202 c = DotProduct(v,light);
203 spls[i].c = (int)c;
204 if (c<0) spls[i].c = 0;
205 if (spls[i].c>255) spls[i].c = 255;
206 }
207 }
209 void CalcPointColorDynamic(object3d *obj)
210 {
211 vector3d light, v;
212 light.x = 0;
213 light.y = 0;
214 light.z = 256;
215 float c;
217 int i;
218 for (i=0; i<obj->npts; i++)
219 {
220 v.x = pt_norms[i].x;
221 v.y = pt_norms[i].y;
222 v.z = pt_norms[i].z;
223 c = DotProduct(v,light);
224 if (c<0) c = 0;
225 if (c>255) c = 255;
226 spts[i].c = (int)c;
227 }
228 }
230 void CalcPointColor(object3d *obj)
231 {
232 if (lightcalc==LIGHTVIEW) CalcPointColorStatic(obj);
233 if (lightcalc==LIGHTMOVE) CalcPointColorDynamic(obj);
234 }
236 void CalcPolyColor(object3d *obj)
237 {
238 if (lightcalc==LIGHTVIEW) CalcPolyColorStatic(obj);
239 if (lightcalc==LIGHTMOVE) CalcPolyColorDynamic(obj);
240 }
242 void Calc3d(object3d *obj)
243 {
244 rotate3d(obj);
245 translate3d(obj);
246 project3d(obj);
247 }
249 void quicksort (int lo, int hi, int data[])
250 {
251 int m1 = lo;
252 int m2 = hi;
253 int temp0;
254 unsigned short temp1;
256 int mp = data[(lo + hi)>>1];
258 while (m1<=m2)
259 {
260 while (data[m1] < mp) m1++;
261 while (mp < data[m2]) m2--;
263 if (m1<=m2)
264 {
265 temp0 = data[m1]; data[m1] = data[m2]; data[m2] = temp0;
266 temp1 = swp[m1]; swp[m1] = swp[m2]; swp[m2] = temp1;
267 m1++;
268 m2--;
269 }
270 }
272 if (m2>lo) quicksort(lo, m2, data);
273 if (m1<hi) quicksort(m1, hi, data);
274 }