I just forgot to use version control so I do not know what went wrong yesterday. I got it working now without union stuff
I guess I didn't cast it correctly yesterday or so.... who knows what I did at night
I was wondering, does the random terrain generation from a terrainkey also contain vertex painting? I can't quite find it in the code, but I would think it should be in there somewhere.
So far I can write out the terrain mesh with the normals (not sure if they're working right) and the vertex colors from the sco file.
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
extern "C" {
#include "scoReader.h"
#include "scoWriter.h"
#include "sco.h"
}
#include "TerrainGenerator.h"
#define mt_scene_prop 0
#define mt_entry_point 1
#define mt_scene_item 2
#define mt_flora 4
#define mt_passage 5
int write_ply(char* file_name, TerrainGenerator* terrainGen, sco_file_t* sco_file, char* file_in_name)
{
FILE *file = fopen ( file_name , "wt" );
if (file==NULL)
{
printf("ERROR: file %s could not be opened.\n", file_name);
return EXIT_FAILURE;
}
fprintf(file, "ply\n");
fprintf(file, "format ascii 1.0\n");
fprintf(file, "comment This file contains the terrain mesh of %s\n", file_in_name);
fprintf(file, "element vertex %i\n", (terrainGen->m_numFaces[0]+1)*(terrainGen->m_numFaces[1]+1) );
fprintf(file, "property float x\n");
fprintf(file, "property float y\n");
fprintf(file, "property float z\n");
fprintf(file, "property float nx\n");
fprintf(file, "property float ny\n");
fprintf(file, "property float nz\n");
int layer;
for (layer=0; layer < sco_file->ground_paint->num_layers; ++layer)
{
if( sco_file->ground_paint->layers[layer].ground_spec_no == GROUND_PAINT_LEVELING_MAGIC && sco_file->ground_paint->layers[layer].cells!=NULL)
{
fprintf(file, "property uchar alpha\n");
fprintf(file, "property uchar red\n");
fprintf(file, "property uchar green\n");
fprintf(file, "property uchar blue \n");
break;
}
}
fprintf(file, "element face %i\n", terrainGen->m_numFaces[0]*terrainGen->m_numFaces[1]*2);
fprintf(file, "property list uchar int vertex_index\n");
fprintf(file, "end_header\n");
TerrainVertex vertex;
unsigned int colorint, nx, ny;
unsigned char alpha, red, green, blue;
for(nx = 0; nx < terrainGen->m_numFaces[0]+1; ++nx)
{
for(ny =0; ny < terrainGen->m_numFaces[1]+1; ++ny)
{
vertex = terrainGen->m_vertices[nx][ny];
fprintf(file, "%f %f %f ", vertex.m_position.x,vertex.m_position.y,vertex.m_position.z);
fprintf(file, "%f %f %f ", vertex.m_normal.x,vertex.m_normal.y,vertex.m_normal.z);
if(layer!=sco_file->ground_paint->num_layers)
{
colorint = *( (unsigned int*) &(sco_file->ground_paint->layers[layer].cells[ny+nx*sco_file->ground_paint->size_y]) );
alpha = (colorint & 0xFF000000) >> 24;
red = (colorint & 0x00FF0000) >> 16;
green = (colorint & 0x0000FF00) >> 8;
blue = (colorint & 0x000000FF) ;
fprintf(file, "%u %u %u %u ",alpha, red , green , blue ) ;
}
fprintf(file, "\n");
}
}
int vertices[3][2];
for(nx = 0; nx < terrainGen->m_numFaces[0]; ++nx)
{
for(ny =0; ny < terrainGen->m_numFaces[1]; ++ny)
{
fprintf(file, "3 ");
terrainGen->getVerticesForFace(nx,ny,0,vertices[0],vertices[1],vertices[2]);
fprintf(file, "%i ", vertices[0][0]*(terrainGen->m_numFaces[1]+1)+vertices[0][1]);
fprintf(file, "%i ", vertices[1][0]*(terrainGen->m_numFaces[1]+1)+vertices[1][1]);
fprintf(file, "%i ", vertices[2][0]*(terrainGen->m_numFaces[1]+1)+vertices[2][1]);
fprintf(file, "\n");
fprintf(file, "3 ");
terrainGen->getVerticesForFace(nx,ny,1,vertices[0],vertices[1],vertices[2]);
fprintf(file, "%i ", vertices[0][0]*(terrainGen->m_numFaces[1]+1)+vertices[0][1]);
fprintf(file, "%i ", vertices[1][0]*(terrainGen->m_numFaces[1]+1)+vertices[1][1]);
fprintf(file, "%i ", vertices[2][0]*(terrainGen->m_numFaces[1]+1)+vertices[2][1]);
fprintf(file, "\n");
}
}
if(fclose(file))
{
printf("ERROR: file %s could not be closed.\n", file_name);
return EXIT_FAILURE;
}
else
return EXIT_SUCCESS;
}
int write_obj(char* file_name, TerrainGenerator* terrainGen)
{
FILE *file = fopen ( file_name , "wt" );
if (file==NULL)
{
printf("ERROR: file %s could not be opened.\n", file_name);
return EXIT_FAILURE;
}
int nx, ny;
for(nx = 0; nx < terrainGen->m_numFaces[0]+1; ++nx)
{
for(ny =0; ny < terrainGen->m_numFaces[1]+1; ++ny)
{
fprintf(file, "v ");
fprintf(file, "%f ", terrainGen->m_vertices[nx][ny].m_position.x);
fprintf(file, "%f ", terrainGen->m_vertices[nx][ny].m_position.y);
fprintf(file, "%f ", terrainGen->m_vertices[nx][ny].m_position.z);
fprintf(file, "\n");
}
}
int vertices[3][2];
for(nx = 0; nx < terrainGen->m_numFaces[0]; ++nx)
{
for(ny =0; ny < terrainGen->m_numFaces[1]; ++ny)
{
terrainGen->getVerticesForFace(nx,ny,0,vertices[0],vertices[1],vertices[2]);
fprintf(file, "f ");
fprintf(file, "%i ", 1+vertices[0][0]*(terrainGen->m_numFaces[1]+1)+vertices[0][1]);
fprintf(file, "%i ", 1+vertices[1][0]*(terrainGen->m_numFaces[1]+1)+vertices[1][1]);
fprintf(file, "%i ", 1+vertices[2][0]*(terrainGen->m_numFaces[1]+1)+vertices[2][1]);
fprintf(file, "\n");
terrainGen->getVerticesForFace(nx,ny,1,vertices[0],vertices[1],vertices[2]);
fprintf(file, "f ");
fprintf(file, "%i ", 1+vertices[0][0]*(terrainGen->m_numFaces[1]+1)+vertices[0][1]);
fprintf(file, "%i ", 1+vertices[1][0]*(terrainGen->m_numFaces[1]+1)+vertices[1][1]);
fprintf(file, "%i ", 1+vertices[2][0]*(terrainGen->m_numFaces[1]+1)+vertices[2][1]);
fprintf(file, "\n");
}
}
if(fclose(file))
{
printf("ERROR: file %s could not be closed.\n", file_name);
return EXIT_FAILURE;
}
else
return EXIT_SUCCESS;
}
int main(int argc, char **argv)
{
if(argc != 4)
{
printf("Usage: %s file_in hex_terrain_code file_out\n", argv[0]);
return EXIT_FAILURE;
}
FILE *in = fopen(argv[1], "rb");
if(!in)
{
printf("ERROR: file %s not found\n", argv[1]);
return EXIT_FAILURE;
}
printf("Reading %s\n", argv[1]);
sco_file_t sco_file;
read_sco_file(in, &sco_file);
TerrainGenerator *terrainGen; // too big for stack
try
{
terrainGen = new TerrainGenerator();
terrainGen->setTerrainCode(argv[2]);
terrainGen->generate();
}
catch (...) // just for SEH, needs /EHa
{
printf("exception while generating terrain. check your input mang :[\n");
system("pause");
return EXIT_FAILURE;
}
if(sco_file.ground_paint->size_x-1 != terrainGen->m_numFaces[0] || sco_file.ground_paint->size_y-1 != terrainGen->m_numFaces[1])
{
printf("The terrainkey and sco don't have the same terrain size, aborting!\n");
return EXIT_FAILURE;
}
int layer, x, y;
for (layer=0; layer < sco_file.ground_paint->num_layers; ++layer)
{
if( sco_file.ground_paint->layers[layer].ground_spec_no == GROUND_PAINT_ELEVATION_MAGIC && sco_file.ground_paint->layers[layer].cells!=NULL)
{
for( x = 0; x < sco_file.ground_paint->size_x; ++x)
{
for ( y = 0; y < sco_file.ground_paint->size_y; ++y)
{
TerrainVertex *vtx = &terrainGen->m_vertices[x][y];
vtx->m_position.z += sco_file.ground_paint->layers[layer].cells[y+x*sco_file.ground_paint->size_y];
}
}
break;
}
}
terrainGen->computeNormals();
printf("Writing %s\n", argv[3]);
char* ext = strrchr(argv[3], '.')+1;
int write = -1;
if(strcmp(ext, "obj")==0)
{
write = write_obj(argv[3], terrainGen);
}
else if (strcmp(ext, "ply")==0)
{
write = write_ply(argv[3], terrainGen, &sco_file, argv[1]);
}
else
{
printf("Uknown filetype!\n");
}
if(write==0)
{
printf("Succesfully written the %s file.", ext);
return EXIT_SUCCESS;
}
return EXIT_FAILURE;
}