gpmark
diff 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 diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/generate3d.cpp Wed Jun 05 22:33:37 2013 +0300 1.3 @@ -0,0 +1,129 @@ 1.4 +#include <math.h> 1.5 +#include <stdio.h> 1.6 +#include <stdlib.h> 1.7 +#include "engine3d.h" 1.8 +#include "generate3d.h" 1.9 + 1.10 +unsigned char addtimes[MAXDATA]; 1.11 + 1.12 +void CalcNorms(object3d *obj, int neg) 1.13 +{ 1.14 + vector3d v1,v2; 1.15 + 1.16 + obj->normal = (vector3d*)malloc(obj->npls * sizeof(vector3d)); 1.17 + 1.18 + int i; 1.19 + for (i=0; i<obj->npls; i++) 1.20 + { 1.21 + v1.x = obj->point[obj->poly[i].p2].x - obj->point[obj->poly[i].p1].x; 1.22 + v1.y = obj->point[obj->poly[i].p2].y - obj->point[obj->poly[i].p1].y; 1.23 + v1.z = obj->point[obj->poly[i].p2].z - obj->point[obj->poly[i].p1].z; 1.24 + 1.25 + v2.x = obj->point[obj->poly[i].p1].x - obj->point[obj->poly[i].p0].x; 1.26 + v2.y = obj->point[obj->poly[i].p1].y - obj->point[obj->poly[i].p0].y; 1.27 + v2.z = obj->point[obj->poly[i].p1].z - obj->point[obj->poly[i].p0].z; 1.28 + 1.29 + obj->normal[i] = Normalize(CrossProduct(v1,v2)); 1.30 + if (neg==1) obj->normal[i] = NegVec(obj->normal[i]); 1.31 + } 1.32 +} 1.33 + 1.34 +void CalcPtNorms(object3d *obj) 1.35 +{ 1.36 + obj->pt_normal = (vector3d*)malloc(obj->npts * sizeof(vector3d)); 1.37 + 1.38 + int i; 1.39 + for (i=0; i<MAXDATA; i++) 1.40 + addtimes[i] = 0; 1.41 + 1.42 + for (i=0; i<obj->npts; i++) 1.43 + { 1.44 + obj->pt_normal[i].x = 0; 1.45 + obj->pt_normal[i].y = 0; 1.46 + obj->pt_normal[i].z = 0; 1.47 + } 1.48 + 1.49 + for (i=0; i<obj->npls; i++) 1.50 + { 1.51 + obj->pt_normal[obj->poly[i].p0].x += obj->normal[i].x; 1.52 + obj->pt_normal[obj->poly[i].p0].y += obj->normal[i].y; 1.53 + obj->pt_normal[obj->poly[i].p0].z += obj->normal[i].z; 1.54 + obj->pt_normal[obj->poly[i].p1].x += obj->normal[i].x; 1.55 + obj->pt_normal[obj->poly[i].p1].y += obj->normal[i].y; 1.56 + obj->pt_normal[obj->poly[i].p1].z += obj->normal[i].z; 1.57 + obj->pt_normal[obj->poly[i].p2].x += obj->normal[i].x; 1.58 + obj->pt_normal[obj->poly[i].p2].y += obj->normal[i].y; 1.59 + obj->pt_normal[obj->poly[i].p2].z += obj->normal[i].z; 1.60 + addtimes[obj->poly[i].p0]++; 1.61 + addtimes[obj->poly[i].p1]++; 1.62 + addtimes[obj->poly[i].p2]++; 1.63 + } 1.64 + 1.65 + for (i=0; i<obj->npts; i++) 1.66 + { 1.67 + if (addtimes[i]!=0) 1.68 + { 1.69 + obj->pt_normal[i].x /= addtimes[i]; 1.70 + obj->pt_normal[i].y /= addtimes[i]; 1.71 + obj->pt_normal[i].z /= addtimes[i]; 1.72 + obj->pt_normal[i] = Normalize(obj->pt_normal[i]); 1.73 + } 1.74 + } 1.75 +} 1.76 + 1.77 +void ReversePolygonOrder(object3d *obj) 1.78 +{ 1.79 + int i, a, b, c; 1.80 + for (i=0; i<obj->npls; i++) 1.81 + { 1.82 + a = obj->poly[i].p0; 1.83 + b = obj->poly[i].p1; 1.84 + c = obj->poly[i].p2; 1.85 + obj->poly[i].p0 = c; 1.86 + obj->poly[i].p1 = b; 1.87 + obj->poly[i].p2 = a; 1.88 + } 1.89 +} 1.90 + 1.91 + 1.92 +void Load32bit3doFile(char* filename, object3d *obj, int neg, float stdiv) 1.93 +{ 1.94 + FILE *obj3d; 1.95 + obj3d=fopen(filename,"rb"); 1.96 + 1.97 + obj->npts=fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24); 1.98 + obj->nlns=fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24); 1.99 + obj->npls=fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24); 1.100 + 1.101 + obj->point = (point3d*)malloc(obj->npts * sizeof(point3d)); 1.102 + obj->line = (line2d*)malloc(obj->nlns * sizeof(line2d)); 1.103 + obj->poly = (poly2d*)malloc(obj->npls * sizeof(poly2d)); 1.104 + 1.105 + int i; 1.106 + for (i=0; i<obj->npts; i++) 1.107 + { 1.108 + obj->point[i].x = (int)((fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24) - 65536)/stdiv); 1.109 + obj->point[i].y = (int)((fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24) - 65536)/stdiv); 1.110 + obj->point[i].z = (int)((fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24) - 65536)/stdiv); 1.111 + obj->point[i].c = 0xFFFFFF; 1.112 + } 1.113 + 1.114 + for (i=0; i<obj->nlns; i++) 1.115 + { 1.116 + obj->line[i].p0 = fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24); 1.117 + obj->line[i].p1 = fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24); 1.118 + obj->line[i].c = 0xFFFFFF; 1.119 + } 1.120 + 1.121 + for (i=0; i<obj->npls; i++) 1.122 + { 1.123 + obj->poly[i].p0 = fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24); 1.124 + obj->poly[i].p1 = fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24); 1.125 + obj->poly[i].p2 = fgetc(obj3d)+(fgetc(obj3d)<<8)+(fgetc(obj3d)<<16)+(fgetc(obj3d)<<24); 1.126 + } 1.127 + 1.128 + fclose(obj3d); 1.129 + 1.130 + CalcNorms(obj, neg); 1.131 + CalcPtNorms(obj); 1.132 +}