예제 #1
0
void init(void)
{
    // GL inits
    glClearColor(0.2,0.2,0.5,0);
    glEnable(GL_DEPTH_TEST);
    glDisable(GL_CULL_FACE);
    printError("GL inits");

    projectionMatrix = frustum(-0.1, 0.1, -0.1, 0.1, 0.2, 50.0);

    // Load and compile shader
    program = loadShaders("shaders/terrain.vert", "shaders/terrain.frag");
    glUseProgram(program);
    printError("init shader");

    glUniformMatrix4fv(glGetUniformLocation(program, "projMatrix"), 1, GL_TRUE, projectionMatrix.m);
    glUniform1i(glGetUniformLocation(program, "tex"), 0); // Texture unit 0
    LoadTGATextureSimple("maskros512.tga", &tex1);

// Load terrain data

    LoadTGATextureData("fft-terrain.tga", &ttex);
    tm = GenerateTerrain(&ttex);
    printError("init terrain");
}
예제 #2
0
파일: project.c 프로젝트: 3born/TSBK07
void init(void)
{
  forward = SetVector(1,1,1);
  // GL inits
  glClearColor(0.2,0.2,0.5,0);
   glEnable(GL_DEPTH_TEST);
  glDisable(GL_CULL_FACE);
  glCullFace(GL_BACK);
  printError("GL inits");

  projectionMatrix = frustum(-0.1, 0.1, -0.1, 0.1, 0.2, 500.0);

  // Load and compile shader
  
  programSky = loadShaders("sky.vert", "sky.frag");
  skybox = LoadModelPlus("skybox.obj");
  program = loadShaders("terrain.vert", "terrain.frag");
  //goal = LoadModelPlus("cube.obj"); // If I put this here the walls get darker
  
  printError("init shader");
	
  
  glUseProgram(programSky);
  glActiveTexture(GL_TEXTURE2);	 
  glUniform1i(glGetUniformLocation(programSky, "tex"),2); // Texture unit 1
  glBindTexture(GL_TEXTURE_2D, myTex);
  LoadTGATextureSimple("SkyBox512.tga", &myTex); 

	  glActiveTexture(GL_TEXTURE3);	 
  glUniform1i(glGetUniformLocation(program, "tex"),3); // Texture unit 1
  glBindTexture(GL_TEXTURE_2D, tex3);
  LoadTGATextureSimple("gold.tga", &tex3);

  glUseProgram(program);
  glActiveTexture(GL_TEXTURE0);	
  glUniformMatrix4fv(glGetUniformLocation(program, "projMatrix"), 1, GL_TRUE, projectionMatrix.m);
  glUniform1i(glGetUniformLocation(program, "tex"),0); // Texture unit 1
  glBindTexture(GL_TEXTURE_2D, tex1);
  LoadTGATextureSimple("maskros512.tga", &tex1);

  glActiveTexture(GL_TEXTURE1);	 
  glUniform1i(glGetUniformLocation(program, "tex"),1); // Texture unit 1
  glBindTexture(GL_TEXTURE_2D, tex2);
  LoadTGATextureSimple("dirt.tga", &tex2);
  // Load terrain data
	

  
  LoadTGATextureData("MazeWall.tga", &ttexm);
  LoadTGATextureData("fft-terrain.tga", &ttex);
  tm = GenerateMazeTerrain(&ttexm,&ttex,vertexArray);
  mm = GenerateTerrain(&ttex,vertexArray);
  goal = LoadModelPlus("groundsphere.obj"); // The walls do not get darker
  printError("init terrain");


	sfMakeRasterFont(); // init font
	sfSetRasterSize(600, 200);
}
예제 #3
0
파일: main.cpp 프로젝트: PONT-MAX/TSBK07
void NewTerrain(GLfloat pos){
    
    std::cout << "New Terrrain!!  KOM IHÅG ATT DESTUERA MODELLERNA NÄR MAN TILLSÄTTER NY!!!!!! " << std::endl;
    


    
    GenerateTerrain(game_->maze->left->left);
    GenerateTerrain(game_->maze->left->right);
    
    GenerateTerrain(game_->maze->right->right);
    GenerateTerrain(game_->maze->right->left);
    
    game_->maze->generate_transform(pos,-(height_-1.0)/2.0);
    //game_->maze->get_all_pos();
    
    
}
예제 #4
0
파일: lab4-4.c 프로젝트: Grulfen/tsbk07
void init(void)
{

        skybox = LoadModelPlus("skybox.obj");
        sphere = LoadModelPlus("groundsphere.obj");


        // GL inits
	glClearColor(0.2,0.2,0.5,0);
	glEnable(GL_DEPTH_TEST);
	glDisable(GL_CULL_FACE);
	printError("GL inits");

	frustum(-0.1, 0.1, -0.1, 0.1, 0.2, 200.0, projectionMatrix);
	
	cam_pos.x = 108.0f;
	cam_pos.y = 60.0f;
	cam_pos.z = 144.0f;
	up.x = 0;
	up.y = 1;
	up.z = 0;
	
	// Load and compile shader
	program = loadShaders("terrain.vert", "terrain.frag");
	glUseProgram(program);
	printError("init shader");
	
	glUniformMatrix4fv(glGetUniformLocation(program, "projMatrix"), 1, GL_TRUE, projectionMatrix);
	glUniform1i(glGetUniformLocation(program, "tex"), 0); // Texture unit 0
	LoadTGATextureSimple("dirt.tga", &tex1);

        

        // Init light
        
        Point3D lightSourcesColorsArr = {0.5f, 0.5f, 0.5f}; // Grey light
        GLfloat specularExponent = 2.0;
        GLint isDirectional = 1;
        Point3D lightSourcesDirectionsPositions = {0.5f, 1.0f, 0.5f}; // grey light, positional

        glUniform3fv(glGetUniformLocation(program, "lightSourcesDirPosArr"), 1, &lightSourcesDirectionsPositions.x);
        glUniform3fv(glGetUniformLocation(program, "lightSourcesColorArr"), 1, &lightSourcesColorsArr.x);
        glUniform1f(glGetUniformLocation(program, "specularExponent"), specularExponent);
        glUniform1i(glGetUniformLocation(program, "isDirectional"), isDirectional);

        // Load terrain data
	
	LoadTGATexture("fft-terrain.tga", &ttex);
	tm = GenerateTerrain(&ttex);
	printError("init terrain");

        // Load textures	
        LoadTGATextureSimple("SkyBox512.tga", &skytex);
        LoadTGATextureSimple("grass.tga", &spheretex);
}
예제 #5
0
Terrain::Terrain()
{

	block_types.push_back(BlockType(glm::vec3(0.1f, 0.4f, 0.8f)));
	block_types.push_back(BlockType(glm::vec3()));
	block_types.push_back(BlockType(glm::vec3()));
	block_types.push_back(BlockType(glm::vec3()));
	block_types.push_back(BlockType(glm::vec3()));


	GenerateTerrain();

	operator()(0, -1) = 3;
	operator()(1, -1) = 3;
}
예제 #6
0
void StartGame ()
{
    unitList = NULL;

    /* --- Create our hero's ship --- */
    hero = CreateHero ();

    /* --- Generate the map --- */
    GenerateTerrain ();

    /* --- Place the people --- */
    PlacePeople ();

    /* --- Place aliens --- */
    PlaceAliens ();   
}
예제 #7
0
파일: main.cpp 프로젝트: PONT-MAX/TSBK07
void InitTerrain(){
    
    GenerateTerrain(game_->maze);
    GenerateTerrain(game_->maze->left);
    GenerateTerrain(game_->maze->left->left);
    GenerateTerrain(game_->maze->left->right);
    GenerateTerrain(game_->maze->right);
    GenerateTerrain(game_->maze->right->right);
    GenerateTerrain(game_->maze->right->left);
 
    game_->maze->generate_transform(0.0,-(height_-1.0)/2.0);
    
    
}
void ProcessUserInput()
{
    Keyboard &keyboard = Keyboard::instance();

    if (keyboard.keyPressed(Keyboard::KEY_ESCAPE))
        PostMessage(g_hWnd, WM_CLOSE, 0, 0);

    if (keyboard.keyDown(Keyboard::KEY_LALT) || keyboard.keyDown(Keyboard::KEY_RALT))
    {
        if (keyboard.keyPressed(Keyboard::KEY_ENTER))
            ToggleFullScreen();
    }

    if (keyboard.keyPressed(Keyboard::KEY_H))
        g_displayHelp = !g_displayHelp;

    if (keyboard.keyPressed(Keyboard::KEY_ADD) || keyboard.keyPressed(Keyboard::KEY_NUMPAD_ADD))
    {
        g_camera.setRotationSpeed(g_camera.getRotationSpeed() + 0.01f);

        if (g_camera.getRotationSpeed() > 1.0f)
            g_camera.setRotationSpeed(1.0f);
    }

    if (keyboard.keyPressed(Keyboard::KEY_SUBTRACT) || keyboard.keyPressed(Keyboard::KEY_NUMPAD_SUBTRACT))
    {
        g_camera.setRotationSpeed(g_camera.getRotationSpeed() - 0.01f);

        if (g_camera.getRotationSpeed() <= 0.0f)
            g_camera.setRotationSpeed(0.01f);
    }

    if (keyboard.keyPressed(Keyboard::KEY_V))
        EnableVerticalSync(!g_enableVerticalSync);

    if (keyboard.keyPressed(Keyboard::KEY_SPACE))
        GenerateTerrain();

    if (keyboard.keyPressed(Keyboard::KEY_M))
        Mouse::instance().smoothMouse(!Mouse::instance().mouseSmoothingIsEnabled());

    if (keyboard.keyPressed(Keyboard::KEY_T))
        g_disableColorMaps = !g_disableColorMaps;
}
예제 #9
0
파일: lab4-4.c 프로젝트: Seanberite/CG
void init(void)
{

	p = SetVector(20, 20, 0);
	l = SetVector(0,0,-1);
	v = SetVector(0,1,0);

	// GL inits
	glClearColor(0.2,0.2,0.5,0);
	glEnable(GL_DEPTH_TEST);
	glDisable(GL_CULL_FACE);
	printError("GL inits");

	projectionMatrix = frustum(-0.1, 0.1, -0.1, 0.1, 0.2, 50.0);

	// Load and compile shader
	program = loadShaders("terrain4.vert", "terrain4.frag");
	glUseProgram(program);
	printError("init shader");
	
	glUniformMatrix4fv(glGetUniformLocation(program, "projMatrix"), 1, GL_TRUE, projectionMatrix.m);

	LoadTGATextureSimple("maskros512.tga", &tex1);
	LoadTGATextureSimple("dirt.tga", &tex2);


	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D, tex1);
	glUniform1i(glGetUniformLocation(program, "texUnit0"), 0); // Texture unit 0
	glActiveTexture(GL_TEXTURE1);
	glBindTexture(GL_TEXTURE_2D, tex2);
	glUniform1i(glGetUniformLocation(program, "texUnit1"), 1);

