commit
6a1383a155
@ -0,0 +1,97 @@ |
|||||||
|
/* |
||||||
|
* To change this license header, choose License Headers in Project Properties. |
||||||
|
* To change this template file, choose Tools | Templates |
||||||
|
* and open the template in the editor. |
||||||
|
*/ |
||||||
|
package com.jme3.util.mikktspace; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author Nehon |
||||||
|
*/ |
||||||
|
public interface MikkTSpaceContext { |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the number of faces (triangles/quads) on the mesh to be |
||||||
|
* processed. |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public int getNumFaces(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the number of vertices on face number iFace iFace is a number in |
||||||
|
* the range {0, 1, ..., getNumFaces()-1} |
||||||
|
* |
||||||
|
* @param face |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public int getNumVerticesOfFace(int face); |
||||||
|
|
||||||
|
/** |
||||||
|
* returns the position/normal/texcoord of the referenced face of vertex |
||||||
|
* number iVert. iVert is in the range {0,1,2} for triangles and {0,1,2,3} |
||||||
|
* for quads. |
||||||
|
* |
||||||
|
* @param posOut |
||||||
|
* @param face |
||||||
|
* @param vert |
||||||
|
*/ |
||||||
|
public void getPosition(float posOut[], int face, int vert); |
||||||
|
|
||||||
|
public void getNormal(float normOut[], int face, int vert); |
||||||
|
|
||||||
|
public void getTexCoord(float texOut[], int face, int vert); |
||||||
|
|
||||||
|
/** |
||||||
|
* The call-backsetTSpaceBasic() is sufficient for basic normal mapping. |
||||||
|
* This function is used to return the tangent and sign to the application. |
||||||
|
* tangent is a unit length vector. For normal maps it is sufficient to use |
||||||
|
* the following simplified version of the bitangent which is generated at |
||||||
|
* pixel/vertex level. |
||||||
|
* |
||||||
|
* bitangent = fSign * cross(vN, tangent); |
||||||
|
* |
||||||
|
* Note that the results are returned unindexed. It is possible to generate |
||||||
|
* a new index list But averaging/overwriting tangent spaces by using an |
||||||
|
* already existing index list WILL produce INCRORRECT results. DO NOT! use |
||||||
|
* an already existing index list. |
||||||
|
* |
||||||
|
* @param tangent |
||||||
|
* @param sign |
||||||
|
* @param face |
||||||
|
* @param vert |
||||||
|
*/ |
||||||
|
public void setTSpaceBasic(float tangent[], float sign, int face, int vert); |
||||||
|
|
||||||
|
/** |
||||||
|
* This function is used to return tangent space results to the application. |
||||||
|
* tangent and biTangent are unit length vectors and fMagS and fMagT are |
||||||
|
* their true magnitudes which can be used for relief mapping effects. |
||||||
|
* |
||||||
|
* biTangent is the "real" bitangent and thus may not be perpendicular to |
||||||
|
* tangent. However, both are perpendicular to the vertex normal. For normal |
||||||
|
* maps it is sufficient to use the following simplified version of the |
||||||
|
* bitangent which is generated at pixel/vertex level. |
||||||
|
* |
||||||
|
* <pre> |
||||||
|
* fSign = bIsOrientationPreserving ? 1.0f : (-1.0f); |
||||||
|
* bitangent = fSign * cross(vN, tangent); |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* Note that the results are returned unindexed. It is possible to generate |
||||||
|
* a new index list. But averaging/overwriting tangent spaces by using an |
||||||
|
* already existing index list WILL produce INCRORRECT results. DO NOT! use |
||||||
|
* an already existing index list. |
||||||
|
* |
||||||
|
* @param tangent |
||||||
|
* @param biTangent |
||||||
|
* @param magS |
||||||
|
* @param magT |
||||||
|
* @param isOrientationPreserving |
||||||
|
* @param face |
||||||
|
* @param vert |
||||||
|
*/ |
||||||
|
void setTSpace(float tangent[], float biTangent[], float magS, float magT, |
||||||
|
boolean isOrientationPreserving, int face, int vert); |
||||||
|
} |
@ -0,0 +1,100 @@ |
|||||||
|
/* |
||||||
|
* To change this license header, choose License Headers in Project Properties. |
||||||
|
* To change this template file, choose Tools | Templates |
||||||
|
* and open the template in the editor. |
||||||
|
*/ |
||||||
|
package com.jme3.util.mikktspace; |
||||||
|
|
||||||
|
import com.jme3.scene.Mesh; |
||||||
|
import com.jme3.scene.VertexBuffer; |
||||||
|
import com.jme3.scene.mesh.IndexBuffer; |
||||||
|
import com.jme3.util.BufferUtils; |
||||||
|
import java.nio.FloatBuffer; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author Nehon |
||||||
|
*/ |
||||||
|
public class MikkTSpaceImpl implements MikkTSpaceContext { |
||||||
|
|
||||||
|
Mesh mesh; |
||||||
|
|
||||||
|
public MikkTSpaceImpl(Mesh mesh) { |
||||||
|
this.mesh = mesh; |
||||||
|
VertexBuffer tangentBuffer = mesh.getBuffer(VertexBuffer.Type.Tangent); |
||||||
|
if(tangentBuffer == null){ |
||||||
|
FloatBuffer fb = BufferUtils.createFloatBuffer(mesh.getVertexCount() * 4); |
||||||
|
mesh.setBuffer(VertexBuffer.Type.Tangent, 4, fb); |
||||||
|
} |
||||||
|
|
||||||
|
//TODO ensure the Tangent buffer exists, else create one.
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getNumFaces() { |
||||||
|
return mesh.getTriangleCount(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int getNumVerticesOfFace(int face) { |
||||||
|
return 3; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void getPosition(float[] posOut, int face, int vert) { |
||||||
|
int vertIndex = getIndex(face, vert); |
||||||
|
VertexBuffer position = mesh.getBuffer(VertexBuffer.Type.Position); |
||||||
|
FloatBuffer pos = (FloatBuffer) position.getData(); |
||||||
|
pos.position(vertIndex * 3); |
||||||
|
posOut[0] = pos.get(); |
||||||
|
posOut[1] = pos.get(); |
||||||
|
posOut[2] = pos.get(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void getNormal(float[] normOut, int face, int vert) { |
||||||
|
int vertIndex = getIndex(face, vert); |
||||||
|
VertexBuffer normal = mesh.getBuffer(VertexBuffer.Type.Normal); |
||||||
|
FloatBuffer norm = (FloatBuffer) normal.getData(); |
||||||
|
norm.position(vertIndex * 3); |
||||||
|
normOut[0] = norm.get(); |
||||||
|
normOut[1] = norm.get(); |
||||||
|
normOut[2] = norm.get(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void getTexCoord(float[] texOut, int face, int vert) { |
||||||
|
int vertIndex = getIndex(face, vert); |
||||||
|
VertexBuffer texCoord = mesh.getBuffer(VertexBuffer.Type.TexCoord); |
||||||
|
FloatBuffer tex = (FloatBuffer) texCoord.getData(); |
||||||
|
tex.position(vertIndex * 2); |
||||||
|
texOut[0] = tex.get(); |
||||||
|
texOut[1] = tex.get(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setTSpaceBasic(float[] tangent, float sign, int face, int vert) { |
||||||
|
int vertIndex = getIndex(face, vert); |
||||||
|
VertexBuffer tangentBuffer = mesh.getBuffer(VertexBuffer.Type.Tangent); |
||||||
|
FloatBuffer tan = (FloatBuffer) tangentBuffer.getData(); |
||||||
|
|
||||||
|
tan.position(vertIndex * 4); |
||||||
|
tan.put(tangent); |
||||||
|
tan.put(sign); |
||||||
|
|
||||||
|
tan.rewind(); |
||||||
|
tangentBuffer.setUpdateNeeded(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setTSpace(float[] tangent, float[] biTangent, float magS, float magT, boolean isOrientationPreserving, int face, int vert) { |
||||||
|
//Do nothing
|
||||||
|
} |
||||||
|
|
||||||
|
private int getIndex(int face, int vert) { |
||||||
|
IndexBuffer index = mesh.getIndexBuffer(); |
||||||
|
int vertIndex = index.get(face * 3 + vert); |
||||||
|
return vertIndex; |
||||||
|
} |
||||||
|
|
||||||
|
} |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue