Creating a simple triangulation
Download the source code for this example.
//////////////////////////////////////////////////////////////////////////////
//
// Name : VulcanSDK_triangulation_example.cpp
// Description : A basic example of using the Vulcan SDK with triangulations
//
// Maptek Pty Ltd, 2020
//
//////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <float.h>
#include "mtkExportedApi_ReadWrite.h"
int RunTriangulationExample(char* filename)
{
int status, i;
char newFilename[MTK_BUFFER_SIZE];
char texture_file[MTK_BUFFER_SIZE];
MTK_Triangulation *triang;
int numPoints, numAttributes;
double pointX, pointY, pointZ;
double maxX, maxY, maxZ;
char* extension;
printf("Initialising API using Maptek Extend licence...");
// Setup environment variable 'VULCAN' for this process to a
// Vulcan installation directory for dependencies and licencing.
MTK_SetVulcanEnvironmentVariable("C:/Program Files/Maptek/Vulcan 12.0.3");
// Initialise library using client-side Maptek Extend licence
if (MTK_API_InitExtend())
{
HandleError();
return 1;
}
printf("done\n");
printf("Opening triangulation %s...", filename);
triang = MTK_Triangulation_Open(filename);
if (!triang)
{
HandleError();
return 1;
}
printf("done\n");
status = MTK_Triangulation_IsValid(triang);
if (status != 1)
{
if (status == -1)
{
HandleError();
}
else
{
printf("Triangulation %s is not valid.\n", filename);
}
return 1;
}
printf("Triangulation %s is valid\n", filename);
numPoints = MTK_Triangulation_NumPoints(triang);
if (numPoints == -1)
{
HandleError();
return 1;
}
printf("Triangulation %s has %d points\n", filename, numPoints);
// Check if the triangulation has a texture
if (MTK_Triangulation_GetTexture(triang, texture_file))
{
HandleError();
return 1;
}
else
{
printf("Triangulation %s has a texture file: '%s'\n", filename,
texture_file);
}
int iTextured = MTK_Triangulation_IsTextured(triang);
if (iTextured == -1)
{
HandleError();
return 1;
}
else
{
if (iTextured == 1)
{
printf("Triangulation %s has texture turned on\n", filename);
}
else
{
printf("Triangulation %s has texture turned off\n", filename);
}
}
// Create buffer for holding attribute names
char** names = (char**)malloc(sizeof(char*) * MTK_BUFFER_SIZE);
for (int i = 0; i < MTK_BUFFER_SIZE; ++i)
{
names[i] = (char*)malloc(sizeof(char) * MTK_BUFFER_SIZE);
}
if (MTK_Triangulation_GetAttributeNames(triang, names, &numAttributes))
{
HandleError();
return 1;
}
printf("Triangulation %s has %d attributes\n", filename, numAttributes);
printf("Printing out all attributes of type DOUBLE:\n");
for (int i = 0; i < numAttributes; ++i)
{
MTK_Triangulation_AttributeType type;
if (MTK_Triangulation_GetAttributeType(triang, names[i], &type))
{
HandleError();
continue;
}
if (type == TRI_ATTRIBUTE_DOUBLE)
{
double dval;
if (!MTK_Triangulation_GetAttributeAsDouble(triang, names[i], &dval))
{
printf("Triangulation attribute %s (type DOUBLE) has value:"
" %.10f\n", names[i], dval);
}
else
{
char error[MTK_BUFFER_SIZE];
MTK_API_GetError(error);
printf("%s (Triangulation attribute %s)\n", error, names[i]);
}
}
}
// Free the attribute names buffer
for (int i = 0; i < MTK_BUFFER_SIZE; ++i)
{
free(names[i]);
}
free(names);
// This code finds the 'highest' point in the triangulation, then adds a
// small box a bit 'above' that point to the triangulation
printf("Adding small box to triangulation...");
maxX = -DBL_MAX; maxY = -DBL_MAX; maxZ = -DBL_MAX;
for (i = 0; i < numPoints; ++i)
{
status = MTK_Triangulation_GetPoint(
triang, i, &pointX, &pointY, &pointZ
);
if (status)
{
HandleError();
return 1;
}
if (pointX > maxX)
{
maxX = pointX;
}
if (pointY > maxY)
{
maxY = pointY;
}
if (pointZ > maxZ)
{
maxZ = pointZ;
}
}
maxX += 50; maxY += 50; maxZ += 50; // '50' is completely arbitrary
MTK_Triangulation_AddPoint(triang, maxX, maxY, maxZ); // numPoints
MTK_Triangulation_AddPoint(triang, maxX + 50, maxY, maxZ); // numPoints + 1
MTK_Triangulation_AddPoint(triang, maxX + 50, maxY + 50, maxZ); // numPoints + 2
MTK_Triangulation_AddPoint(triang, maxX, maxY + 50, maxZ); // numPoints + 3
MTK_Triangulation_AddPoint(triang, maxX, maxY, maxZ + 50); // numPoints + 4
MTK_Triangulation_AddPoint(triang, maxX + 50, maxY, maxZ + 50); // numPoints + 5
MTK_Triangulation_AddPoint(triang, maxX + 50, maxY + 50, maxZ + 50); // numPoints + 6
MTK_Triangulation_AddPoint(triang, maxX, maxY + 50, maxZ + 50); // numPoints + 7
MTK_Triangulation_AddTriangle(triang, numPoints, numPoints + 1, numPoints + 2);
MTK_Triangulation_AddTriangle(triang, numPoints, numPoints + 3, numPoints + 2);
MTK_Triangulation_AddTriangle(triang, numPoints, numPoints + 4, numPoints + 7);
MTK_Triangulation_AddTriangle(triang, numPoints, numPoints + 3, numPoints + 7);
MTK_Triangulation_AddTriangle(triang, numPoints + 4, numPoints + 5, numPoints + 6);
MTK_Triangulation_AddTriangle(triang, numPoints + 4, numPoints + 7, numPoints + 6);
MTK_Triangulation_AddTriangle(triang, numPoints + 1, numPoints + 5, numPoints + 6);
MTK_Triangulation_AddTriangle(triang, numPoints + 1, numPoints + 2, numPoints + 6);
MTK_Triangulation_AddTriangle(triang, numPoints, numPoints + 1, numPoints + 5);
MTK_Triangulation_AddTriangle(triang, numPoints, numPoints + 4, numPoints + 5);
MTK_Triangulation_AddTriangle(triang, numPoints + 3, numPoints + 2, numPoints + 6);
MTK_Triangulation_AddTriangle(triang, numPoints + 3, numPoints + 7, numPoints + 6);
printf("done\n");
// This code adds an attribute to the triangulation
printf("Adding an attribute to triangulation...");
if (MTK_Triangulation_AddAttributeString(triang, "TestAttr", "Added Box"))
{
HandleError();
return 1;
}
printf("done\n");
// This code adds a texture to the triangulation
printf("Adding a texture to triangulation...");
if (MTK_Triangulation_SetTexture(triang, "sample_texture.jpg", 1))
{
HandleError();
return 1;
}
printf("done\n");
strncpy(newFilename, filename, MTK_BUFFER_SIZE - 1);
newFilename[MTK_BUFFER_SIZE - 1] = '\0';
extension = strstr(newFilename, ".00t");
if (extension && strlen(newFilename) < MTK_BUFFER_SIZE - 9)
{
strcpy(extension, "_with_box.00t");
}
else
{
strcpy(newFilename, "NewTriMadeFromExampleWithABox.00t");
}
printf("Saving triangulation as %s...", newFilename);
if (MTK_Triangulation_Save(triang, newFilename))
{
HandleError();
return 1;
}
printf("done\n");
if (MTK_Triangulation_Close(triang))
{
HandleError();
return 1;
}
MTK_API_Terminate();
return 0;
}
static void HandleError()
{
char error[MTK_BUFFER_SIZE];
MTK_API_GetError(error);
printf("%s\n", error);
MTK_API_Terminate();
}