I am trying to deform mesh using vertex shader but some how its not working.
What I am trying to do in code is as below
- passing the point as pick point and radios to deform surface
- passing boolean parameter to switch deformation
- in vertex shader calculating the current position, if its around picked point withing radios on X, Z than change the Y position of the current position
Also what is the result of “CollisionResults.getContactPoint()” ? is it point of mesh surface or related to boundingbox? is it world coordinate or local coordinate?
Java Code
Spatial surface = assetManager.loadModel("Models/BaseSnow/BaseSnow.j3o");
Material mat = new Material(assetManager, "MatDefs/Deform/Deform.j3md");
mat.setTexture("ColorMap", assetManager.loadTexture("Models/BaseSnow/sparkling-snow-texture.jpg"));
mat.getAdditionalRenderState().setFaceCullMode(RenderState.FaceCullMode.Off);
mat.setBoolean("DoDeform", true);
surface.setMaterial(mat);
rootNode.attachChild(surface);
inputManager.addMapping("RIGHT_CLICK", RIGHT_CLICK);
inputManager.addMapping("LEFT_CLICK", LEFT_CLICK);
inputManager.addListener((ActionListener) (String name, boolean isPressed, float tpf) -> {
if (name.equals("RIGHT_CLICK")) {
} else if (name.equals("LEFT_CLICK")) {
Ray ray = new Ray(cam.getLocation(), cam.getDirection());
CollisionResults results = new CollisionResults();
int resCount = surface.collideWith(ray, results);
if (resCount > 0) {
Vector3f point = results.getClosestCollision().getContactPoint();
// point = surface.worldToLocal(point, new Vector3f());
// point = surface.localToWorld(point, new Vector3f());
point.setY(point.y / 2);
System.out.println(point);
mat.setVector3("PickPoint", point);
mat.setFloat("Radios", .5f);
}
}
}, "RIGHT_CLICK", "LEFT_CLICK");
}
J3MD
MaterialDef Simple {
MaterialParameters {
Color Color
Texture2D ColorMap
Vector3 PickPoint
Vector3Array PointsToDeform
Float LowestHeight
Float HeighestHeight
Float Radios
Boolean DoDeform
}
Technique {
VertexShader GLSL100: MatDefs/Deform/Deform.vert
FragmentShader GLSL100: MatDefs/Deform/Deform.frag
WorldParameters {
WorldViewProjectionMatrix
WorldViewMatrix
Time
}
Defines {
COLOR : Color
COLORMAP : ColorMap
}
}
}
Vertex Code
attribute vec3 inPosition;
attribute vec4 inTexCoord;
attribute vec3 inPickPoint;
attribute float inLowestHeight;
attribute float inHeighestHeight;
attribute float inRadios;
bool inDoDeform = false;
uniform mat4 g_WorldViewProjectionMatrix;
uniform mat4 g_WorldViewMatrix;
uniform float g_Time;
varying vec4 vertextPosition;
varying vec4 texCoord;
void main() {
texCoord = inTexCoord;
if(inDoDeform) {
float dx = inPickPoint.x - inPosition.x;
float dy = inPickPoint.z - inPosition.z;
float distanceSquared = (dx * dx + dy * dy);
float distance = sqrt(distanceSquared);
float pickY = inPickPoint.y;
float posY = inPosition.y;
if(distance <= inRadios && pickY < posY){
if(inPickPoint.x == inPosition.x){
vec3 newPos = vec3(inPosition.x, pickY, inPosition.z);
vec4 position = vec4(newPos, 1.0);
gl_Position = g_WorldViewProjectionMatrix * position;
} else {
gl_Position = g_WorldViewProjectionMatrix * vec4(inPosition, 1.0);
}
} else {
gl_Position = g_WorldViewProjectionMatrix * vec4(inPosition, 1.0);
}
}
Frag Code
#ifdef COLOR
uniform vec4 m_Color;
#endif
#ifdef COLORMAP
uniform sampler2D m_ColorMap;
#endif
varying vec4 vertextPosition;
varying vec4 texCoord;
void main() {
vec4 color = vec4(1.0);
#ifdef COLOR
color = m_Color;
#endif
#ifdef COLORMAP
color *= texture2D(m_ColorMap, texCoord.xy);
#endif
gl_FragColor = color;
}