We're back with another update.

First a little recap of what happened this week:

We got our own banner and logo. Thanks go out logomakr.com where we made it.

Our website is now in develpoment. I got no idea when it will be online but we're working on it.

We started using Taiga.io to manage the development. It was frustraing to just have a good a idea or realised something that needed fixing/reworking in the concept and just forget about it or have it in an unorganised text file.

We got a new team member: Helices, who will function as a Biology Advisor to this project.

On that note: We are reworking the cell stage to be more realistic (as far as it doesn't sabotage fun gameplay in any way). We will do another entry on that once we deem it presentable.

On the actual development front:

The procedural meshes now work mostly as intended. They are being generated randomly from a basic cube shape with 26 vertices. For now that should work and adding more is basically just busywork if we really need more than that. When the player collides with this mesh all vertices with a distance to the player that's within a certain threshold will move away from the player based on a vector from the player center to the vertex. This functionality is planned out so far but not implemented. Slicing the mesh will be the next, more complicated step.

Next thing I will be working on besides the website: The procedural environment. Since it would be pretty silly to just but up barriers around the map it should be infinite. To make this feasible all content has to be procedurally generated around the player. Logically it will be deleted again as soon as the player has a certain distance to it. This is true for all passive, floating objects, compound clouds and other cells. The distance should be high enough to feel natural for there to be change but also not so high that it affects the framerate.

The rework on the cell stage results in there being five new compounds replacing the previous ones: CO2, Oxygen, Amino Acids, Glucose and Lipids. The will definitely be differentiated by their color and maybe by the shape of the clouds if it is deemed useful for the player and doable for a programmer.

Interaction with other cells will be an interesting part. I don't want to unveil anything that will be part of the cell stage rework but I'll tell you everything we have for certain: To absorb other cells you simply have to move over them. If you have 30% more mass than they do - which is calculated via your organelles and your cytoplasm - you will absorb them and vice versa.

One thing we want to get sort of experimental with is sound. Despite the background music there will be no ingame sound effects. And even the background music will mostly consist of some atmospheric sounds. So far there was no time to prototype this but we will try to get to it soon but for now planning and coding has a higher priority.

That's it for this week's update. I'll leave you with a little insight into our code with which we generate the compound cloud mesh.

void ACompoundCloud_Cell::CreateCloudMesh()
{
//vertex buffer
//TArray<FVector> vertices;
//Front
vertices.Add(FVector(50.f, -50.f, -50.f));//0
vertices.Add(FVector(50.f, 0.f, -50.f));
vertices.Add(FVector(50.f, 50.f, -50.f));
vertices.Add(FVector(StaticMaths::RR(50.f, 150.f), StaticMaths::RR(-150.f,-50.f), 0.f));
vertices.Add(FVector(StaticMaths::RR(100.f, 200.f), 0.f, 0.f));
vertices.Add(FVector(StaticMaths::RR(50.f, 150.f), StaticMaths::RR(50.f, 150.f), 0.f));//5
vertices.Add(FVector(50.f, -50.f, 50.f));
vertices.Add(FVector(50.f, 0.f, 50.f));
vertices.Add(FVector(50.f, 50.f, 50.f));
//Left
//2
vertices.Add(FVector(0.f, 50.f, -50.f));
vertices.Add(FVector(-50.f, 50.f, -50.f)); //10
//5
vertices.Add(FVector(0.f, StaticMaths::RR(100.f, 200.f), 0.f));
vertices.Add(FVector(StaticMaths::RR(-150.f, -50.f), StaticMaths::RR(50.f, 150.f), 0.f));
//8
vertices.Add(FVector(0.f, 50.f, 50.f));
vertices.Add(FVector(-50.f, 50.f, 50.f));
//Back
//10
vertices.Add(FVector(-50.f, 0.f, -50.f)); //15
vertices.Add(FVector(-50.f, -50.f, -50.f));
//12
vertices.Add(FVector(StaticMaths::RR(-200.f, -100.f), 0.f, 0.f));
vertices.Add(FVector(StaticMaths::RR(-150.f, -50.f), StaticMaths::RR(-150.f, -50.f), 0.f));
//14
vertices.Add(FVector(-50.f, 0.f, 50.f));
vertices.Add(FVector(-50.f, -50.f, 50.f));//20
//Left
//16
vertices.Add(FVector(0.f, -50.f, -50.f));
//0
//18
vertices.Add(FVector(0.f, StaticMaths::RR(-200.f, -100.f), 0.f));
//3
//20
vertices.Add(FVector(0.f, -50.f, 50.f));
//6
//Bottom
//16
//15
//10
//21
vertices.Add(FVector(0.f, 0.f, -50.f));
//9
//0
//1
//2
//Top
//6
//7
//8
//23
vertices.Add(FVector(0.f, 0.f, 50.f)); //25
//13
//20
//19
//14
//index buffer
//+++++ Front
//Lower Left
indices.Add(3);
indices.Add(1);
indices.Add(0);
indices.Add(1);
indices.Add(3);
indices.Add(4);
//Lower Right
indices.Add(4);
indices.Add(2);
indices.Add(1);
indices.Add(2);
indices.Add(4);
indices.Add(5);
//Upper Left
indices.Add(6);
indices.Add(4);
indices.Add(3);
indices.Add(4);
indices.Add(6);
indices.Add(7);
//Upper Right
indices.Add(7);
indices.Add(5);
indices.Add(4);
indices.Add(5);
indices.Add(7);
indices.Add(8);
//+++++ Right
//Lower Left
indices.Add(5);
indices.Add(9);
indices.Add(2);
indices.Add(9);
indices.Add(5);
indices.Add(11);
//Lower Right
indices.Add(11);
indices.Add(10);
indices.Add(9);
indices.Add(10);
indices.Add(11);
indices.Add(12);
//Upper Left
indices.Add(8);
indices.Add(11);
indices.Add(5);
indices.Add(11);
indices.Add(8);
indices.Add(13);
//Upper Right
indices.Add(13);
indices.Add(12);
indices.Add(11);
indices.Add(12);
indices.Add(13);
indices.Add(14);
//+++++ Back
//Lower Left
indices.Add(12);
indices.Add(15);
indices.Add(10);
indices.Add(15);
indices.Add(12);
indices.Add(17);
//LowerRight
indices.Add(17);
indices.Add(16);
indices.Add(15);
indices.Add(16);
indices.Add(17);
indices.Add(18);
//Upper Left
indices.Add(14);
indices.Add(17);
indices.Add(12);
indices.Add(17);
indices.Add(14);
indices.Add(19);
//Upper Right
indices.Add(19);
indices.Add(18);
indices.Add(17);
indices.Add(18);
indices.Add(19);
indices.Add(20);
//+++++ Left
//Lower Left
indices.Add(18);
indices.Add(21);
indices.Add(16);
indices.Add(21);
indices.Add(18);
indices.Add(22);
//Lower Right
indices.Add(22);
indices.Add(0);
indices.Add(21);
indices.Add(0);
indices.Add(22);
indices.Add(3);
//Upper Left
indices.Add(20);
indices.Add(22);
indices.Add(18);
indices.Add(22);
indices.Add(20);
indices.Add(23);
//Upper Right
indices.Add(23);
indices.Add(3);
indices.Add(22);
indices.Add(3);
indices.Add(23);
indices.Add(6);
//+++++ Bottom
//Lower Left
indices.Add(21);
indices.Add(15);
indices.Add(16);
indices.Add(15);
indices.Add(21);
indices.Add(24);
//Lower Right
indices.Add(24);
indices.Add(10);
indices.Add(15);
indices.Add(10);
indices.Add(24);
indices.Add(9);
//Upper Left
indices.Add(0);
indices.Add(24);
indices.Add(21);
indices.Add(24);
indices.Add(0);
indices.Add(1);
//Upper Right
indices.Add(1);
indices.Add(9);
indices.Add(24);
indices.Add(9);
indices.Add(1);
indices.Add(2);
//+++++ Top
//Lower Left
indices.Add(23);
indices.Add(7);
indices.Add(6);
indices.Add(7);
indices.Add(23);
indices.Add(25);
//Lower Right
indices.Add(25);
indices.Add(8);
indices.Add(7);
indices.Add(8);
indices.Add(25);
indices.Add(13);
//Upper Left
indices.Add(20);
indices.Add(25);
indices.Add(23);
indices.Add(25);
indices.Add(20);
indices.Add(19);
//Upper Right
indices.Add(19);
indices.Add(13);
indices.Add(25);
indices.Add(13);
indices.Add(19);
indices.Add(14);
TArray<FVector> normals;
for (int i = 0; i < vertices.Num(); i++)
{
normals.Add(vertices[i] / vertices[i].Size());
}
TArray<FVector2D> uv0;
TArray<FProcMeshTangent> tangents;
////The colors applied to every vertex and blended on the surfaces
TArray<FLinearColor> vertexColors;
mesh->CreateMeshSection_LinearColor(0, vertices, indices, normals, uv0, vertexColors, tangents, true);
//Enable collision data
mesh->ContainsPhysicsTriMeshData(true);
mesh->bUseComplexAsSimpleCollision = false;
mesh->SetSimulatePhysics(true);
}

If you made it to this part you probably read the code and in that case: We are still looking for anyone who wants to contribute to this journy into the unknown. And please don't look at me like that, the code is functional if not beautiful.

Thanks, bye.