### Paint Material in Play Mode

There are no stupid questions, just stupid answers.

#### Re: Paint Material in Play Mode

LukasPJ
Posts: 360
Joined: Tue Feb 03, 2015 7:25 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.

#### Re: Paint Material in Play Mode

subabrain
Posts: 137
Joined: Sat Aug 20, 2016 4:58 pm

Hello LukasPJ,

THANK YOU VERY MUCH!

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

It works GREAT!

THANKS!
Robert

#### Re: Paint Material in Play Mode

LukasPJ
Posts: 360
Joined: Tue Feb 03, 2015 7:25 pm

No problem, glad to hear it's working! Good luck with your game

#### Re: Paint Material in Play Mode

subabrain
Posts: 137
Joined: Sat Aug 20, 2016 4:58 pm

Hi there,

its been a long time that i posted here my last post.
So now its all ok but i have a little question:

how can i prevent from flickering the grass while painting with this method?

would be glad to here from you

Thanks a lot -
Robert

#### Re: Paint Material in Play Mode

Duion
Posts: 874
Joined: Sun Feb 08, 2015 1:51 am

What kind of flickering you mean? You probably mean that the grass gets updated everytime you click paint or constantly if you hold mouse button.
So either make the paint a one time action and not constantly as long as you hold it or reduce the update frequency or only update when the material was changed for real.
No idea how to do that, but that are just my thoughts.

#### Who is online

Users browsing this forum: No registered users and 1 guest