Add Cyclone Tool and Brush X/Y Arguments (#542)
This commit is contained in:
parent
30b8078ad2
commit
0a63e1afb5
@ -194,7 +194,7 @@ class {0}: public SimTool
|
|||||||
public:
|
public:
|
||||||
{0}();
|
{0}();
|
||||||
virtual ~{0}();
|
virtual ~{0}();
|
||||||
virtual int Perform(Simulation * sim, Particle * cpart, int x, int y, float strength);
|
virtual int Perform(Simulation * sim, Particle * cpart, int x, int y, int brushX, int brushY, float strength);
|
||||||
}};
|
}};
|
||||||
""".format(className, str.join("\n", classMembers))
|
""".format(className, str.join("\n", classMembers))
|
||||||
|
|
||||||
|
@ -1192,7 +1192,7 @@ void Simulation::ApplyDecorationFill(Renderer *ren, int x, int y, int colR, int
|
|||||||
free(bitmap);
|
free(bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Simulation::Tool(int x, int y, int tool, float strength)
|
int Simulation::Tool(int x, int y, int tool, int brushX, int brushY, float strength)
|
||||||
{
|
{
|
||||||
if(tools[tool])
|
if(tools[tool])
|
||||||
{
|
{
|
||||||
@ -1202,7 +1202,7 @@ int Simulation::Tool(int x, int y, int tool, float strength)
|
|||||||
cpart = &(parts[ID(r)]);
|
cpart = &(parts[ID(r)]);
|
||||||
else if ((r = photons[y][x]))
|
else if ((r = photons[y][x]))
|
||||||
cpart = &(parts[ID(r)]);
|
cpart = &(parts[ID(r)]);
|
||||||
return tools[tool]->Perform(this, cpart, x, y, strength);
|
return tools[tool]->Perform(this, cpart, x, y, brushX, brushY, strength);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1216,7 +1216,7 @@ int Simulation::ToolBrush(int positionX, int positionY, int tool, Brush * cBrush
|
|||||||
for(int y = 0; y < sizeY; y++)
|
for(int y = 0; y < sizeY; y++)
|
||||||
for(int x = 0; x < sizeX; x++)
|
for(int x = 0; x < sizeX; x++)
|
||||||
if(bitmap[(y*sizeX)+x] && (positionX+(x-radiusX) >= 0 && positionY+(y-radiusY) >= 0 && positionX+(x-radiusX) < XRES && positionY+(y-radiusY) < YRES))
|
if(bitmap[(y*sizeX)+x] && (positionX+(x-radiusX) >= 0 && positionY+(y-radiusY) >= 0 && positionX+(x-radiusX) < XRES && positionY+(y-radiusY) < YRES))
|
||||||
Tool(positionX+(x-radiusX), positionY+(y-radiusY), tool, strength);
|
Tool(positionX + (x - radiusX), positionY + (y - radiusY), tool, positionX, positionY, strength);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1275,6 +1275,9 @@ void Simulation::ToolLine(int x1, int y1, int x2, int y2, int tool, Brush * cBru
|
|||||||
}
|
}
|
||||||
void Simulation::ToolBox(int x1, int y1, int x2, int y2, int tool, float strength)
|
void Simulation::ToolBox(int x1, int y1, int x2, int y2, int tool, float strength)
|
||||||
{
|
{
|
||||||
|
int brushX, brushY;
|
||||||
|
brushX = ((x1 + x2) / 2);
|
||||||
|
brushY = ((y1 + y2) / 2);
|
||||||
int i, j;
|
int i, j;
|
||||||
if (x1>x2)
|
if (x1>x2)
|
||||||
{
|
{
|
||||||
@ -1290,7 +1293,7 @@ void Simulation::ToolBox(int x1, int y1, int x2, int y2, int tool, float strengt
|
|||||||
}
|
}
|
||||||
for (j=y1; j<=y2; j++)
|
for (j=y1; j<=y2; j++)
|
||||||
for (i=x1; i<=x2; i++)
|
for (i=x1; i<=x2; i++)
|
||||||
Tool(i, j, tool, strength);
|
Tool(i, j, tool, brushX, brushY, strength);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Simulation::CreateWalls(int x, int y, int rx, int ry, int wall, Brush * cBrush)
|
int Simulation::CreateWalls(int x, int y, int rx, int ry, int wall, Brush * cBrush)
|
||||||
|
@ -177,7 +177,7 @@ public:
|
|||||||
void ApplyDecorationFill(Renderer *ren, int x, int y, int colR, int colG, int colB, int colA, int replaceR, int replaceG, int replaceB);
|
void ApplyDecorationFill(Renderer *ren, int x, int y, int colR, int colG, int colB, int colA, int replaceR, int replaceG, int replaceB);
|
||||||
|
|
||||||
//Drawing Tools like HEAT, AIR, and GRAV
|
//Drawing Tools like HEAT, AIR, and GRAV
|
||||||
int Tool(int x, int y, int tool, float strength = 1.0f);
|
int Tool(int x, int y, int tool, int brushX, int brushY, float strength = 1.0f);
|
||||||
int ToolBrush(int x, int y, int tool, Brush * cBrush, float strength = 1.0f);
|
int ToolBrush(int x, int y, int tool, Brush * cBrush, float strength = 1.0f);
|
||||||
void ToolLine(int x1, int y1, int x2, int y2, int tool, Brush * cBrush, float strength = 1.0f);
|
void ToolLine(int x1, int y1, int x2, int y2, int tool, Brush * cBrush, float strength = 1.0f);
|
||||||
void ToolBox(int x1, int y1, int x2, int y2, int tool, float strength = 1.0f);
|
void ToolBox(int x1, int y1, int x2, int y2, int tool, float strength = 1.0f);
|
||||||
|
@ -9,7 +9,7 @@ Tool_Air::Tool_Air()
|
|||||||
Description = "Air, creates airflow and pressure.";
|
Description = "Air, creates airflow and pressure.";
|
||||||
}
|
}
|
||||||
|
|
||||||
int Tool_Air::Perform(Simulation * sim, Particle * cpart, int x, int y, float strength)
|
int Tool_Air::Perform(Simulation * sim, Particle * cpart, int x, int y, int brushX, int brushY, float strength)
|
||||||
{
|
{
|
||||||
sim->air->pv[y/CELL][x/CELL] += strength*0.05f;
|
sim->air->pv[y/CELL][x/CELL] += strength*0.05f;
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ Tool_Cool::Tool_Cool()
|
|||||||
Description = "Cools the targeted element.";
|
Description = "Cools the targeted element.";
|
||||||
}
|
}
|
||||||
|
|
||||||
int Tool_Cool::Perform(Simulation * sim, Particle * cpart, int x, int y, float strength)
|
int Tool_Cool::Perform(Simulation * sim, Particle * cpart, int x, int y, int brushX, int brushY, float strength)
|
||||||
{
|
{
|
||||||
if(!cpart)
|
if(!cpart)
|
||||||
return 0;
|
return 0;
|
||||||
|
45
src/simulation/simtools/Cyclone.cpp
Normal file
45
src/simulation/simtools/Cyclone.cpp
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#include "ToolClasses.h"
|
||||||
|
#include "simulation/Air.h"
|
||||||
|
//#TPT-Directive ToolClass Tool_Cycl TOOL_CYCL 8
|
||||||
|
Tool_Cycl::Tool_Cycl()
|
||||||
|
{
|
||||||
|
Identifier = "DEFAULT_TOOL_CYCL";
|
||||||
|
Name = "CYCL";
|
||||||
|
Colour = PIXPACK(0x132f5b);
|
||||||
|
Description = "Cyclone. Produces swirling air currents";
|
||||||
|
}
|
||||||
|
|
||||||
|
int Tool_Cycl::Perform(Simulation * sim, Particle * cpart, int x, int y, int brushX, int brushY, float strength)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Air velocity calculation.
|
||||||
|
Air velocity X = cosine of cell angle
|
||||||
|
Angle of cell is calculated via cells X/Y relation to the brush center and arctangent
|
||||||
|
Angle has 1.57 radians added to it (90 degrees) in order to make the velocity be at 90 degrees to the centerpoint.
|
||||||
|
Ditto for X, except X uses sine
|
||||||
|
*/
|
||||||
|
// only trigger once per cell (less laggy)
|
||||||
|
if ((x%CELL) == 0 && (y%CELL) == 0)
|
||||||
|
{
|
||||||
|
float *vx = &sim->air->vx[y/CELL][x/CELL];
|
||||||
|
float *vy = &sim->air->vy[y/CELL][x/CELL];
|
||||||
|
|
||||||
|
*vx -= (strength / 16) * (cos(1.57f + (atan2(brushY - y, brushX - x))));
|
||||||
|
*vy -= (strength / 16) * (sin(1.57f + (atan2(brushY - y, brushX - x))));
|
||||||
|
|
||||||
|
// Clamp velocities
|
||||||
|
if (*vx > 256.0f)
|
||||||
|
*vx = 256.0f;
|
||||||
|
else if (*vx < -256.0f)
|
||||||
|
*vx = -256.0f;
|
||||||
|
if (*vy > 256.0f)
|
||||||
|
*vy = 256.0f;
|
||||||
|
else if (*vy < -256.0f)
|
||||||
|
*vy = -256.0f;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Tool_Cycl::~Tool_Cycl() {}
|
@ -8,7 +8,7 @@ Tool_Heat::Tool_Heat()
|
|||||||
Description = "Heats the targeted element.";
|
Description = "Heats the targeted element.";
|
||||||
}
|
}
|
||||||
|
|
||||||
int Tool_Heat::Perform(Simulation * sim, Particle * cpart, int x, int y, float strength)
|
int Tool_Heat::Perform(Simulation * sim, Particle * cpart, int x, int y, int brushX, int brushY, float strength)
|
||||||
{
|
{
|
||||||
if(!cpart)
|
if(!cpart)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -8,7 +8,7 @@ Tool_Mix::Tool_Mix()
|
|||||||
Description = "Mixes particles.";
|
Description = "Mixes particles.";
|
||||||
}
|
}
|
||||||
|
|
||||||
int Tool_Mix::Perform(Simulation * sim, Particle * cpart, int x, int y, float strength)
|
int Tool_Mix::Perform(Simulation * sim, Particle * cpart, int x, int y, int brushX, int brushY, float strength)
|
||||||
{
|
{
|
||||||
int thisPart = sim->pmap[y][x];
|
int thisPart = sim->pmap[y][x];
|
||||||
if(!thisPart)
|
if(!thisPart)
|
||||||
|
@ -9,7 +9,7 @@ Tool_NGrv::Tool_NGrv()
|
|||||||
Description = "Creates a short-lasting negative gravity well.";
|
Description = "Creates a short-lasting negative gravity well.";
|
||||||
}
|
}
|
||||||
|
|
||||||
int Tool_NGrv::Perform(Simulation * sim, Particle * cpart, int x, int y, float strength)
|
int Tool_NGrv::Perform(Simulation * sim, Particle * cpart, int x, int y, int brushX, int brushYy, float strength)
|
||||||
{
|
{
|
||||||
sim->gravmap[((y/CELL)*(XRES/CELL))+(x/CELL)] = strength*-5.0f;
|
sim->gravmap[((y/CELL)*(XRES/CELL))+(x/CELL)] = strength*-5.0f;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -9,7 +9,7 @@ Tool_PGrv::Tool_PGrv()
|
|||||||
Description = "Creates a short-lasting gravity well.";
|
Description = "Creates a short-lasting gravity well.";
|
||||||
}
|
}
|
||||||
|
|
||||||
int Tool_PGrv::Perform(Simulation * sim, Particle * cpart, int x, int y, float strength)
|
int Tool_PGrv::Perform(Simulation * sim, Particle * cpart, int x, int y, int brushX, int brushY, float strength)
|
||||||
{
|
{
|
||||||
sim->gravmap[((y/CELL)*(XRES/CELL))+(x/CELL)] = strength*5.0f;
|
sim->gravmap[((y/CELL)*(XRES/CELL))+(x/CELL)] = strength*5.0f;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -17,7 +17,7 @@ public:
|
|||||||
|
|
||||||
SimTool();
|
SimTool();
|
||||||
virtual ~SimTool() {}
|
virtual ~SimTool() {}
|
||||||
virtual int Perform(Simulation * sim, Particle * cpart, int x, int y, float strength) { return 0; }
|
virtual int Perform(Simulation * sim, Particle * cpart, int x, int y, int brushX, int brushY, float strength) { return 0; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,7 +9,7 @@ Tool_Vac::Tool_Vac()
|
|||||||
Description = "Vacuum, reduces air pressure.";
|
Description = "Vacuum, reduces air pressure.";
|
||||||
}
|
}
|
||||||
|
|
||||||
int Tool_Vac::Perform(Simulation * sim, Particle * cpart, int x, int y, float strength)
|
int Tool_Vac::Perform(Simulation * sim, Particle * cpart, int x, int y, int brushX, int brushY, float strength)
|
||||||
{
|
{
|
||||||
sim->air->pv[y/CELL][x/CELL] -= strength*0.05f;
|
sim->air->pv[y/CELL][x/CELL] -= strength*0.05f;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user