I made some code that creates a sphere as a sample program.
A example is
I am converting the code to be similar to the https://www.youtube.com/watch?v=rL8zDgTlXso and https://drive.google.com/open?id=1pMkiKikuD0tkTFc0e7S-olPw2-dfKPrm.
The example of the code is here:
The first goal is to copy the code into a new file and code structure. Meaning a Sphere Terain that has six faces as SphereTerrainFace that has a node As SphereTerrainNode that can be a Patch with topology, or have four children of Nodes with topology. The code rework seems correct…
My main problem is I can’t get the geometry to appear. I am using Urho3d Terrain.h, Terrain.cpp, TerrainPatch.h, and TerrainPatch.cpp. TerrainPatch.h as a example to work from but I am missing something. I just hoping to get the sphere correct.
Looking at the following console output. The faces are being created and the index data.
The three primary code files are below but you can see the rest. If I can get it to work I can pull it into the Urho3D base code with the full real-time or static generation.
SphereTerrain
SphereTerrain::SphereTerrain(Context * context) :
LogicComponent(context), m_Material(nullptr), m_MaterialShaderEnable(
false) {
m_Radius = 1;
Build(m_Radius);
}
// Build
void SphereTerrain::Build(double radius) {
// Set initial radius
m_Radius = radius;
// Create sides
for (unsigned int i = 0; i < 6; i++) {
// Debug
ALPHAENGINE_LOGINFO("Creating SphereTerrain Face " + String(i));
// Create Face
m_SphereTerrainFace[i] = new SphereTerrainFace(g_pApp->GetContext(),
this, (STFaceDirection) i);
}
// Build sides
for (unsigned int i = 0; i < 6; i++) {
// Debug
ALPHAENGINE_LOGINFO("Build SphereTerrain Face " + String(i));
// Build face
m_SphereTerrainFace[i]->Build();
}
}
void SphereTerrain::RegisterObject(Context* context) {
context->RegisterFactory<SphereTerrain>();
}
SphereTerrain::~SphereTerrain() {
// Create sides
for (unsigned int i = 0; i < 6; i++) {
delete m_SphereTerrainFace[i];
}
}
// Set Material Recursive to all Patches
void SphereTerrain::SetMaterial(Material * material) {
// Create sides
for (unsigned int i = 0; i < 6; i++) {
m_SphereTerrainFace[i]->SetMaterial(material);
}
}
SphereTerrainPatch
SphereTerrainPatch::SphereTerrainPatch(Context * context,
SphereTerrainNode * node = nullptr) :
Drawable(context, DRAWABLE_GEOMETRY), m_pNode(node), m_pVertexBuffer(
new VertexBuffer(context)), m_pIndexBuffer(
new IndexBuffer(context)), m_pGeometry(new Geometry(context)), m_pTopology(
new SphereTerrainTopology(context, this)), m_pOcclusionBuffer(
new OcclusionBuffer(context)) {
// Resize batches
batches_.Resize(1);
batches_[0].geometry_ = m_pGeometry;
batches_[0].geometryType_ = GEOM_STATIC_NOINSTANCING;
m_BoundingBox.Clear();
node_ = this->GetNode();
}
void SphereTerrainPatch::RegisterObject(Context* context) {
context->RegisterFactory<SphereTerrainPatch>();
}
void SphereTerrainPatch::Build() {
// Debug
ALPHAENGINE_LOGINFO("Generate Topology ...");
// Generate Topology and Describe the Type
m_pTopology->GenerateTopology();
// Get Topology and set Vertex Buffer
ALPHAENGINE_LOGINFO("Create vertex data ...");
// We could use the "legacy" element bitmask to define elements for more compact code, but let's demonstrate
// defining the vertex elements explicitly to allow any element types and order
PODVector<VertexElement> elements;
elements.Push(VertexElement(TYPE_VECTOR3, SEM_POSITION));
m_pVertexBuffer->SetSize(m_pTopology->GetVertexCounts(), MASK_POSITION,
false);
ALPHAENGINE_LOGINFO("Set vertex data ...");
m_pVertexBuffer->SetData((unsigned char*) m_pTopology->GetVertexData());
ALPHAENGINE_LOGINFO("Set index data ...");
m_pIndexBuffer->SetSize(m_pTopology->GetIndexCounts(), false, false);
m_pIndexBuffer->SetData((unsigned char*) m_pTopology->GetIndexData());
m_pIndexBuffer->SetShadowed(true);
m_pIndexBuffer->SetDataRange(m_pTopology->GetIndexData(), 0,
m_pTopology->GetIndexCounts(), false);
// Set Geometry to VertexBuffer
m_pGeometry->SetNumVertexBuffers(1);
m_pGeometry->SetVertexBuffer(0, m_pVertexBuffer);
m_pGeometry->SetIndexBuffer(m_pIndexBuffer);
// Set Draw Range
m_pGeometry->SetDrawRange(TRIANGLE_LIST, 0, m_pTopology->GetIndexCounts(),
0, m_pTopology->GetVertexCounts(), false);
// Add to BOunding box
ALPHAENGINE_LOGINFO("Vertex Data (Triangles<3) ...");
float * vectorData = m_pTopology->GetVertexData();
unsigned int * indexData = m_pTopology->GetIndexData();
for (unsigned int i = 0; i < 6; i++) {
Vector3 vectordata;
for (unsigned int j = 0; j < 3; j += 3) {
vectordata.x_ = vectorData[(i * 3) + j];
vectordata.y_ = vectorData[(i * 3) + j + 1];
vectordata.z_ = vectorData[(i * 3) + j + 2];
}
ALPHAENGINE_LOGINFO("VectorData "+vectordata.ToString());
}
ALPHAENGINE_LOGINFO(
"IndexData"+ " " +String(indexData[0])+ " " +String(indexData[1])+ " " +String(indexData[2])+ " " +String(indexData[3])+ " " +String(indexData[4])+ " " +String(indexData[5])+ " " +String(indexData[6]));
// Add to BOunding box
ALPHAENGINE_LOGINFO("Generate bounding box ...");
for (unsigned int i = 0; i < m_pTopology->GetVertexCounts() * 3; i += 3) {
Vector3 vec = Vector3(vectorData[i], vectorData[i + 1],
vectorData[i + 2]);
m_BoundingBox.Merge(vec);
if (i < 7) {
ALPHAENGINE_LOGINFO("Adding boundary "+ vec.ToString());
}
}
// Set bounding box
boundingBox_ = m_BoundingBox;
// Set Lod
m_pGeometry->SetLodDistance(0);
//Set Draw
drawDistance_ = 1000.f;
// Draw
m_pGeometry->Draw(g_pApp->GetGraphics());
OnMarkedDirty(node_);
}
SphereTerrainPatch::~SphereTerrainPatch() {
}
void SphereTerrainPatch::OnWorldBoundingBoxUpdate() {
worldBoundingBox_ = boundingBox_.Transformed(node_->GetWorldTransform());
}
STFaceDirection SphereTerrainPatch::GetFaceDirection() {
m_pNode->GetFaceDirection();
}
void SphereTerrainPatch::SetMaterial(Material * material) {
// Set material
m_pMaterial = material;
// Set the batch material
batches_[0].material_ = material;
}
bool SphereTerrainPatch::DrawOcclusion(OcclusionBuffer* buffer) {
bool success = true;
if (!m_pGeometry) {
return false;
}
// Check that the material is suitable for occlusion (default material always is) and set culling mode
buffer->SetCullMode(CULL_CW);
const unsigned char* vertexData;
unsigned vertexSize;
const unsigned char* indexData;
unsigned indexSize;
const PODVector<VertexElement>* elements;
m_pGeometry->GetRawData(vertexData, vertexSize, indexData, indexSize,
elements);
// Check for valid geometry data
if (!vertexData || !elements
|| VertexBuffer::GetElementOffset(*elements, TYPE_VECTOR3,
SEM_POSITION) != 0) {
return false;
}
// Draw and check for running out of triangles
success = buffer->AddTriangles(this->GetNode()->GetWorldTransform(),
vertexData, vertexSize, m_pGeometry->GetVertexStart(),
m_pGeometry->GetVertexCount());
return success;
}
void SphereTerrainPatch::UpdateBatches(const FrameInfo& frame) {
const Matrix3x4& worldTransform = node_->GetWorldTransform();
distance_ = frame.camera_->GetDistance(GetWorldBoundingBox().Center());
float scale = worldTransform.Scale().DotProduct(DOT_SCALE);
lodDistance_ = frame.camera_->GetLodDistance(distance_, scale, lodBias_);
// set distance from camera and world transform
batches_[0].distance_ = distance_;
batches_[0].worldTransform_ = &worldTransform;
}
void SphereTerrainPatch::ProcessRayQuery(const RayOctreeQuery& query,
PODVector<RayQueryResult>& results) {
RayQueryLevel level = query.level_;
switch (level) {
case RAY_AABB:
Drawable::ProcessRayQuery(query, results);
break;
case RAY_OBB:
case RAY_TRIANGLE: {
Matrix3x4 inverse(node_->GetWorldTransform().Inverse());
Ray localRay = query.ray_.Transformed(inverse);
float distance = localRay.HitDistance(boundingBox_);
Vector3 normal = -query.ray_.direction_;
if (level == RAY_TRIANGLE && distance < query.maxDistance_) {
Vector3 geometryNormal;
distance = m_pGeometry->GetHitDistance(localRay, &geometryNormal);
normal =
(node_->GetWorldTransform() * Vector4(geometryNormal, 0.0f)).Normalized();
}
if (distance < query.maxDistance_) {
RayQueryResult result;
result.position_ = query.ray_.origin_
+ distance * query.ray_.direction_;
result.normal_ = normal;
result.distance_ = distance;
result.drawable_ = this;
result.node_ = node_;
result.subObject_ = M_MAX_UNSIGNED;
results.Push(result);
}
}
break;
case RAY_TRIANGLE_UV:
URHO3D_LOGWARNING(
"RAY_TRIANGLE_UV query level is not supported for TerrainPatch component");
break;
}
}
SpereTerrainTopology
SphereTerrainTopology::SphereTerrainTopology(Context * context,
SphereTerrainPatch * Patch = nullptr) :
Object(context), m_pPatch(Patch) {
}
void SphereTerrainTopology::RegisterObject(Context* context) {
context->RegisterFactory<SphereTerrainTopology>();
}
// Build Data
void SphereTerrainTopology::GenerateTopology() {
// Vertex and Index Data
m_pVertexData = (float *) new float[6 * 3 * PATCH_VERTICES_TOTAL];
m_pIndexData = (unsigned int *) new unsigned int[PATCH_VERTICES_TOTAL * 6];
// Set Cube size
float CubeSize = 10;
// cleare data
float * pVertexReference = nullptr;
m_IndexCount = 0;
m_VertexCount = 0;
// Get Cube Center - Create Defaults
Vector3 center = Vector3::ZERO;
Vector3 direction_x = Vector3::ZERO;
Vector3 direction_y = Vector3::ZERO;
// Create a index
unsigned short index = 0;
// Element total size easier to count
unsigned int VertexElementTotalSize = 6 * 3;
STFaceDirection faceDirection = m_pPatch->GetFaceDirection();
// Get Cube Center
center = (float) CubeSize / 2 * TerrainFaceCoordinate[faceDirection];
unsigned int face = (unsigned int) faceDirection;
// Calculate direction based of x
switch (face) {
case 0:
direction_x = CubeSize * Vector3(0, -1, 0);
direction_y = CubeSize * Vector3(0, 0, 1);
break;
case 1:
direction_x = CubeSize * Vector3(0, -1, 0);
direction_y = CubeSize * Vector3(0, 0, -1);
break;
case 2:
direction_x = CubeSize * Vector3(0, 0, 1);
direction_y = CubeSize * Vector3(1, 0, 0);
break;
case 3:
direction_x = CubeSize * Vector3(0, 0, 1);
direction_y = CubeSize * Vector3(-1, 0, 0);
break;
case 4:
direction_x = CubeSize * Vector3(0, -1, 0);
direction_y = CubeSize * Vector3(-1, 0, 0);
break;
case 5:
direction_x = CubeSize * Vector3(0, -1, 0);
direction_y = CubeSize * Vector3(1, 0, 0);
break;
}
// loop through and create a grid of vertices. // do not draw edge
for (int u = 0; u < PATCH_VERTICES; u++) {
for (int v = 0; v < PATCH_VERTICES; v++) {
// Calculate patch size
Vector3 x0 = (direction_x / PATCH_VERTICES)
* (v - PATCH_VERTICES / 2);
Vector3 y0 = (direction_y / PATCH_VERTICES)
* (u - PATCH_VERTICES / 2);
// Create the vertex grid around the center of thecube face (which is passed into the function as Vector3 center).
Vector3 v0 = center + x0 + y0;
// Calculate patch size
Vector3 x1 = (direction_x / PATCH_VERTICES)
* (v - PATCH_VERTICES / 2);
Vector3 y1 = (direction_y / PATCH_VERTICES)
* ((u + 1) - PATCH_VERTICES / 2);
// Create the vertex grid around the center of thecube face (which is passed into the function as Vector3 center).
Vector3 v1 = center + x1 + y1;
// Calculate patch size
Vector3 x2 = (direction_x / PATCH_VERTICES)
* ((v + 1) - PATCH_VERTICES / 2);
Vector3 y2 = (direction_y / PATCH_VERTICES)
* (u - PATCH_VERTICES / 2);
// Create the vertex grid around the center of thecube face (which is passed into the function as Vector3 center).
Vector3 v2 = center + x2 + y2;
// Calculate patch size
Vector3 x3 = (direction_x / PATCH_VERTICES)
* ((v + 1) - PATCH_VERTICES / 2);
Vector3 y3 = (direction_y / PATCH_VERTICES)
* ((u + 1) - PATCH_VERTICES / 2);
// Create the vertex grid around the center of thecube face (which is passed into the function as Vector3 center).
Vector3 v3 = center + x3 + y3;
unsigned int position = (u * PATCH_SIZE * VertexElementTotalSize)
+ (v * VertexElementTotalSize);
pVertexReference = &m_pVertexData[position];
// copy into memory testing - quad and normal
*pVertexReference = v0.x_;
*pVertexReference++;
*pVertexReference = v0.y_;
*pVertexReference++;
*pVertexReference = v0.z_;
*pVertexReference++;
m_VertexCount++;
*pVertexReference = v1.x_;
*pVertexReference++;
*pVertexReference = v1.y_;
*pVertexReference++;
*pVertexReference = v1.z_;
*pVertexReference++;
m_VertexCount++;
*pVertexReference = v3.x_;
*pVertexReference++;
*pVertexReference = v3.y_;
*pVertexReference++;
*pVertexReference = v3.z_;
*pVertexReference++;
m_VertexCount++;
*pVertexReference = v0.x_;
*pVertexReference++;
*pVertexReference = v0.y_;
*pVertexReference++;
*pVertexReference = v0.z_;
*pVertexReference++;
m_VertexCount++;
*pVertexReference = v3.x_;
*pVertexReference++;
*pVertexReference = v3.y_;
*pVertexReference++;
*pVertexReference = v3.z_;
*pVertexReference++;
m_VertexCount++;
*pVertexReference = v2.x_;
*pVertexReference++;
*pVertexReference = v2.y_;
*pVertexReference++;
*pVertexReference = v2.z_;
*pVertexReference++;
m_VertexCount++;
m_pIndexData[index] = index;
index++;
m_pIndexData[index] = index;
index++;
m_pIndexData[index] = index;
index++;
m_pIndexData[index] = index;
index++;
m_pIndexData[index] = index;
index++;
m_pIndexData[index] = index;
index++;
}
}
// Set Index Data Size
m_IndexCount = index;
}
SphereTerrainTopology::~SphereTerrainTopology() {
}
void SphereTerrainTopology::AddTriangle(unsigned int position, Vector3 v1,
Vector3 v2, Vector3 v3)
{
float * pVertexReference = nullptr;
pVertexReference = &m_pVertexData[position];
// copy into memory testing - quad and normal
*pVertexReference = v1.x_;
*pVertexReference++;
*pVertexReference = v1.y_;
*pVertexReference++;
*pVertexReference = v1.z_;
*pVertexReference++;
m_VertexCount++;
*pVertexReference = v2.x_;
*pVertexReference++;
*pVertexReference = v2.y_;
*pVertexReference++;
*pVertexReference = v2.z_;
*pVertexReference++;
m_VertexCount++;
*pVertexReference = v3.x_;
*pVertexReference++;
*pVertexReference = v3.y_;
*pVertexReference++;
*pVertexReference = v3.z_;
*pVertexReference++;
m_VertexCount++;
m_pIndexData[position] = position;
position++;
m_pIndexData[position] = position;
position++;
m_pIndexData[position] = position;
position++;
}
unsigned int SphereTerrainTopology::GetVertexCounts() const {
return m_VertexCount;
}
;
unsigned int SphereTerrainTopology::GetIndexCounts() const {
return m_IndexCount;
}
;
Output Data
The sphere data made and put into a Geometry, IndexBuffer, and VertexBuffer in a TerrainPatch. and added to Drawable batch[0]_. FIrst 6 vertices shown.
Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Creating SphereTerrain Face 0
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Creating SphereTerrain Face 1
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Creating SphereTerrain Face 2
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Creating SphereTerrain Face 3
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Creating SphereTerrain Face 4
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Creating SphereTerrain Face 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Build SphereTerrain Face 0
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Build Terrain Node ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Generate Topology ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Create vertex data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Set vertex data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Set index data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Vertex Data (Triangles<3) ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 5 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 5 5 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 5 4.375 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 5 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 5 4.375 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 5 4.375 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] IndexData 0 1 2 3 4 5 6
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Generate bounding box ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary 5 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary 5 5 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary 5 4.375 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Build SphereTerrain Face 1
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Build Terrain Node ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Generate Topology ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Create vertex data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Set vertex data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Set index data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Vertex Data (Triangles<3) ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -5 5 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -5 5 4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -5 4.375 4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -5 5 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -5 4.375 4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -5 4.375 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] IndexData 0 1 2 3 4 5 6
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Generate bounding box ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary -5 5 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary -5 5 4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary -5 4.375 4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Build SphereTerrain Face 2
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Build Terrain Node ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Generate Topology ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Create vertex data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Set vertex data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Set index data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Vertex Data (Triangles<3) ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -5 -5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -4.375 -5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -4.375 -5 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -5 -5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -4.375 -5 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -5 -5 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] IndexData 0 1 2 3 4 5 6
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Generate bounding box ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary -5 -5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary -4.375 -5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary -4.375 -5 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Build SphereTerrain Face 3
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Build Terrain Node ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Generate Topology ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Create vertex data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Set vertex data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Set index data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Vertex Data (Triangles<3) ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 5 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 4.375 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 4.375 5 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 5 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 4.375 5 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 5 5 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] IndexData 0 1 2 3 4 5 6
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Generate bounding box ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary 5 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary 4.375 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary 4.375 5 -4.375
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Build SphereTerrain Face 4
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Build Terrain Node ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Generate Topology ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Create vertex data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Set vertex data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Set index data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Vertex Data (Triangles<3) ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 5 5 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 4.375 5 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 4.375 4.375 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 5 5 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 4.375 4.375 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData 5 4.375 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] IndexData 0 1 2 3 4 5 6
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Generate bounding box ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary 5 5 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary 4.375 5 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary 4.375 4.375 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Build SphereTerrain Face 5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Build Terrain Node ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Generate Topology ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Create vertex data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Set vertex data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Set index data ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Vertex Data (Triangles<3) ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -5 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -4.375 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -4.375 4.375 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -5 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -4.375 4.375 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] VectorData -5 4.375 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] IndexData 0 1 2 3 4 5 6
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Generate bounding box ...
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary -5 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary -4.375 5 -5
[Sat Jan 13 14:02:44 2018] INFO: [ALPHAENGINE] Adding boundary -4.375 4.375 -5
[Sat Jan 13 14:02:56 2018] INFO: [ALPHAENGINE] Game logic life time is - 0.0064151 hours 0.384906 minutes 23.0943 seconds