// Load terrain data
	
	LoadTGATextureData("fft-terrain.tga", &ttex);
	tm = GenerateTerrain(&ttex);
	TextureData *texturePointer = &ttex;
	texWidth = texturePointer->width;
	printError("init terrain");
// Load objects
sphere = LoadModelPlus("groundsphere.obj");

}
예제 #10
0
bool Scene::Startup()
{
	MobileCamera* camera = new MobileCamera(100.0f, 0.1f);
	camera->SetInputWindow(window);
	camera->SetupPerspective(glm::pi<float>() * 0.25f, 16.0f / 9.0f, 0.1f, 10000.0f);
	camera->LookAt(glm::vec3(100, 100, 100), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
	m_camera = camera;

	//SHADERS
	//procedural gen
	terrainShader = ShaderHandler::Get()->LoadShader((string)"TerrainShader", "Data/shaders/proceduralGen.vert", "Data/shaders/proceduralGen.frag");
	planeShader = ShaderHandler::Get()->LoadShader((string) "PlaneShader", "Data/shaders/bluePlane.vert", "Data/shaders/bluePlane.frag");
	//particles

	//objects


	//AntBar init
	/*TwInit(TW_OPENGL_CORE, nullptr);
	TwWindowSize(1280, 720);
	glfwSetMouseButtonCallback(window, OnMouseButton);
	glfwSetCursorPosCallback(window, OnMousePosition);
	glfwSetScrollCallback(window, OnMouseScroll);
	glfwSetKeyCallback(window, OnKey);
	glfwSetCharCallback(window, OnChar);
	glfwSetWindowSizeCallback(window, OnWindowResize);*/

	tweakBar = TwNewBar("World_Editor");
	TwAddVarRW(tweakBar, "Terrain Amplitude", TW_TYPE_FLOAT, &editAmplitude, "");
	TwAddVarRW(tweakBar, "Terrain Persistance", TW_TYPE_FLOAT, &editScale, "");

	//variable init
	barChanged = false;
	editAmplitude = 3.0f;
	editScale = 8;
	perlinSeed = 10;

	GenerateTerrain(64, editScale, editAmplitude);
	CreatePlane(64);

	return true;
}
예제 #11
0
bool Scene::Update(double _dt)
{
	m_camera->Update(_dt);

	if (oldAmp != editAmplitude || oldPers != editScale)
	{
		barChanged = true;
	}

	oldAmp = editAmplitude;
	oldPers = editScale;

	if (barChanged == true)
	{
		GenerateTerrain(64, editScale, editAmplitude);
		barChanged = false;
	}

	return true;
}
예제 #12
0
void Terrain::Initialize(const char* sTexture, const char* sHeightMap, const char* sNormalMap, float fHeight)
{
	SetHeight(fHeight);

	ImageBMP* image = new ImageBMP(m_OpenGL);
	image->Load(sHeightMap);

	m_Texture = new Texture(m_OpenGL);
	TextureID = m_Texture->GetTexture2D(sTexture);

	iWidth = image->GetWidth();
	iHeight = image->GetHeight();

	hs = new float*[image->GetHeight()];
	Normal = new Vector3f*[image->GetHeight()];
	NormalTemp = new Vector3f*[image->GetHeight()];

	for (unsigned int i = 0; i < image->GetHeight(); ++i)
	{
		hs[i] = new float[image->GetWidth()];
		Normal[i] = new Vector3f[image->GetWidth()];
		NormalTemp[i] = new Vector3f[image->GetWidth()];
	}

	for (unsigned int y = 0; y < image->GetHeight(); y++)
	{
		for (unsigned int x = 0; x < image->GetWidth(); x++)
		{
			unsigned char color = (unsigned char)image->GetData()[3 * (y * image->GetWidth() + x)];
			float h = ((color / 255.0f) - 0.5f);
			SetHeight(x, y, h);
		}
	}

	ComputeNormal();
	GenerateTerrain();
	Bind();

	vPosition = Vector3f(0, -20, 0);
}
예제 #13
0
파일: lab4-1.c 프로젝트: 3born/TSBK07
void init(void)
{
  forward = SetVector(1,1,1);
  // GL inits
  glClearColor(0.2,0.2,0.5,0);
  glEnable(GL_DEPTH_TEST);
  glDisable(GL_CULL_FACE);
  printError("GL inits");

  projectionMatrix = frustum(-0.1, 0.1, -0.1, 0.1, 0.2, 500.0);

  // Load and compile shader
  program = loadShaders("terrain.vert", "terrain.frag");
  glUseProgram(program);
  printError("init shader");
	
  glUniformMatrix4fv(glGetUniformLocation(program, "projMatrix"), 1, GL_TRUE, projectionMatrix.m);
  glActiveTexture(GL_TEXTURE0);	
  glUniform1i(glGetUniformLocation(program, "tex"), 0); // Texture unit 0
  LoadTGATextureSimple("grass.tga", &tex1);

  //  glActiveTexture(GL_TEXTURE1);	
  //glUniform1i(glGetUniformLocation(program, "tex"),1); // Texture unit 0
  //  LoadTGATextureSimple("dirt.tga", &tex2);

	
  // Load terrain data
	
  LoadTGATextureData("fft-terrain.tga", &ttex);
  tm = GenerateTerrain(&ttex);
  printError("init terrain");

  //
  bunny= LoadModelPlus("bunnyplus.obj");

}
예제 #14
0
static void
Generate(void)
{
	char *trackdllname;
	char *extName;
	FILE *outfd = NULL;

	// Get the trackgen paramaters.
	sprintf(buf, "%s", CFG_FILE);
	CfgHandle = GfParmReadFile(buf, GFPARM_RMODE_STD | GFPARM_RMODE_CREAT);

	trackdllname = GfParmGetStr(CfgHandle, "Modules", "track", "track");
	sprintf(buf, "%smodules/track/%s.%s", GetLibDir (), trackdllname, DLLEXT);
	if (GfModLoad(TRK_IDENT, buf, &modlist) < 0) {
		GfFatal("Failed to find the track module %s", buf);
	}

	if (modlist->modInfo->fctInit(modlist->modInfo->index, &TrackItf)) {
		GfFatal("Failed to init the track module %s", buf);
	}

	// This is the track definition.
	sprintf(trackdef, "tracks/%s/%s/%s.xml", TrackCategory, TrackName, TrackName);
	TrackHandle = GfParmReadFile(trackdef, GFPARM_RMODE_STD);
	if (!TrackHandle) {
		fprintf(stderr, "Cannot find %s\n", trackdef);
		exit(1);
	}

	// Build the track structure with graphic extensions.
	Track = TrackItf.trkBuildEx(trackdef);

	if (!JustCalculate) {
		// Get the output file radix.
		sprintf(buf2, "tracks/%s/%s/%s", Track->category, Track->internalname, Track->internalname);
		OutputFileName = strdup(buf2);

		// Number of goups for the complete track.
		if (TrackOnly) {
			sprintf(buf2, "%s.ac", OutputFileName);
			// Track.
			outfd = Ac3dOpen(buf2, 1);
		} else if (MergeAll) {
			sprintf(buf2, "%s.ac", OutputFileName);
			// track + terrain + objects.
			outfd = Ac3dOpen(buf2, 2 + GetObjectsNb(TrackHandle));
		}

		// Main Track.
		if (bump) {
			extName = "trk-bump";
		} else {
			extName = "trk";
		}

		sprintf(buf2, "%s-%s.ac", OutputFileName, extName);
		OutTrackName = strdup(buf2);
	}

	if (JustCalculate){
		CalculateTrack(Track, TrackHandle, bump);
		return;
	}

	GenerateTrack(Track, TrackHandle, OutTrackName, outfd, bump);

	if (TrackOnly) {
		return;
	}

	// Terrain.
	if (MergeTerrain && !MergeAll) {
		sprintf(buf2, "%s.ac", OutputFileName);
		/* terrain + objects  */
		outfd = Ac3dOpen(buf2, 1 + GetObjectsNb(TrackHandle));
	}

	extName = "msh";
	sprintf(buf2, "%s-%s.ac", OutputFileName, extName);
	OutMeshName = strdup(buf2);

	GenerateTerrain(Track, TrackHandle, OutMeshName, outfd, saveElevation);

	if (saveElevation != -1) {
		if (outfd) {
			Ac3dClose(outfd);
		}
		switch (saveElevation) {
		case 0:
		case 1:
			sprintf(buf2, "%s.ac", OutputFileName);
			sprintf(buf, "%s-elv.png", OutputFileName);
			SaveElevation(Track, TrackHandle, buf, buf2, 1);
			if (saveElevation) {
			break;
			}
		case 2:
			sprintf(buf, "%s-elv2.png", OutputFileName);
			SaveElevation(Track, TrackHandle, buf, OutMeshName, 1);
			if (saveElevation) {
			break;
			}
		case 3:
			sprintf(buf, "%s-elv3.png", OutputFileName);
			SaveElevation(Track, TrackHandle, buf, OutMeshName, 0);
			if (saveElevation) {
			break;
			}
		case 4:
			sprintf(buf, "%s-elv4.png", OutputFileName);
			SaveElevation(Track, TrackHandle, buf, OutTrackName, 2);
			break;
		}
		return;
	}

	GenerateObjects(Track, TrackHandle, CfgHandle, outfd, OutMeshName);
}
void InitApp()
{
    // Setup fonts.

    if (!g_font.create("Arial", 10, GLFont::BOLD))
        throw std::runtime_error("Failed to create font.");

    // Setup textures.

    if (!(g_nullTexture = CreateNullTexture(2, 2)))
        throw std::runtime_error("failed to create null texture.");

    for (int i = 0; i < TERRAIN_REGIONS_COUNT; ++i)
    {
        if (!(g_regions[i].texture = LoadTexture(g_regions[i].filename.c_str())))
            throw std::runtime_error("Failed to load texture: " + g_regions[i].filename);
    }

    // Setup shaders.

    std::string infoLog;

    if (!(g_terrainShader = LoadShaderProgram("content/shaders/terrain.glsl", infoLog)))
        throw std::runtime_error("Failed to load shader: terrain.glsl.\n" + infoLog);

    // Setup terrain.

    if (!g_terrain.create(HEIGHTMAP_SIZE, HEIGHTMAP_GRID_SPACING, HEIGHTMAP_SCALE))
        throw std::runtime_error("Failed to create terrain.");

    GenerateTerrain();

    // Setup camera.

    Vector3 pos;

    pos.x = HEIGHTMAP_SIZE * HEIGHTMAP_GRID_SPACING * 0.5f;
    pos.z = HEIGHTMAP_SIZE * HEIGHTMAP_GRID_SPACING * 0.5f;
    pos.y = g_terrain.getHeightMap().heightAt(pos.x, pos.z) + CAMERA_Y_OFFSET;

    g_camera.setBehavior(Camera::CAMERA_BEHAVIOR_FIRST_PERSON);
    g_camera.setPosition(pos);
    g_camera.setAcceleration(CAMERA_ACCELERATION);
    g_camera.setVelocity(CAMERA_VELOCITY);

    g_camera.perspective(CAMERA_FOVX,
                         static_cast<float>(g_windowWidth) / static_cast<float>(g_windowHeight),
                         CAMERA_ZNEAR, CAMERA_ZFAR);

    float upperBounds = (HEIGHTMAP_SIZE * HEIGHTMAP_GRID_SPACING - (2.0f * HEIGHTMAP_GRID_SPACING));
    float lowerBounds = static_cast<float>(HEIGHTMAP_GRID_SPACING);

    g_cameraBoundsMax.x = upperBounds;
    g_cameraBoundsMax.y = CAMERA_ZFAR;
    g_cameraBoundsMax.z = upperBounds;

    g_cameraBoundsMin.x = lowerBounds;
    g_cameraBoundsMin.y = 0.0f;
    g_cameraBoundsMin.z = lowerBounds;

    // Setup input.

    Mouse::instance().hideCursor(true);
    Mouse::instance().setPosition(g_windowWidth / 2, g_windowHeight / 2);
}
예제 #16
0
void Application::generate()
{
	const char *extName;
	FILE *outfd = NULL;

	// Get the trackgen paramaters.
	sprintf(buf, "%s", CFG_FILE);
	CfgHandle = GfParmReadFile(buf, GFPARM_RMODE_STD | GFPARM_RMODE_CREAT);

	// Load and initialize the track loader module.
	GfLogInfo("Loading Track Loader ...\n");
	std::ostringstream ossModLibName;
	ossModLibName << GfLibDir() << "modules/track/" << "track" << '.' << DLLEXT;
	GfModule* pmodTrkLoader = GfModule::load(ossModLibName.str());

	// Check that it implements ITrackLoader.
	ITrackLoader* PiTrackLoader = 0;
	if (pmodTrkLoader)
		PiTrackLoader = pmodTrkLoader->getInterface<ITrackLoader>();
	if (!PiTrackLoader)
		return;

	// This is the track definition.
	sprintf(trackdef, "%stracks/%s/%s/%s.xml", GfDataDir(), TrackCategory, TrackName, TrackName);
	TrackHandle = GfParmReadFile(trackdef, GFPARM_RMODE_STD);
	if (!TrackHandle) {
		fprintf(stderr, "Cannot find %s\n", trackdef);
		::exit(1);
	}

	// Build the track structure with graphic extensions.
	Track = PiTrackLoader->load(trackdef, true);

	if (!JustCalculate) {
		// Get the output file radix.
		sprintf(buf2, "%stracks/%s/%s/%s", GfDataDir(), Track->category, Track->internalname, Track->internalname);
		OutputFileName = strdup(buf2);

		// Number of groups for the complete track.
		if (TrackOnly) {
			sprintf(buf2, "%s.ac", OutputFileName);
			// Track.
			outfd = Ac3dOpen(buf2, 1);
		} else if (MergeAll) {
			sprintf(buf2, "%s.ac", OutputFileName);
			// track + terrain + objects.
			outfd = Ac3dOpen(buf2, 2 + GetObjectsNb(TrackHandle));
		}

		// Main Track.
		if (Bump) {
			extName = "trk-bump";
		} else {
			extName = "trk";
		}

		sprintf(buf2, "%s-%s.ac", OutputFileName, extName);
		OutTrackName = strdup(buf2);
	}

	if (JustCalculate){
		CalculateTrack(Track, TrackHandle, Bump);
		return;
	}

	GenerateTrack(Track, TrackHandle, OutTrackName, outfd, Bump);

	if (TrackOnly) {
		return;
	}

	// Terrain.
	if (MergeTerrain && !MergeAll) {
		sprintf(buf2, "%s.ac", OutputFileName);
		/* terrain + objects  */
		outfd = Ac3dOpen(buf2, 1 + GetObjectsNb(TrackHandle));
	}

	extName = "msh";
	sprintf(buf2, "%s-%s.ac", OutputFileName, extName);
	OutMeshName = strdup(buf2);

	GenerateTerrain(Track, TrackHandle, OutMeshName, outfd, DoSaveElevation);

	if (DoSaveElevation != -1) {
		if (outfd) {
			Ac3dClose(outfd);
		}
		switch (DoSaveElevation) {
			case 0:
			case 1:
				sprintf(buf2, "%s.ac", OutputFileName);
				sprintf(buf, "%s-elv.png", OutputFileName);
				SaveElevation(Track, TrackHandle, buf, buf2, 1);
				if (DoSaveElevation) {
					break;
				}
			case 2:
				sprintf(buf, "%s-elv2.png", OutputFileName);
				SaveElevation(Track, TrackHandle, buf, OutMeshName, 1);
				if (DoSaveElevation) {
					break;
				}
			case 3:
				sprintf(buf, "%s-elv3.png", OutputFileName);
				SaveElevation(Track, TrackHandle, buf, OutMeshName, 0);
				if (DoSaveElevation) {
					break;
				}
			case 4:
				sprintf(buf, "%s-elv4.png", OutputFileName);
				SaveElevation(Track, TrackHandle, buf, OutTrackName, 2);
				break;
		}
		return;
	}

	GenerateObjects(Track, TrackHandle, CfgHandle, outfd, OutMeshName);
}