parent
963bbd42e5
commit
44601cf5ff
@ -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