Paint Material in Play Mode

There are no stupid questions, just stupid answers.
23 posts Page 3 of 3
LukasPJ
Site Admin
Posts: 358
Joined: Tue Feb 03, 2015 7:25 pm
 
by LukasPJ » Wed Nov 22, 2017 10:57 pm
Alright so the issue is that the Terrain Editor isn't properly initialized, and it doesn't have a terrain. You have to either re-implement its getTerrainUnderWorldPoint method, or do something similar. I opted for a simple ray-trace.

Furthermore there were two GridInfo variables, and the scheduleMaterialUpdate doesn't work the way we use it.

Here is a working example:

DefineEngineFunction(paintTerrainUnderPlayer, void, (U32 mat), (1), "")
{
// Create a new instance of the TerrainEditor so we can use its functionality.
TerrainEditor *mTerrainEditor = new TerrainEditor();

// Get the connection to the player.
GameConnection* connection = GameConnection::getConnectionToServer();

// Fetch the player.
Player* playerObject = dynamic_cast< Player* >(connection->getControlObject());

// Get the player's position.
Point3F pos = playerObject->getPosition();
// Grab a point above the player.
pos.z + 5;

// Fetch the terrain with a ray-trace. There are probably more efficient ways to get this.
TerrainBlock *terrain;
RayInfo r;
bool hit = gClientContainer.castRay(pos, Point3F(pos.x, pos.y, pos.z - 1000), TerrainObjectType, &r);
if (hit) {
terrain = dynamic_cast<TerrainBlock*>(r.object);
}

// Initialize the GridInfo and GridPoint that our player's position maps to.
GridInfo gi;
GridPoint gp;

// Specify the terrain this GridPoint belongs to.
gp.terrainBlock = terrain;

// Map the player position to a point on the grid.
gp.gridPos = gp.terrainBlock->getGridPos(pos);

// Get the Terrain information at that point on the grid (such as texture, height etc.)
mTerrainEditor->getGridInfo(gp, gi);

// Map the material as dirty.
gi.mMaterialChanged = true;

// Change the material (to a layer which can be between 0 and 31).
gi.mMaterial = mat;

// Update the grid.
mTerrainEditor->setGridInfo(gi, true);

// Repaint the terrain.
terrain->updateGridMaterials(gp.gridPos, gp.gridPos);
}


Tested it on newest Development branch and it works. Notice that the "mat" parameter, is the index of the desired texture layer as they are ordered in the TerrainPainter.
Furthermore this code is designed to run client-side in a single-player scenario. You would have to do some extra tricks to make it work in multiplayer.
subabrain
Posts: 136
Joined: Sat Aug 20, 2016 4:58 pm
 
by subabrain » Thu Nov 23, 2017 7:24 pm
Hello LukasPJ,

THANK YOU VERY MUCH!

YOURE THE BEST!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

It works GREAT!


THANKS!
Robert
LukasPJ
Site Admin
Posts: 358
Joined: Tue Feb 03, 2015 7:25 pm
 
by LukasPJ » Fri Nov 24, 2017 8:38 pm
No problem, glad to hear it's working! Good luck with your game :)
23 posts Page 3 of 3

Who is online

Users browsing this forum: No registered users and 1 guest