X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FModels.cpp;h=0b8105396bd4f00204e73440c319a0783707d65f;hb=2a9d19feea3589e45e3f6aa4e7b6052732b35f3f;hp=609d1b1a24b28f3e7d971ff7d5f56533ca76d56c;hpb=24004d6ab1e68faaf85ece11b566449997da5013;p=lugaru.git diff --git a/Source/Models.cpp b/Source/Models.cpp index 609d1b1..0b81053 100644 --- a/Source/Models.cpp +++ b/Source/Models.cpp @@ -3,20 +3,18 @@ Copyright (C) 2003, 2010 - Wolfire Games This file is part of Lugaru. -Lugaru is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. +Lugaru is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. -This program is distributed in the hope that it will be useful, +Lugaru is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +along with Lugaru. If not, see . */ #include "Game.h" @@ -42,10 +40,12 @@ int Model::LineCheck(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate) *p1 = *p1 - *move; *p2 = *p2 - *move; - if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0); - if (*rotate)*p2 = DoRotation(*p2, 0, -*rotate, 0); - if (!sphere_line_intersection(p1, p2, &boundingspherecenter, - &boundingsphereradius))return -1; + if (*rotate) + *p1 = DoRotation(*p1, 0, -*rotate, 0); + if (*rotate) + *p2 = DoRotation(*p2, 0, -*rotate, 0); + if (!sphere_line_intersection(p1, p2, &boundingspherecenter, &boundingsphereradius)) + return -1; firstintersecting = -1; for (j = 0; j < TriangleNum; j++) { @@ -58,45 +58,12 @@ int Model::LineCheck(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate) } } - if (*rotate)*p = DoRotation(*p, 0, *rotate, 0); + if (*rotate) + *p = DoRotation(*p, 0, *rotate, 0); *p = *p + *move; return firstintersecting; } -int Model::LineCheckSlide(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate) -{ - static int j; - static float distance; - static float olddistance; - static int intersecting; - static int firstintersecting; - static XYZ point; - - *p1 = *p1 - *move; - *p2 = *p2 - *move; - if (!sphere_line_intersection(p1, p2, &boundingspherecenter, - &boundingsphereradius))return -1; - firstintersecting = -1; - if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0); - if (*rotate)*p2 = DoRotation(*p2, 0, -*rotate, 0); - - for (j = 0; j < TriangleNum; j++) { - intersecting = LineFacetd(p1, p2, &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]], &facenormals[j], &point); - distance = (point.x - p1->x) * (point.x - p1->x) + (point.y - p1->y) * (point.y - p1->y) + (point.z - p1->z) * (point.z - p1->z); - if ((distance < olddistance || firstintersecting == -1) && intersecting) { - olddistance = distance; - firstintersecting = j; - } - } - - distance = abs((facenormals[firstintersecting].x * p2->x) + (facenormals[firstintersecting].y * p2->y) + (facenormals[firstintersecting].z * p2->z) - ((facenormals[firstintersecting].x * vertex[Triangles[firstintersecting].vertex[0]].x) + (facenormals[firstintersecting].y * vertex[Triangles[firstintersecting].vertex[0]].y) + (facenormals[firstintersecting].z * vertex[Triangles[firstintersecting].vertex[0]].z))); - *p2 -= facenormals[firstintersecting] * distance; - - if (*rotate)*p2 = DoRotation(*p2, 0, *rotate, 0); - *p2 = *p2 + *move; - return firstintersecting; -} - int Model::LineCheckPossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate) { static int j; @@ -108,11 +75,13 @@ int Model::LineCheckPossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate) *p1 = *p1 - *move; *p2 = *p2 - *move; - if (!sphere_line_intersection(p1, p2, &boundingspherecenter, - &boundingsphereradius))return -1; + if (!sphere_line_intersection(p1, p2, &boundingspherecenter, &boundingsphereradius)) + return -1; firstintersecting = -1; - if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0); - if (*rotate)*p2 = DoRotation(*p2, 0, -*rotate, 0); + if (*rotate) + *p1 = DoRotation(*p1, 0, -*rotate, 0); + if (*rotate) + *p2 = DoRotation(*p2, 0, -*rotate, 0); if (numpossible > 0 && numpossible < TriangleNum) for (j = 0; j < numpossible; j++) { @@ -127,7 +96,8 @@ int Model::LineCheckPossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate) } } - if (*rotate)*p = DoRotation(*p, 0, *rotate, 0); + if (*rotate) + *p = DoRotation(*p, 0, *rotate, 0); *p = *p + *move; return firstintersecting; } @@ -143,11 +113,13 @@ int Model::LineCheckSlidePossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *ro *p1 = *p1 - *move; *p2 = *p2 - *move; - if (!sphere_line_intersection(p1, p2, &boundingspherecenter, - &boundingsphereradius))return -1; + if (!sphere_line_intersection(p1, p2, &boundingspherecenter, &boundingsphereradius)) + return -1; firstintersecting = -1; - if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0); - if (*rotate)*p2 = DoRotation(*p2, 0, -*rotate, 0); + if (*rotate) + *p1 = DoRotation(*p1, 0, -*rotate, 0); + if (*rotate) + *p2 = DoRotation(*p2, 0, -*rotate, 0); if (numpossible) for (j = 0; j < numpossible; j++) { @@ -166,7 +138,8 @@ int Model::LineCheckSlidePossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *ro *p2 -= facenormals[firstintersecting] * distance; } - if (*rotate)*p2 = DoRotation(*p2, 0, *rotate, 0); + if (*rotate) + *p2 = DoRotation(*p2, 0, *rotate, 0); *p2 = *p2 + *move; return firstintersecting; } @@ -186,8 +159,10 @@ int Model::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate) oldp1 = *p1; *p1 = *p1 - *move; - if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0); - if (distsq(p1, &boundingspherecenter) > radius * radius + boundingsphereradius * boundingsphereradius)return -1; + if (*rotate) + *p1 = DoRotation(*p1, 0, -*rotate, 0); + if (distsq(p1, &boundingspherecenter) > radius * radius + boundingsphereradius * boundingsphereradius) + return -1; for (i = 0; i < 4; i++) { for (j = 0; j < TriangleNum; j++) { @@ -195,16 +170,14 @@ int Model::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate) distance = abs((facenormals[j].x * p1->x) + (facenormals[j].y * p1->y) + (facenormals[j].z * p1->z) - ((facenormals[j].x * vertex[Triangles[j].vertex[0]].x) + (facenormals[j].y * vertex[Triangles[j].vertex[0]].y) + (facenormals[j].z * vertex[Triangles[j].vertex[0]].z))); if (distance < radius) { point = *p1 - facenormals[j] * distance; - if (PointInTriangle( &point, facenormals[j], &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]]))intersecting = 1; - if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]], - &vertex[Triangles[j].vertex[1]], - p1, &radius); - if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[1]], - &vertex[Triangles[j].vertex[2]], - p1, &radius); - if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]], - &vertex[Triangles[j].vertex[2]], - p1, &radius); + if (PointInTriangle( &point, facenormals[j], &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]])) + intersecting = 1; + if (!intersecting) + intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], p1, &radius); + if (!intersecting) + intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]], p1, &radius); + if (!intersecting) + intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[2]], p1, &radius); if (intersecting) { *p1 += facenormals[j] * (distance - radius); /*start=*p1; @@ -222,16 +195,18 @@ int Model::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate) } } } - if (*rotate)*p = DoRotation(*p, 0, *rotate, 0); + if (*rotate) + *p = DoRotation(*p, 0, *rotate, 0); *p = *p + *move; - if (*rotate)*p1 = DoRotation(*p1, 0, *rotate, 0); + if (*rotate) + *p1 = DoRotation(*p1, 0, *rotate, 0); *p1 += *move; return firstintersecting; } int Model::SphereCheckPossible(XYZ *p1, float radius, XYZ *move, float *rotate) { - static int i, j; + static int j; static float distance; static float olddistance; static int intersecting; @@ -247,7 +222,8 @@ int Model::SphereCheckPossible(XYZ *p1, float radius, XYZ *move, float *rotate) numpossible = 0; - if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0); + if (*rotate) + *p1 = DoRotation(*p1, 0, -*rotate, 0); if (distsq(p1, &boundingspherecenter) > radius * radius + boundingsphereradius * boundingsphereradius) { *p1 = oldp1; return -1; @@ -258,16 +234,14 @@ int Model::SphereCheckPossible(XYZ *p1, float radius, XYZ *move, float *rotate) distance = abs((facenormals[j].x * p1->x) + (facenormals[j].y * p1->y) + (facenormals[j].z * p1->z) - ((facenormals[j].x * vertex[Triangles[j].vertex[0]].x) + (facenormals[j].y * vertex[Triangles[j].vertex[0]].y) + (facenormals[j].z * vertex[Triangles[j].vertex[0]].z))); if (distance < radius) { point = *p1 - facenormals[j] * distance; - if (PointInTriangle( &point, facenormals[j], &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]]))intersecting = 1; - if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]], - &vertex[Triangles[j].vertex[1]], - p1, &radius); - if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[1]], - &vertex[Triangles[j].vertex[2]], - p1, &radius); - if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]], - &vertex[Triangles[j].vertex[2]], - p1, &radius); + if (PointInTriangle( &point, facenormals[j], &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]])) + intersecting = 1; + if (!intersecting) + intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], p1, &radius); + if (!intersecting) + intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]], p1, &radius); + if (!intersecting) + intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[2]], p1, &radius); if (intersecting) { //if(j>=0&&j=0&&Triangles[i].vertex[1]>=0&&Triangles[i].vertex[2]>=0){ - if(isnormal(vertex[Triangles[i].vertex[0]].x)&&isnormal(vertex[Triangles[i].vertex[0]].y)&&isnormal(vertex[Triangles[i].vertex[0]].z) - &&isnormal(vertex[Triangles[i].vertex[1]].x)&&isnormal(vertex[Triangles[i].vertex[1]].y)&&isnormal(vertex[Triangles[i].vertex[1]].z) - &&isnormal(vertex[Triangles[i].vertex[2]].x)&&isnormal(vertex[Triangles[i].vertex[2]].y)&&isnormal(vertex[Triangles[i].vertex[2]].z)){ - */glTexCoord2f(Triangles[i].gx[0], Triangles[i].gy[0]); - if (color)glColor3f(normals[Triangles[i].vertex[0]].x, normals[Triangles[i].vertex[0]].y, normals[Triangles[i].vertex[0]].z); - if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[0]].x, normals[Triangles[i].vertex[0]].y, normals[Triangles[i].vertex[0]].z); - if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y); - glVertex3f(vertex[Triangles[i].vertex[0]].x, vertex[Triangles[i].vertex[0]].y, vertex[Triangles[i].vertex[0]].z); - - glTexCoord2f(Triangles[i].gx[1], Triangles[i].gy[1]); - if (color)glColor3f(normals[Triangles[i].vertex[1]].x, normals[Triangles[i].vertex[1]].y, normals[Triangles[i].vertex[1]].z); - if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[1]].x, normals[Triangles[i].vertex[1]].y, normals[Triangles[i].vertex[1]].z); - if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y); - glVertex3f(vertex[Triangles[i].vertex[1]].x, vertex[Triangles[i].vertex[1]].y, vertex[Triangles[i].vertex[1]].z); - - glTexCoord2f(Triangles[i].gx[2], Triangles[i].gy[2]); - if (color)glColor3f(normals[Triangles[i].vertex[2]].x, normals[Triangles[i].vertex[2]].y, normals[Triangles[i].vertex[2]].z); - if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[2]].x, normals[Triangles[i].vertex[2]].y, normals[Triangles[i].vertex[2]].z); - if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y); - glVertex3f(vertex[Triangles[i].vertex[2]].x, vertex[Triangles[i].vertex[2]].y, vertex[Triangles[i].vertex[2]].z); - //} - //} - } - glEnd(); } void Model::drawdecals(Texture shadowtexture, Texture bloodtexture, Texture bloodtexture2, Texture breaktexture) { if (decals) { - if (type != decalstype)return; - static int i, j; - static float distancemult; + if (type != decalstype) + return; + static int i; + //~ static float distancemult; static int lasttype; - static float viewdistsquared; + //~ static float viewdistsquared; static bool blend; - viewdistsquared = viewdistance * viewdistance; + //~ viewdistsquared = viewdistance * viewdistance; blend = 1; lasttype = -1; @@ -1075,9 +1044,11 @@ void Model::drawdecals(Texture shadowtexture, Texture bloodtexture, Texture bloo glDisable(GL_CULL_FACE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthMask(0); - if (numdecals > max_model_decals)numdecals = max_model_decals; + if (numdecals > max_model_decals) + numdecals = max_model_decals; for (i = 0; i < numdecals; i++) { - if (decaltype[i] == blooddecalfast && decalalivetime[i] < 2)decalalivetime[i] = 2; + if (decaltype[i] == blooddecalfast && decalalivetime[i] < 2) + decalalivetime[i] = 2; if (decaltype[i] == shadowdecal && decaltype[i] != lasttype) { shadowtexture.bind(); @@ -1116,18 +1087,21 @@ void Model::drawdecals(Texture shadowtexture, Texture bloodtexture, Texture bloo } if (decaltype[i] == breakdecal) { glColor4f(1, 1, 1, decalopacity[i]); - if (decalalivetime[i] > 58)glColor4f(1, 1, 1, decalopacity[i] * (60 - decalalivetime[i]) / 2); + if (decalalivetime[i] > 58) + glColor4f(1, 1, 1, decalopacity[i] * (60 - decalalivetime[i]) / 2); } if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalfast || decaltype[i] == blooddecalslow)) { glColor4f(1, 1, 1, decalopacity[i]); - if (decalalivetime[i] < 4)glColor4f(1, 1, 1, decalopacity[i]*decalalivetime[i]*.25); - if (decalalivetime[i] > 58)glColor4f(1, 1, 1, decalopacity[i] * (60 - decalalivetime[i]) / 2); + if (decalalivetime[i] < 4) + glColor4f(1, 1, 1, decalopacity[i]*decalalivetime[i]*.25); + if (decalalivetime[i] > 58) + glColor4f(1, 1, 1, decalopacity[i] * (60 - decalalivetime[i]) / 2); } lasttype = decaltype[i]; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glBegin(GL_TRIANGLES); for (int j = 0; j < 3; j++) { @@ -1139,10 +1113,14 @@ void Model::drawdecals(Texture shadowtexture, Texture bloodtexture, Texture bloo } for (i = numdecals - 1; i >= 0; i--) { decalalivetime[i] += multiplier; - if (decaltype[i] == blooddecalslow)decalalivetime[i] -= multiplier * 2 / 3; - if (decaltype[i] == blooddecalfast)decalalivetime[i] += multiplier * 4; - if (decaltype[i] == shadowdecal)DeleteDecal(i); - if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalfast || decaltype[i] == blooddecalslow) && decalalivetime[i] >= 60)DeleteDecal(i); + if (decaltype[i] == blooddecalslow) + decalalivetime[i] -= multiplier * 2 / 3; + if (decaltype[i] == blooddecalfast) + decalalivetime[i] += multiplier * 4; + if (decaltype[i] == shadowdecal) + DeleteDecal(i); + if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalfast || decaltype[i] == blooddecalslow) && decalalivetime[i] >= 60) + DeleteDecal(i); } glAlphaFunc(GL_GREATER, 0.0001); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -1152,7 +1130,8 @@ void Model::drawdecals(Texture shadowtexture, Texture bloodtexture, Texture bloo void Model::DeleteDecal(int which) { if (decals) { - if (type != decalstype)return; + if (type != decalstype) + return; decaltype[which] = decaltype[numdecals - 1]; decalposition[which] = decalposition[numdecals - 1]; for (int i = 0; i < 3; i++) { @@ -1170,7 +1149,8 @@ void Model::DeleteDecal(int which) void Model::MakeDecal(int atype, XYZ *where, float *size, float *opacity, float *rotation) { if (decals) { - if (type != decalstype)return; + if (type != decalstype) + return; static float placex, placez; static XYZ rot; @@ -1236,7 +1216,8 @@ void Model::MakeDecal(int atype, XYZ *where, float *size, float *opacity, float decaltexcoords[numdecals][j][1] = rot.z + .5; } } - if (numdecals < max_model_decals - 1)numdecals++; + if (numdecals < max_model_decals - 1) + numdecals++; } } } @@ -1247,7 +1228,8 @@ void Model::MakeDecal(int atype, XYZ *where, float *size, float *opacity, float void Model::MakeDecal(int atype, XYZ where, float size, float opacity, float rotation) { if (decals) { - if (type != decalstype)return; + if (type != decalstype) + return; static float placex, placez; static XYZ rot; @@ -1313,7 +1295,8 @@ void Model::MakeDecal(int atype, XYZ where, float size, float opacity, float rot decaltexcoords[numdecals][j][1] = rot.z + .5; } } - if (numdecals < max_model_decals - 1)numdecals++; + if (numdecals < max_model_decals - 1) + numdecals++; } } } else if (distance < .02 && abs(facenormals[i].x) > abs(facenormals[i].y) && abs(facenormals[i].x) > abs(facenormals[i].z)) { @@ -1370,7 +1353,8 @@ void Model::MakeDecal(int atype, XYZ where, float size, float opacity, float rot decaltexcoords[numdecals][j][1] = rot.z + .5; } } - if (numdecals < max_model_decals - 1)numdecals++; + if (numdecals < max_model_decals - 1) + numdecals++; } } } else if (distance < .02 && abs(facenormals[i].z) > abs(facenormals[i].y) && abs(facenormals[i].z) > abs(facenormals[i].x)) { @@ -1427,7 +1411,8 @@ void Model::MakeDecal(int atype, XYZ where, float size, float opacity, float rot decaltexcoords[numdecals][j][1] = rot.z + .5; } } - if (numdecals < max_model_decals - 1)numdecals++; + if (numdecals < max_model_decals - 1) + numdecals++; } } } @@ -1445,25 +1430,32 @@ void Model::deallocate() { int i = 0, j = 0; - if (owner)free(owner); + if (owner) + free(owner); owner = 0; - if (possible)free(possible); + if (possible) + free(possible); possible = 0; - if (vertex)free(vertex); + if (vertex) + free(vertex); vertex = 0; - if (normals)free(normals); + if (normals) + free(normals); normals = 0; - if (facenormals)free(facenormals); + if (facenormals) + free(facenormals); facenormals = 0; - if (Triangles)free(Triangles); + if (Triangles) + free(Triangles); Triangles = 0; - if (vArray)free(vArray); + if (vArray) + free(vArray); vArray = 0;