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