gpmark

annotate 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
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 }