/*
Copyright (C) 2003, 2010 - Wolfire Games
+Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file)
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 <http://www.gnu.org/licenses/>.
*/
#include "Game.h"
#include "Models.h"
+#include "Utils/Folders.h"
extern float multiplier;
extern float viewdistance;
*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++) {
}
}
- 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;
*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++) {
}
}
- if (*rotate)*p = DoRotation(*p, 0, *rotate, 0);
+ if (*rotate)
+ *p = DoRotation(*p, 0, *rotate, 0);
*p = *p + *move;
return firstintersecting;
}
*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++) {
*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;
}
static int firstintersecting;
static XYZ point;
static XYZ oldp1;
- static XYZ start, end;
firstintersecting = -1;
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++) {
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;
- end=*p1;
- end.y-=radius;
- if(LineFacetd(&start,&end,&vertex[Triangles[j].vertex[0]],&vertex[Triangles[j].vertex[1]],&vertex[Triangles[j].vertex[2]],&facenormals[j],&point)){
- p1->y=point.y+radius;
- }*/
}
}
if ((distance < olddistance || firstintersecting == -1) && intersecting) {
}
}
}
- 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;
static int firstintersecting;
static XYZ point;
static XYZ oldp1;
- static XYZ start, end;
firstintersecting = -1;
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;
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<TriangleNum)
possible[numpossible] = j;
numpossible++;
}
firstintersecting = j;
}
}
- if (*rotate)*p1 = DoRotation(*p1, 0, *rotate, 0);
+ if (*rotate)
+ *p1 = DoRotation(*p1, 0, *rotate, 0);
*p1 += *move;
return firstintersecting;
}
void Model::UpdateVertexArray()
{
- if (type != normaltype && type != decalstype)return;
+ if (type != normaltype && type != decalstype)
+ return;
static int i;
static int j;
if (!flat)
void Model::UpdateVertexArrayNoTex()
{
- if (type != normaltype && type != decalstype)return;
+ if (type != normaltype && type != decalstype)
+ return;
static int i;
static int j;
if (!flat)
void Model::UpdateVertexArrayNoTexNoNorm()
{
- if (type != normaltype && type != decalstype)return;
+ if (type != normaltype && type != decalstype)
+ return;
static int i;
static int j;
for (i = 0; i < TriangleNum; i++) {
}
}
-bool Model::loadnotex(const char *filename )
+bool Model::loadnotex(const std::string& filename )
{
- FILE *tfile;
- long i;
-
- int oldvertexNum, oldTriangleNum;
- oldvertexNum = vertexNum;
- oldTriangleNum = TriangleNum;
+ FILE *tfile;
+ long i;
type = notextype;
color = 0;
- tfile = fopen( ConvertFileName(filename), "rb" );
+ tfile = Folders::openMandatoryFile( Folders::getResourcePath(filename), "rb" );
+
// read model settings
fseek(tfile, 0, SEEK_SET);
}
for (i = 0; i < TriangleNum; i++) {
- // funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
short vertex[ 6];
funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
Triangles[i].vertex[ 0] = vertex[ 0];
}
boundingsphereradius = fast_sqrt(boundingsphereradius);
- return 1;
+ return true;
}
-bool Model::load(const char *filename, bool texture )
+bool Model::load(const std::string& filename, bool texture )
{
- FILE *tfile;
- long i;
+ FILE *tfile;
+ long i;
LOGFUNC;
if (visibleloading)
Game::LoadingScreen();
- int oldvertexNum, oldTriangleNum;
- oldvertexNum = vertexNum;
- oldTriangleNum = TriangleNum;
-
type = normaltype;
color = 0;
- tfile = fopen( ConvertFileName(filename), "rb" );
- // read model settings
+ tfile = Folders::openMandatoryFile( Folders::getResourcePath(filename), "rb" );
+ // read model settings
fseek(tfile, 0, SEEK_SET);
funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
}
for (i = 0; i < TriangleNum; i++) {
- // funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
short vertex[ 6];
funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
Triangles[i].vertex[ 0] = vertex[ 0];
}
boundingsphereradius = fast_sqrt(boundingsphereradius);
- return 1;
+ return true;
}
-bool Model::loaddecal(const char *filename, bool texture )
+bool Model::loaddecal(const std::string& filename, bool texture )
{
- FILE *tfile;
- long i, j;
+ FILE *tfile;
+ long i, j;
LOGFUNC;
- // Changing the filename so that its more os specific
- char * FixedFN = ConvertFileName(filename);
-
- LOG(std::string("Loading decal...") + FixedFN);
-
- int oldvertexNum, oldTriangleNum;
- oldvertexNum = vertexNum;
- oldTriangleNum = TriangleNum;
+ LOG(std::string("Loading decal...") + Folders::getResourcePath(filename));
type = decalstype;
numdecals = 0;
color = 0;
- tfile = fopen( FixedFN, "rb" );
- // read model settings
+ tfile = Folders::openMandatoryFile( Folders::getResourcePath(filename), "rb" );
+ // read model settings
fseek(tfile, 0, SEEK_SET);
funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
}
for (i = 0; i < TriangleNum; i++) {
- // funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
short vertex[ 6];
funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
Triangles[i].vertex[ 0] = vertex[ 0];
decaltexcoords[i][j] = (float*)malloc(sizeof(float) * 2);
}
}
- //if(decalvertex)free(decalvertex);
decalvertex = (XYZ**)malloc(sizeof(XYZ*)*max_model_decals);
for (i = 0; i < max_model_decals; i++) {
decalvertex[i] = (XYZ*)malloc(sizeof(XYZ) * 3);
decalposition = (XYZ*)malloc(sizeof(XYZ) * max_model_decals);
}
- return 1;
+ return true;
}
-bool Model::loadraw(char *filename )
+bool Model::loadraw(const std::string& filename)
{
- FILE *tfile;
- long i;
+ FILE *tfile;
+ long i;
LOGFUNC;
LOG(std::string("Loading raw...") + filename);
- int oldvertexNum, oldTriangleNum;
- oldvertexNum = vertexNum;
- oldTriangleNum = TriangleNum;
-
type = rawtype;
color = 0;
- tfile = fopen( ConvertFileName(filename), "rb" );
- // read model settings
+ tfile = Folders::openMandatoryFile( Folders::getResourcePath(filename), "rb" );
+ // read model settings
fseek(tfile, 0, SEEK_SET);
funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
}
for (i = 0; i < TriangleNum; i++) {
- // funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
short vertex[ 6];
funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
Triangles[i].vertex[ 0] = vertex[ 0];
owner[i] = -1;
}
- return 1;
+ return true;
}
void Model::ScaleNormals(float xscale, float yscale, float zscale)
{
- if (type != normaltype && type != decalstype)return;
+ if (type != normaltype && type != decalstype)
+ return;
static int i;
for (i = 0; i < vertexNum; i++) {
normals[i].x *= xscale;
if (visibleloading)
Game::LoadingScreen();
static int i;
- if (type != normaltype && type != decalstype)return;
+ if (type != normaltype && type != decalstype)
+ return;
for (i = 0; i < vertexNum; i++) {
normals[i].x = 0;
normals[Triangles[i].vertex[2]].x += facenormals[i].x;
normals[Triangles[i].vertex[2]].y += facenormals[i].y;
normals[Triangles[i].vertex[2]].z += facenormals[i].z;
- if (facenormalise)Normalise(&facenormals[i]);
+ if (facenormalise)
+ Normalise(&facenormals[i]);
}
for (i = 0; i < vertexNum; i++) {
Normalise(&normals[i]);
textureptr.bind();
glBegin(GL_TRIANGLES);
for (int i = 0; i < TriangleNum; i++) {
- /*if(Triangles[i].vertex[0]<vertexNum&&Triangles[i].vertex[1]<vertexNum&&Triangles[i].vertex[2]<vertexNum&&Triangles[i].vertex[0]>=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);
+ 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);
+ 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);
+ 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::draw()
{
- if (type != normaltype && type != decalstype)return;
+ if (type != normaltype && type != decalstype)
+ return;
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- if (!color)glInterleavedArrays( GL_T2F_N3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
- if (color)glInterleavedArrays( GL_T2F_C3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+ if (!color)
+ glInterleavedArrays( GL_T2F_N3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+ if (color)
+ glInterleavedArrays( GL_T2F_C3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
textureptr.bind();
-#if PLATFORM_MACOSX
- glLockArraysEXT( 0, TriangleNum * 3);
-#endif
glDrawArrays(GL_TRIANGLES, 0, TriangleNum * 3);
-#if PLATFORM_MACOSX
- glUnlockArraysEXT();
-#endif
-
- if (!color)glDisableClientState(GL_NORMAL_ARRAY);
- if (color)glDisableClientState(GL_COLOR_ARRAY);
+ if (!color)
+ glDisableClientState(GL_NORMAL_ARRAY);
+ if (color)
+ glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- //drawimmediate();
}
//TODO: phase out in favor of Texture
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- if (!color)glInterleavedArrays( GL_T2F_N3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
- if (color)glInterleavedArrays( GL_T2F_C3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+ if (!color)
+ glInterleavedArrays( GL_T2F_N3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+ if (color)
+ glInterleavedArrays( GL_T2F_C3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
glBindTexture(GL_TEXTURE_2D, (unsigned long)texture);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
#endif
- if (!color)glDisableClientState(GL_NORMAL_ARRAY);
- if (color)glDisableClientState(GL_COLOR_ARRAY);
+ if (!color)
+ glDisableClientState(GL_NORMAL_ARRAY);
+ if (color)
+ glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- //drawdiffteximmediate(texture);
}
void Model::drawdifftex(Texture texture)
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- if (!color)glInterleavedArrays( GL_T2F_N3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
- if (color)glInterleavedArrays( GL_T2F_C3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+ if (!color)
+ glInterleavedArrays( GL_T2F_N3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+ if (color)
+ glInterleavedArrays( GL_T2F_C3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
texture.bind();
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
#endif
- if (!color)glDisableClientState(GL_NORMAL_ARRAY);
- if (color)glDisableClientState(GL_COLOR_ARRAY);
+ if (!color)
+ glDisableClientState(GL_NORMAL_ARRAY);
+ if (color)
+ glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- //drawdiffteximmediate(texture);
-}
-
-void Model::drawdiffteximmediate(GLuint texture)
-{
- glBindTexture(GL_TEXTURE_2D, (unsigned long)texture);
-
- glBegin(GL_TRIANGLES);
- for (int i = 0; i < TriangleNum; i++) {
- /*if(Triangles[i].vertex[0]<vertexNum&&Triangles[i].vertex[1]<vertexNum&&Triangles[i].vertex[2]<vertexNum&&Triangles[i].vertex[0]>=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 int lasttype;
- static float viewdistsquared;
static bool blend;
- viewdistsquared = viewdistance * viewdistance;
blend = 1;
lasttype = -1;
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();
}
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++) {
}
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);
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++) {
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;
- //static XYZ point,point1,point2;
static float distance;
static int i, j;
decaltexcoords[numdecals][j][1] = rot.z + .5;
}
}
- if (numdecals < max_model_decals - 1)numdecals++;
+ if (numdecals < max_model_decals - 1)
+ numdecals++;
}
}
}
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;
- //static XYZ point,point1,point2;
static float distance;
static int i, j;
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)) {
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)) {
decaltexcoords[numdecals][j][1] = rot.z + .5;
}
}
- if (numdecals < max_model_decals - 1)numdecals++;
+ if (numdecals < max_model_decals - 1)
+ numdecals++;
}
}
}
{
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;