-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added an experimental MikkTspace generator
- Loading branch information
Showing
3 changed files
with
1,914 additions
and
0 deletions.
There are no files selected for viewing
97 changes: 97 additions & 0 deletions
97
jme3-core/src/main/java/com/jme3/util/mikktspace/MikkTSpaceContext.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} |
100 changes: 100 additions & 0 deletions
100
jme3-core/src/main/java/com/jme3/util/mikktspace/MikkTSpaceImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} | ||
|
||
} |
Oops, something went wrong.