diff options
Diffstat (limited to 'src/Decals.cpp')
-rw-r--r-- | src/Decals.cpp | 469 |
1 files changed, 126 insertions, 343 deletions
diff --git a/src/Decals.cpp b/src/Decals.cpp index eb2a90b..510a557 100644 --- a/src/Decals.cpp +++ b/src/Decals.cpp @@ -1,363 +1,146 @@ +#include <algorithm> #include <cmath> -#include "Camera.h" -#include "Constants.h" #include "Decals.h" -#include "misc.h" -extern float multiplier; -extern bool slomo; -extern bool blood; -extern float fogcolorr; -extern float fogcolorg; -extern float fogcolorb; -//Functions -extern float sinefluct; -extern int environment; -extern Model gunmodels[10]; -extern Camera camera; -extern float precipitationhorz; -extern float precipitationvert; -extern float precipitationdensity; -extern float snowdelay; +#define NORMAL_OFFSET 0.02f -int Decals::MakeDecal(int atype, XYZ location, float size, XYZ normal, int poly, Model *model, XYZ move, float rotation){ - int major=0; - float normalv[3]; - XYZ right; - XYZ up; - XYZ nothing; - XYZ axis[3]; - XYZ temp; - - nothing = {}; - - axis[0].x=1; - axis[1].y=1; - axis[2].z=1; - - normalv[0]=abs(normal.x); - normalv[1]=abs(normal.y); - normalv[2]=abs(normal.z); - - if(normalv[1]>normalv[major])major=1; - if(normalv[2]>normalv[major])major=2; +enum corner { SW, SE, NE, NW }; - if (normalv[0] == 1 || normalv[1] == 1 || normalv[2] == 1) { - if ((major == 0 && normal.x > 0) || major == 1) - right = {0.0f, 0.0f, -1.0f}; - else if (major == 0) - right = {0.0f, 0.0f, 1.0f}; - else if (major == 0) - right = {normal.z, 0.0f, 0.0f}; - } else { - right = crossProduct(axis[major], normal); +void bind(struct Decals *d, XYZ location, float size, XYZ normal, + int poly, Model *model, XYZ move, float rotation, + XYZ right, XYZ up, enum corner direction) +{ + float x, y; + switch (direction) { + case SW: + x = -1.0f; + y = -1.0f; + break; + case NW: + x = 1.0f; + y = -1.0f; + break; + case NE: + x = 1.0f; + y = 1.0f; + break; + case SE: + x = -1.0f; + y = 1.0f; + break; } - up = normalize(crossProduct(normal, right)); - right = normalize(right); + size_t i = d->len * 8 + d->numpoints[d->len]; + d->points[i] = location + right * x + up * y; + d->texcoordsx[i] = x * 0.5f + 0.5f; + d->texcoordsy[i] = y * 0.5f + 0.5f; - float count; - float count2; - float countinc=1/size; - if(countinc<.01)countinc=.01; - if(countinc>.2)countinc=.2; - float normaloffset=.02; - int good; - - numpoints[howmanydecals]=0; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing - right - up) * (size/3) /*+ normal/100*/; - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = 0; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = 0; - if((move.x==0&&move.z==0&&rotation==0)|| - LineFacetd(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25, model->vertex[model->Triangles[poly].vertex[0]], model->vertex[model->Triangles[poly].vertex[1]], model->vertex[model->Triangles[poly].vertex[2]],normal,&temp) - )numpoints[howmanydecals]++; - else { - good=-1; - count=1-countinc; - while(good==-1&&count>-1){ - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = 0; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = .5-count/2; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing - right - up*count) * (size/3); - count-=countinc; - good=model->LineCheck2(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25,&temp,move,rotation); - } - if(good!=-1)numpoints[howmanydecals]++; - good=-1; - count=1-countinc; - while(good==-1&&count>-1){ - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = .5-count/2; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = 0; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing - right*count - up) * (size/3); - count-=countinc; - good=model->LineCheck2(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25,&temp,move,rotation); - } - if(good!=-1)numpoints[howmanydecals]++; - if(good==-1){ - good=-1; - count2=1-countinc; - while(good==-1&&count2>-1){ - count=1-countinc; - while(good==-1&&count>-1){ - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = .5-count2/2; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = .5-count/2; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing - right*count2 - up*count) * (size/3); - count-=countinc; - good=model->LineCheck2(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25,&temp,move,rotation); - } - count2-=countinc; - } - if(good!=-1)numpoints[howmanydecals]++; - } - } - - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing + right - up) * (size/3) /*+ normal/100*/; - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = 1; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = 0; - if((move.x==0&&move.y==0&&move.z==0&&rotation==0)|| - LineFacetd(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25, model->vertex[model->Triangles[poly].vertex[0]], model->vertex[model->Triangles[poly].vertex[1]], model->vertex[model->Triangles[poly].vertex[2]],normal,&temp) - )numpoints[howmanydecals]++; - else { - good=-1; - count=1-countinc; - while(good==-1&&count>-1){ - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = .5+count/2; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = 0; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing + right*count - up) * (size/3); - count-=countinc; - good=model->LineCheck2(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25,&temp,move,rotation); - } - if(good!=-1)numpoints[howmanydecals]++; - good=-1; - count=1-countinc; - while(good==-1&&count>-1){ - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = 1; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = .5-count/2; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing + right - up*count) * (size/3); - count-=countinc; - good=model->LineCheck2(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25,&temp,move,rotation); - } - if(good!=-1)numpoints[howmanydecals]++; - if(good==-1){ - good=-1; - count2=1-countinc; - while(good==-1&&count2>-1){ - count=1-countinc; - while(good==-1&&count>-1){ - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = .5+count2/2; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = .5-count/2; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing + right*count2 - up*count) * (size/3); - count-=countinc; - good=model->LineCheck2(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25,&temp,move,rotation); - } - count2-=countinc; - } - if(good!=-1)numpoints[howmanydecals]++; - } - } - - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing + right + up) * (size/3) /*+ normal/100*/; - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = 1; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = 1; - if((move.x==0&&move.y==0&&move.z==0&&rotation==0)|| - LineFacetd(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25, model->vertex[model->Triangles[poly].vertex[0]], model->vertex[model->Triangles[poly].vertex[1]], model->vertex[model->Triangles[poly].vertex[2]],normal,&temp) - )numpoints[howmanydecals]++; - else { - good=-1; - count=1-countinc; - while(good==-1&&count>-1){ - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = 1; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = .5+count/2; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing + right + up*count) * (size/3); - count-=countinc; - good=model->LineCheck2(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25,&temp,move,rotation); - } - if(good!=-1)numpoints[howmanydecals]++; - good=-1; - count=1-countinc; - while(good==-1&&count>-1){ - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = .5+count/2; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = 1; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing + right*count + up) * (size/3); - count-=countinc; - good=model->LineCheck2(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25,&temp,move,rotation); - } - if(good!=-1)numpoints[howmanydecals]++; - if(good==-1){ - good=-1; - count2=1-countinc; - while(good==-1&&count2>-1){ - count=1-countinc; - while(good==-1&&count>-1){ - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = .5+count2/2; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = .5+count/2; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing + right*count2 + up*count) * (size/3); - count-=countinc; - good=model->LineCheck2(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25,&temp,move,rotation); - } - count2-=countinc; - } - if(good!=-1)numpoints[howmanydecals]++; - } - } - - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing - right + up) * (size/3) /*+ normal/100*/; - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = 0; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = 1; - if((move.x==0&&move.y==0&&move.z==0&&rotation==0)|| - LineFacetd(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25, model->vertex[model->Triangles[poly].vertex[0]], model->vertex[model->Triangles[poly].vertex[1]], model->vertex[model->Triangles[poly].vertex[2]],normal,&temp) - )numpoints[howmanydecals]++; - else { - good=-1; - count=1-countinc; - while(good==-1&&count>-1){ - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = .5-count/2; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = 1; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing - right*count + up) * (size/3); - count-=countinc; - good=model->LineCheck2(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25,&temp,move,rotation); - } - if(good!=-1)numpoints[howmanydecals]++; - good=-1; - count=1-countinc; - while(good==-1&&count>-1){ - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = 0; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = .5+count/2; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing - right + up*count) * (size/3); - count-=countinc; - good=model->LineCheck2(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25,&temp,move,rotation); - } - if(good!=-1)numpoints[howmanydecals]++; - if(good==-1){ - good=-1; - count2=1-countinc; - while(good==-1&&count2>-1){ - count=1-countinc; - while(good==-1&&count>-1){ - texcoordsx[howmanydecals*8+numpoints[howmanydecals]] = .5-count2/2; - texcoordsy[howmanydecals*8+numpoints[howmanydecals]] = .5+count/2; - points[howmanydecals*8+numpoints[howmanydecals]] = location + (nothing - right*count2 + up*count) * (size/3); - count-=countinc; - good=model->LineCheck2(points[howmanydecals*8+numpoints[howmanydecals]]+normal/25,points[howmanydecals*8+numpoints[howmanydecals]]-normal/25,&temp,move,rotation); - } - count2-=countinc; - } - if(good!=-1)numpoints[howmanydecals]++; - } - } - for(int i=0;i<numpoints[howmanydecals];i++){ - points[howmanydecals*8+i] += normal*normaloffset; - } - - type[howmanydecals]=atype; - alivetime[howmanydecals]=0; - if(howmanydecals<maxdecals){howmanydecals++;} - - return 0; -} - -int Decals::DeleteDecal(int which){ - if(which>=0){ - numpoints[which]=numpoints[howmanydecals-1]; - alivetime[which]=alivetime[howmanydecals-1]; - type[which]=type[howmanydecals-1]; - for(int i=0;i<numpoints[which];i++){ - points[which*8+i] = points[howmanydecals*8-8+i]; - texcoordsx[which*8+i] = texcoordsx[howmanydecals*8-8+i]; - texcoordsy[which*8+i] = texcoordsy[howmanydecals*8-8+i]; - } - if(howmanydecals>0){howmanydecals--;} + XYZ temp; + if ((move.x == 0 && move.y == 0 && move.z == 0 && rotation == 0) + || segCrossTrigon(d->points[i] + normal / 25, + d->points[i] - normal / 25, + model->vertex + model->Triangles[poly].vertex[0], + model->vertex + model->Triangles[poly].vertex[1], + model->vertex + model->Triangles[poly].vertex[2], + &normal, &temp)) { + d->numpoints[d->len]++; + return; } - return 0; -} - -void Decals::DoStuff() -{ - for(int i=0;i<howmanydecals;i++){ - alivetime[i]+=multiplier; - if(alivetime[i]>10&&(type[i]==bullethole||type[i]==crater))DeleteDecal(i); - if(alivetime[i]>20&&(type[i]==bloodpool))DeleteDecal(i); + const auto n = normal / 25.0f; + const float countinc = std::max(0.01f, std::min(1.0f / size, 0.2f)); + int good = -1; + float count = 1.0f - countinc; + while (good == -1 && count > -1.0f) { + d->texcoordsx[i] = x * 0.5f + 0.5f; + d->texcoordsy[i] = y * count * 0.5f + 0.5f; + d->points[i] = location + right * x + up * (y * count); + count -= countinc; + good = model->LineCheck2(d->points[i] + n, + d->points[i] - n, + &temp, move, rotation); + } + if (good > -1) { + d->numpoints[d->len]++; + i++; } -} - -void Decals::draw() -{ - glAlphaFunc(GL_GREATER, 0.01); - - float bloodpoolspeed=1; - - glDepthFunc(GL_LEQUAL); - glEnable(GL_BLEND); - glEnable(GL_CULL_FACE); - glEnable(GL_TEXTURE_2D); - glEnable(GL_LIGHTING); - glDepthMask(0); - glAlphaFunc(GL_GREATER, 0.01); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP ); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_POLYGON_OFFSET_FILL); - for(int i=0;i<howmanydecals;i++){ - if(type[i]==bullethole)glBindTexture(GL_TEXTURE_2D, bulletholetextureptr); - if(type[i]==crater)glBindTexture(GL_TEXTURE_2D, cratertextureptr); - if(type[i]!=bloodpool)glColor4f(1,1,1,10-alivetime[i]); - - if(type[i]==bloodpool&&alivetime[i]<bloodpoolspeed*.2)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[0]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*.2&&alivetime[i]<bloodpoolspeed*.4)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[1]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*.4&&alivetime[i]<bloodpoolspeed*.6)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[2]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*.6&&alivetime[i]<bloodpoolspeed*.8)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[3]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*.8&&alivetime[i]<bloodpoolspeed*1)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[4]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*1&&alivetime[i]<bloodpoolspeed*1.2)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[5]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*1.2&&alivetime[i]<bloodpoolspeed*1.4)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[6]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*1.4&&alivetime[i]<bloodpoolspeed*1.6)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[7]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*1.6&&alivetime[i]<bloodpoolspeed*1.8)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[8]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*1.8&&alivetime[i]<bloodpoolspeed*2.0)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[9]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*2.0)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[10]); - if(type[i]==bloodpool&&alivetime[i]<bloodpoolspeed*2.0)glColor4f(1,1,1,1.5-(alivetime[i]*5/bloodpoolspeed-(int)(alivetime[i]*5/bloodpoolspeed))); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*2.0)glColor4f(1,1,1,20-alivetime[i]); - - glPushMatrix(); - glBegin(GL_TRIANGLE_FAN); - for(int j=0;j<numpoints[i];j++){ - glTexCoord2f(texcoordsx[i*8+j], texcoordsy[i*8+j]); glVertex3f(points[i*8+j].x,points[i*8+j].y,points[i*8+j].z); - } - glEnd(); - glPopMatrix(); - if(type[i]==bloodpool&&alivetime[i]<bloodpoolspeed*2.0){ - if(type[i]==bloodpool&&alivetime[i]<bloodpoolspeed*.2)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[1]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*.2&&alivetime[i]<bloodpoolspeed*.4)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[2]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*.4&&alivetime[i]<bloodpoolspeed*.6)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[3]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*.6&&alivetime[i]<bloodpoolspeed*.8)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[4]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*.8&&alivetime[i]<bloodpoolspeed*1)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[5]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*1&&alivetime[i]<bloodpoolspeed*1.2)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[6]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*1.2&&alivetime[i]<bloodpoolspeed*1.4)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[7]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*1.4&&alivetime[i]<bloodpoolspeed*1.6)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[8]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*1.6&&alivetime[i]<bloodpoolspeed*1.8)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[9]); - if(type[i]==bloodpool&&alivetime[i]>=bloodpoolspeed*1.8&&alivetime[i]<bloodpoolspeed*2.0)glBindTexture(GL_TEXTURE_2D, bloodtextureptr[10]); - if(type[i]==bloodpool)glColor4f(1,1,1,alivetime[i]*5/bloodpoolspeed-(int)(alivetime[i]*5/bloodpoolspeed)); + good = -1; + count = 1.0f - countinc; + while (good == -1 && count > -1.0f) { + d->texcoordsx[i] = x * count * 0.5f + 0.5f; + d->texcoordsy[i] = y * 0.5f + 0.5f; + d->points[i] = location + right * (x * count) + up * y; + count -= countinc; + good = model->LineCheck2(d->points[i] + n, + d->points[i] - n, + &temp, move, rotation); + } + if (good > -1) { + d->numpoints[d->len]++; + return; + } - glPushMatrix(); - glBegin(GL_TRIANGLE_FAN); - for(int j=0;j<numpoints[i];j++){ - glTexCoord2f(texcoordsx[i*8+j], texcoordsy[i*8+j]); glVertex3f(points[i*8+j].x,points[i*8+j].y,points[i*8+j].z); - } - glEnd(); - glPopMatrix(); + float count2 = 1.0f - countinc; + while (good == -1 && count2 > -1.0f){ + count = 1.0f - countinc; + while (good == -1 && count > -1.0f) { + d->texcoordsx[i] = x * count2 * 0.5f + 0.5f; + d->texcoordsy[i] = y * count * 0.5f + 0.5f; + d->points[i] = location + right * (x * count2) + up * (y * count); + count -= countinc; + good = model->LineCheck2(d->points[i] + n, + d->points[i] - n, + &temp, move, rotation); } + count2 -= countinc; } - glDepthMask(1); - glDisable(GL_TEXTURE_2D); - glColor4f(1,1,1,1); - glEnable(GL_CULL_FACE); - glDisable(GL_POLYGON_OFFSET_FILL); - glDepthFunc(GL_LEQUAL); + if (good > -1) + d->numpoints[d->len]++; } -Decals::~Decals() +void addDecal(struct Decals *d, enum decal kind, XYZ location, float size, + XYZ normal, int poly, Model *model, XYZ move, float rotation) { - const GLuint holes[] {bulletholetextureptr, cratertextureptr}; - glDeleteTextures(2, holes); - glDeleteTextures(11, bloodtextureptr); + if (d->len >= MAX_DECALS) + return; + d->kind[d->len] = kind; + d->alive[d->len] = 0; + + float normalv[] = {abs(normal.x), abs(normal.y), abs(normal.z)}; + unsigned char major = 0; + if (normalv[1] > normalv[major]) + major = 1; + if (normalv[2] > normalv[major]) + major = 2; + + XYZ right = {0.0f}; + if (normalv[0] == 1.0f || normalv[1] == 1.0f || normalv[2] == 1.0f) { + if ((major == 0 && normal.x > 0) || major == 1) + right.z = -1.0f; + else if (major == 0) + right.z = 1.0f; + else + right.x = normal.z; + } else { + XYZ axis = {0.0f}; + ((float *) &axis)[major] = 1.0f; + right = crossProduct(axis, normal); + } + + d->numpoints[d->len] = 0; + XYZ up = normalize(crossProduct(normal, right)) * (size / 3); + right = normalize(right) * (size / 3); + bind(d, location, size, normal, poly, model, + move, rotation, right, up, SW); + bind(d, location, size, normal, poly, model, + move, rotation, right, up, NW); + bind(d, location, size, normal, poly, model, + move, rotation, right, up, NE); + bind(d, location, size, normal, poly, model, + move, rotation, right, up, SE); + for (int i = 0; i < d->numpoints[d->len]; ++i) + d->points[d->len * 8 + i] += normal * NORMAL_OFFSET; + d->len++; } |