gpmark

view src/generate3d.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>
3 #include <stdlib.h>
4 #include "engine3d.h"
5 #include "generate3d.h"
7 unsigned char addtimes[MAXDATA];
9 void CalcNorms(object3d *obj, int neg)
10 {
11 vector3d v1,v2;
13 obj->normal = (vector3d*)malloc(obj->npls * sizeof(vector3d));
15 int i;
16 for (i=0; i<obj->npls; i++)
17 {
18 v1.x = obj->point[obj->poly[i].p2].x - obj->point[obj->poly[i].p1].x;
19 v1.y = obj->point[obj->poly[i].p2].y - obj->point[obj->poly[i].p1].y;
20 v1.z = obj->point[obj->poly[i].p2].z - obj->point[obj->poly[i].p1].z;
22 v2.x = obj->point[obj->poly[i].p1].x - obj->point[obj->poly[i].p0].x;
23 v2.y = obj->point[obj->poly[i].p1].y - obj->point[obj->poly[i].p0].y;
24 v2.z = obj->point[obj->poly[i].p1].z - obj->point[obj->poly[i].p0].z;
26 obj->normal[i] = Normalize(CrossProduct(v1,v2));
27 if (neg==1) obj->normal[i] = NegVec(obj->normal[i]);
28 }
29 }
31 void CalcPtNorms(object3d *obj)
32 {
33 obj->pt_normal = (vector3d*)malloc(obj->npts * sizeof(vector3d));
35 int i;
36 for (i=0; i<MAXDATA; i++)
37 addtimes[i] = 0;
39 for (i=0; i<obj->npts; i++)
40 {
41 obj->pt_normal[i].x = 0;
42 obj->pt_normal[i].y = 0;
43 obj->pt_normal[i].z = 0;
44 }
46 for (i=0; i<obj->npls; i++)
47 {
48 obj->pt_normal[obj->poly[i].p0].x += obj->normal[i].x;
49 obj->pt_normal[obj->poly[i].p0].y += obj->normal[i].y;
50 obj->pt_normal[obj->poly[i].p0].z += obj->normal[i].z;
51 obj->pt_normal[obj->poly[i].p1].x += obj->normal[i].x;
52 obj->pt_normal[obj->poly[i].p1].y += obj->normal[i].y;
53 obj->pt_normal[obj->poly[i].p1].z += obj->normal[i].z;
54 obj->pt_normal[obj->poly[i].p2].x += obj->normal[i].x;
55 obj->pt_normal[obj->poly[i].p2].y += obj->normal[i].y;
56 obj->pt_normal[obj->poly[i].p2].z += obj->normal[i].z;
57 addtimes[obj->poly[i].p0]++;
58 addtimes[obj->poly[i].p1]++;
59 addtimes[obj->poly[i].p2]++;
60 }
62 for (i=0; i<obj->npts; i++)
63 {
64 if (addtimes[i]!=0)
65 {
66 obj->pt_normal[i].x /= addtimes[i];
67 obj->pt_normal[i].y /= addtimes[i];
68 obj->pt_normal[i].z /= addtimes[i];
69 obj->pt_normal[i] = Normalize(obj->pt_normal[i]);
70 }
71 }
72 }
74 void ReversePolygonOrder(object3d *obj)
75 {
76 int i, a, b, c;
77 for (i=0; i<obj->npls; i++)
78 {
79 a = obj->poly[i].p0;
80 b = obj->poly[i].p1;
81 c = obj->poly[i].p2;
82 obj->poly[i].p0 = c;
83 obj->poly[i].p1 = b;
84 obj->poly[i].p2 = a;
85 }
86 }
89 void Load32bit3doFile(char* filename, object3d *obj, int neg, float stdiv)
90 {
91 FILE *obj3d;
92 obj3d=fopen(filename,"rb");
94 obj->npts=fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24);
95 obj->nlns=fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24);
96 obj->npls=fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24);
98 obj->point = (point3d*)malloc(obj->npts * sizeof(point3d));
99 obj->line = (line2d*)malloc(obj->nlns * sizeof(line2d));
100 obj->poly = (poly2d*)malloc(obj->npls * sizeof(poly2d));
102 int i;
103 for (i=0; i<obj->npts; i++)
104 {
105 obj->point[i].x = (int)((fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24) - 65536)/stdiv);
106 obj->point[i].y = (int)((fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24) - 65536)/stdiv);
107 obj->point[i].z = (int)((fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24) - 65536)/stdiv);
108 obj->point[i].c = 0xFFFFFF;
109 }
111 for (i=0; i<obj->nlns; i++)
112 {
113 obj->line[i].p0 = fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24);
114 obj->line[i].p1 = fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24);
115 obj->line[i].c = 0xFFFFFF;
116 }
118 for (i=0; i<obj->npls; i++)
119 {
120 obj->poly[i].p0 = fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24);
121 obj->poly[i].p1 = fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24);
122 obj->poly[i].p2 = fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24);
123 }
125 fclose(obj3d);
127 CalcNorms(obj, neg);
128 CalcPtNorms(obj);
129 }