for (unsigned int i = 0; i < decals.size(); i++) {
if (decals[i].type == blooddecalfast && decals[i].alivetime < 2)
decals[i].alivetime = 2;
- if ((decals[i].type == shadowdecal || decals[i].type == shadowdecalpermanent) && decals[i].type != lasttype) {
- shadowtexture.bind();
- if (!blend) {
- blend = 1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ if (decals[i].type != lasttype) {
+ if (decals[i].type == shadowdecal || decals[i].type == shadowdecalpermanent) {
+ shadowtexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
}
- }
- if (decals[i].type == footprintdecal && decals[i].type != lasttype) {
- footprinttexture.bind();
- if (!blend) {
- blend = 1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ if (decals[i].type == footprintdecal) {
+ footprinttexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
}
- }
- if (decals[i].type == bodyprintdecal && decals[i].type != lasttype) {
- bodyprinttexture.bind();
- if (!blend) {
- blend = 1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ if (decals[i].type == bodyprintdecal) {
+ bodyprinttexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
}
- }
- if ((decals[i].type == blooddecal || decals[i].type == blooddecalslow) && decals[i].type != lasttype) {
- bloodtexture.bind();
- if (blend) {
- blend = 0;
- glAlphaFunc(GL_GREATER, 0.15);
- glBlendFunc(GL_ONE, GL_ZERO);
+ if (decals[i].type == blooddecal || decals[i].type == blooddecalslow) {
+ bloodtexture.bind();
+ if (blend) {
+ blend = 0;
+ glAlphaFunc(GL_GREATER, 0.15);
+ glBlendFunc(GL_ONE, GL_ZERO);
+ }
}
- }
- if ((decals[i].type == blooddecalfast) && decals[i].type != lasttype) {
- bloodtexture2.bind();
- if (blend) {
- blend = 0;
- glAlphaFunc(GL_GREATER, 0.15);
- glBlendFunc(GL_ONE, GL_ZERO);
+ if (decals[i].type == blooddecalfast) {
+ bloodtexture2.bind();
+ if (blend) {
+ blend = 0;
+ glAlphaFunc(GL_GREATER, 0.15);
+ glBlendFunc(GL_ONE, GL_ZERO);
+ }
}
}
if (decals[i].type == shadowdecal || decals[i].type == shadowdecalpermanent) {
void Terrain::deleteDeadDecals()
{
- for (unsigned int i = 0; i < decals.size(); ) {
+ for (int i = decals.size() - 1; i >= 0; i--) {
if ((decals[i].type == blooddecal || decals[i].type == blooddecalslow) && decals[i].alivetime < 2) {
DeleteDecal(i);
- } else {
- i++;
}
}
}
void Terrain::AddObject(XYZ where, float radius, int id)
{
- XYZ points[4];
- if (id >= 0 && id < 10000)
+ XYZ points[2];
+ if (id >= 0 && id < 10000) {
for (int i = 0; i < subdivision; i++) {
for (int j = 0; j < subdivision; j++) {
- if (patchobjectnum[i][j] < 300 - 1) {
- bool done = false;
+ if (patchobjects[i][j].size() < 300 - 1) {
points[0].x = (size / subdivision) * i;
points[0].z = (size / subdivision) * j;
points[0].y = heightmap[(int)points[0].x][(int)points[0].z];
points[1].x = (size / subdivision) * (i + 1);
- points[1].z = (size / subdivision) * j;
+ points[1].z = (size / subdivision) * (j + 1);
points[1].y = heightmap[(int)points[1].x][(int)points[1].z];
- points[2].x = (size / subdivision) * (i + 1);
- points[2].z = (size / subdivision) * (j + 1);
- points[2].y = heightmap[(int)points[2].x][(int)points[2].z];
- points[3].x = (size / subdivision) * i;
- points[3].z = (size / subdivision) * (j + 1);
- points[3].y = heightmap[(int)points[3].x][(int)points[3].z];
points[0] *= scale;
points[1] *= scale;
- points[2] *= scale;
- points[3] *= scale;
- if (!done && where.x + radius > points[0].x && where.x - radius < points[2].x && where.z + radius > points[0].z && where.z - radius < points[2].z) {
- patchobjects[i][j][patchobjectnum[i][j]] = id;
- patchobjectnum[i][j]++;
- done = 1;
+ if (where.x + radius > points[0].x && where.x - radius < points[1].x && where.z + radius > points[0].z && where.z - radius < points[1].z) {
+ patchobjects[i][j].push_back(id);
}
}
}
}
+ }
}
void Terrain::DeleteDecal(int which)
}
}
-void Terrain::MakeDecal(int type, XYZ where, float size, float opacity, float rotation)
+void Terrain::MakeDecal(decal_type type, XYZ where, float size, float opacity, float rotation)
{
if (decalstoggle) {
if (opacity > 0 && size > 0) {
}
}
-void Terrain::MakeDecalLock(int type, XYZ where, int whichx, int whichy, float size, float opacity, float rotation)
+void Terrain::MakeDecalLock(decal_type type, XYZ where, int whichx, int whichy, float size, float opacity, float rotation)
{
if (decalstoggle) {
XYZ rot = getLighting(where.x, where.z);
void Terrain::DoShadows()
{
- static int i, j, k, l, todivide;
- static float brightness, total;
static XYZ testpoint, testpoint2, terrainpoint, lightloc, col;
lightloc = light.location;
if (!skyboxtexture) {
float shadowed;
Normalise(&lightloc);
//Calculate shadows
- for (i = 0; i < size; i++) {
- for (j = 0; j < size; j++) {
+ for (short int i = 0; i < size; i++) {
+ for (short int j = 0; j < size; j++) {
terrainpoint.x = (float)(i) * scale;
terrainpoint.z = (float)(j) * scale;
terrainpoint.y = heightmap[i][j] * scale;
shadowed = 0;
patchx = (float)(i) * subdivision / size;
patchz = (float)(j) * subdivision / size;
- if (patchobjectnum[patchx][patchz]) {
- for (k = 0; k < patchobjectnum[patchx][patchz]; k++) {
- l = patchobjects[patchx][patchz][k];
+ if (patchobjects[patchx][patchz].size()) {
+ for (unsigned int k = 0; k < patchobjects[patchx][patchz].size(); k++) {
+ unsigned int l = patchobjects[patchx][patchz][k];
if (Object::objects[l]->type != treetrunktype) {
testpoint = terrainpoint;
testpoint2 = terrainpoint + lightloc * 50 * (1 - shadowed);
}
Game::LoadingScreen();
}
- brightness = dotproduct(&lightloc, &normals[i][j]);
+ float brightness = dotproduct(&lightloc, &normals[i][j]);
if (shadowed)
brightness *= 1 - shadowed;
Game::LoadingScreen();
//Smooth shadows
- for (i = 0; i < size; i++) {
- for (j = 0; j < size; j++) {
- for (k = 0; k < 3; k++) {
- total = 0;
- todivide = 0;
+ for (short int i = 0; i < size; i++) {
+ for (short int j = 0; j < size; j++) {
+ for (short int k = 0; k < 3; k++) {
+ float total = 0;
+ unsigned int todivide = 0;
if (i != 0) {
total += colors[j][i - 1][k];
todivide++;
}
}
- for (i = 0; i < subdivision; i++) {
- for (j = 0; j < subdivision; j++) {
+ for (unsigned int i = 0; i < subdivision; i++) {
+ for (unsigned int j = 0; j < subdivision; j++) {
UpdateVertexArray(i, j);
}
}
{
size = 0;
- memset(patchobjectnum, 0, sizeof(patchobjectnum));
- memset(patchobjects, 0, sizeof(patchobjects));
-
scale = 1.0f;
type = 0;
memset(heightmap, 0, sizeof(heightmap));
memset(heightypatch, 0, sizeof(heightypatch));
patch_elements = 0;
-
- decals.clear();
}