Paint Material in Play Mode

There are no stupid questions, just stupid answers.
27 posts Page 3 of 3
LukasPJ
Site Admin
Posts: 361
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: 138
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: 361
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 :)
subabrain
Posts: 138
Joined: Sat Aug 20, 2016 4:58 pm
 
by subabrain » Fri Jan 19, 2018 2:22 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
Duion
Posts: 882
Joined: Sun Feb 08, 2015 1:51 am
 
by Duion » Fri Jan 19, 2018 3:35 pm
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.
subabrain
Posts: 138
Joined: Sat Aug 20, 2016 4:58 pm
 
by subabrain » Mon Jan 22, 2018 9:48 am
Hello,

sorry for the long delay - i think it has to do with the painting interval. and it paints the groundcover completely new. so i have to reduce the interval - but i need it :/
Maybe i can reduce the radius of the groundcover (grass) but i think it isnt working ... - maybe you know some way to reduce this "flickering".

Thank you very much!

Greetings
Robert
Bloodknight
Posts: 105
Joined: Tue Feb 03, 2015 8:58 pm
by Bloodknight » Tue Jan 23, 2018 10:21 pm
the grass gets rendered every render tick, mostly because it's animated, perhaps you could add a flag so that it skips most of the cycles while painting so that it only updates every few seconds. I'm not sure how one would fix this permanently since groundcover is now the only method of adding grass, but poke around in the render bins and see what you can do.
27 posts Page 3 of 3

Who is online

Users browsing this forum: No registered users and 2 guests