Added options for specifying the filter and mipmap parameters for model
textures, as well as for using an emissive map. git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@27 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
@@ -40,6 +40,7 @@ import com.jme.bounding.BoundingVolume;
|
|||||||
import com.jme.image.Texture;
|
import com.jme.image.Texture;
|
||||||
import com.jme.math.Quaternion;
|
import com.jme.math.Quaternion;
|
||||||
import com.jme.math.Vector3f;
|
import com.jme.math.Vector3f;
|
||||||
|
import com.jme.renderer.ColorRGBA;
|
||||||
import com.jme.renderer.Renderer;
|
import com.jme.renderer.Renderer;
|
||||||
import com.jme.scene.Controller;
|
import com.jme.scene.Controller;
|
||||||
import com.jme.scene.SharedMesh;
|
import com.jme.scene.SharedMesh;
|
||||||
@@ -97,6 +98,11 @@ public class ModelMesh extends TriMesh
|
|||||||
props.getProperty(texture, texture));
|
props.getProperty(texture, texture));
|
||||||
_sphereMapped = Boolean.parseBoolean(
|
_sphereMapped = Boolean.parseBoolean(
|
||||||
props.getProperty(texture + ".sphere_map"));
|
props.getProperty(texture + ".sphere_map"));
|
||||||
|
_filterMode = "nearest".equals(
|
||||||
|
props.getProperty(texture + ".filter")) ?
|
||||||
|
Texture.FM_NEAREST : Texture.FM_LINEAR;
|
||||||
|
_mipMapMode = getMipMapMode(props.getProperty(texture + ".mipmap"));
|
||||||
|
_emissiveMap = props.getProperty(texture + ".emissive");
|
||||||
_solid = solid;
|
_solid = solid;
|
||||||
_transparent = transparent;
|
_transparent = transparent;
|
||||||
}
|
}
|
||||||
@@ -116,6 +122,9 @@ public class ModelMesh extends TriMesh
|
|||||||
colors == null ? null : colors.asFloatBuffer(),
|
colors == null ? null : colors.asFloatBuffer(),
|
||||||
textures == null ? null : textures.asFloatBuffer(),
|
textures == null ? null : textures.asFloatBuffer(),
|
||||||
indices == null ? null : indices.asIntBuffer());
|
indices == null ? null : indices.asIntBuffer());
|
||||||
|
for (int ii = 1, nn = getTextureCount(); ii < nn; ii++) {
|
||||||
|
setTextureBuffer(0, getTextureBuffer(0, 0), ii);
|
||||||
|
}
|
||||||
_vertexByteBuffer = vertices;
|
_vertexByteBuffer = vertices;
|
||||||
_normalByteBuffer = normals;
|
_normalByteBuffer = normals;
|
||||||
_colorByteBuffer = colors;
|
_colorByteBuffer = colors;
|
||||||
@@ -183,6 +192,9 @@ public class ModelMesh extends TriMesh
|
|||||||
FloatBuffer textures, IntBuffer indices)
|
FloatBuffer textures, IntBuffer indices)
|
||||||
{
|
{
|
||||||
super.reconstruct(vertices, normals, colors, textures, indices);
|
super.reconstruct(vertices, normals, colors, textures, indices);
|
||||||
|
for (int ii = 1, nn = getTextureCount(); ii < nn; ii++) {
|
||||||
|
setTextureBuffer(0, getTextureBuffer(0, 0), ii);
|
||||||
|
}
|
||||||
|
|
||||||
_vertexBufferSize = (vertices == null) ? 0 : vertices.capacity();
|
_vertexBufferSize = (vertices == null) ? 0 : vertices.capacity();
|
||||||
_normalBufferSize = (normals == null) ? 0 : normals.capacity();
|
_normalBufferSize = (normals == null) ? 0 : normals.capacity();
|
||||||
@@ -197,6 +209,9 @@ public class ModelMesh extends TriMesh
|
|||||||
FloatBuffer textures)
|
FloatBuffer textures)
|
||||||
{
|
{
|
||||||
super.reconstruct(vertices, normals, colors, textures);
|
super.reconstruct(vertices, normals, colors, textures);
|
||||||
|
for (int ii = 1, nn = getTextureCount(); ii < nn; ii++) {
|
||||||
|
setTextureBuffer(0, getTextureBuffer(0, 0), ii);
|
||||||
|
}
|
||||||
|
|
||||||
_vertexBufferSize = (vertices == null) ? 0 : vertices.capacity();
|
_vertexBufferSize = (vertices == null) ? 0 : vertices.capacity();
|
||||||
_normalBufferSize = (normals == null) ? 0 : normals.capacity();
|
_normalBufferSize = (normals == null) ? 0 : normals.capacity();
|
||||||
@@ -282,6 +297,9 @@ public class ModelMesh extends TriMesh
|
|||||||
mstore._tstates = _tstates;
|
mstore._tstates = _tstates;
|
||||||
}
|
}
|
||||||
mstore._sphereMapped = _sphereMapped;
|
mstore._sphereMapped = _sphereMapped;
|
||||||
|
mstore._filterMode = _filterMode;
|
||||||
|
mstore._mipMapMode = _mipMapMode;
|
||||||
|
mstore._emissiveMap = _emissiveMap;
|
||||||
return mstore;
|
return mstore;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,6 +327,9 @@ public class ModelMesh extends TriMesh
|
|||||||
out.writeInt(_indexBufferSize);
|
out.writeInt(_indexBufferSize);
|
||||||
out.writeObject(_textures);
|
out.writeObject(_textures);
|
||||||
out.writeBoolean(_sphereMapped);
|
out.writeBoolean(_sphereMapped);
|
||||||
|
out.writeInt(_filterMode);
|
||||||
|
out.writeInt(_mipMapMode);
|
||||||
|
out.writeObject(_emissiveMap);
|
||||||
out.writeBoolean(_solid);
|
out.writeBoolean(_solid);
|
||||||
out.writeBoolean(_transparent);
|
out.writeBoolean(_transparent);
|
||||||
}
|
}
|
||||||
@@ -329,6 +350,9 @@ public class ModelMesh extends TriMesh
|
|||||||
_indexBufferSize = in.readInt();
|
_indexBufferSize = in.readInt();
|
||||||
_textures = (String[])in.readObject();
|
_textures = (String[])in.readObject();
|
||||||
_sphereMapped = in.readBoolean();
|
_sphereMapped = in.readBoolean();
|
||||||
|
_filterMode = in.readInt();
|
||||||
|
_mipMapMode = in.readInt();
|
||||||
|
_emissiveMap = (String)in.readObject();
|
||||||
_solid = in.readBoolean();
|
_solid = in.readBoolean();
|
||||||
_transparent = in.readBoolean();
|
_transparent = in.readBoolean();
|
||||||
}
|
}
|
||||||
@@ -365,12 +389,27 @@ public class ModelMesh extends TriMesh
|
|||||||
if (_textures == null) {
|
if (_textures == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Texture emissiveTex = null;
|
||||||
|
if (_emissiveMap != null) {
|
||||||
|
TextureState tstate = tprov.getTexture(_emissiveMap);
|
||||||
|
emissiveTex = tstate.getTexture();
|
||||||
|
emissiveTex.setApply(Texture.AM_BLEND);
|
||||||
|
emissiveTex.setBlendColor(ColorRGBA.white);
|
||||||
|
}
|
||||||
_tstates = new TextureState[_textures.length];
|
_tstates = new TextureState[_textures.length];
|
||||||
for (int ii = 0; ii < _textures.length; ii++) {
|
for (int ii = 0; ii < _textures.length; ii++) {
|
||||||
_tstates[ii] = tprov.getTexture(_textures[ii]);
|
_tstates[ii] = tprov.getTexture(_textures[ii]);
|
||||||
|
Texture tex = _tstates[ii].getTexture();
|
||||||
if (_sphereMapped) {
|
if (_sphereMapped) {
|
||||||
_tstates[ii].getTexture().setEnvironmentalMapMode(
|
tex.setEnvironmentalMapMode(Texture.EM_SPHERE);
|
||||||
Texture.EM_SPHERE);
|
}
|
||||||
|
tex.setFilter(_filterMode);
|
||||||
|
tex.setMipmapState(_mipMapMode);
|
||||||
|
if (emissiveTex != null) {
|
||||||
|
_tstates[ii] = DisplaySystem.getDisplaySystem().
|
||||||
|
getRenderer().createTextureState();
|
||||||
|
_tstates[ii].setTexture(emissiveTex, 0);
|
||||||
|
_tstates[ii].setTexture(tex, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_tstates[0] != null) {
|
if (_tstates[0] != null) {
|
||||||
@@ -520,6 +559,15 @@ public class ModelMesh extends TriMesh
|
|||||||
batchList.add(batch);
|
batchList.add(batch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of textures this mesh uses (they must all share the
|
||||||
|
* same texture coordinates).
|
||||||
|
*/
|
||||||
|
protected int getTextureCount ()
|
||||||
|
{
|
||||||
|
return (_emissiveMap == null) ? 1 : 2;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Locks the transform and bounds of this mesh on the assumption that its
|
* Locks the transform and bounds of this mesh on the assumption that its
|
||||||
* position will not change.
|
* position will not change.
|
||||||
@@ -530,6 +578,29 @@ public class ModelMesh extends TriMesh
|
|||||||
_transformLocked = true;
|
_transformLocked = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the mip-map mode corresponding to the given string
|
||||||
|
* (defaulting to {@link Texture#MM_LINEAR_LINEAR}).
|
||||||
|
*/
|
||||||
|
protected static int getMipMapMode (String mmode)
|
||||||
|
{
|
||||||
|
if ("none".equals(mmode)) {
|
||||||
|
return Texture.MM_NONE;
|
||||||
|
} else if ("nearest".equals(mmode)) {
|
||||||
|
return Texture.MM_NEAREST;
|
||||||
|
} else if ("linear".equals(mmode)) {
|
||||||
|
return Texture.MM_LINEAR;
|
||||||
|
} else if ("nearest_nearest".equals(mmode)) {
|
||||||
|
return Texture.MM_NEAREST_NEAREST;
|
||||||
|
} else if ("nearest_linear".equals(mmode)) {
|
||||||
|
return Texture.MM_NEAREST_LINEAR;
|
||||||
|
} else if ("linear_nearest".equals(mmode)) {
|
||||||
|
return Texture.MM_LINEAR_NEAREST;
|
||||||
|
} else {
|
||||||
|
return Texture.MM_LINEAR_LINEAR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Imposes the specified order on the given buffer of 32 bit values.
|
* Imposes the specified order on the given buffer of 32 bit values.
|
||||||
*/
|
*/
|
||||||
@@ -606,6 +677,15 @@ public class ModelMesh extends TriMesh
|
|||||||
/** Whether or not to use sphere mapping on this model's textures. */
|
/** Whether or not to use sphere mapping on this model's textures. */
|
||||||
protected boolean _sphereMapped;
|
protected boolean _sphereMapped;
|
||||||
|
|
||||||
|
/** The filter mode to use on magnification. */
|
||||||
|
protected int _filterMode;
|
||||||
|
|
||||||
|
/** The mipmap mode to use on minification. */
|
||||||
|
protected int _mipMapMode;
|
||||||
|
|
||||||
|
/** The emissive map, if specified. */
|
||||||
|
protected String _emissiveMap;
|
||||||
|
|
||||||
/** Whether or not this mesh can enable back-face culling. */
|
/** Whether or not this mesh can enable back-face culling. */
|
||||||
protected boolean _solid;
|
protected boolean _solid;
|
||||||
|
|
||||||
|
|||||||
@@ -400,7 +400,10 @@ public class SkinMesh extends ModelMesh
|
|||||||
TriangleBatch batch = getBatch(0), tbatch = new TriangleBatch();
|
TriangleBatch batch = getBatch(0), tbatch = new TriangleBatch();
|
||||||
tbatch.setParentGeom(DUMMY_MESH);
|
tbatch.setParentGeom(DUMMY_MESH);
|
||||||
tbatch.setColorBuffer(batch.getColorBuffer());
|
tbatch.setColorBuffer(batch.getColorBuffer());
|
||||||
tbatch.setTextureBuffer(batch.getTextureBuffer(0), 0);
|
int nunits = batch.getNumberOfUnits();
|
||||||
|
for (int ii = 0; ii < nunits; ii++) {
|
||||||
|
tbatch.setTextureBuffer(batch.getTextureBuffer(ii), ii);
|
||||||
|
}
|
||||||
tbatch.setIndexBuffer(batch.getIndexBuffer());
|
tbatch.setIndexBuffer(batch.getIndexBuffer());
|
||||||
tbatch.setVertexBuffer(BufferUtils.createFloatBuffer(_vbuf));
|
tbatch.setVertexBuffer(BufferUtils.createFloatBuffer(_vbuf));
|
||||||
tbatch.setNormalBuffer(BufferUtils.createFloatBuffer(_nbuf));
|
tbatch.setNormalBuffer(BufferUtils.createFloatBuffer(_nbuf));
|
||||||
@@ -409,7 +412,9 @@ public class SkinMesh extends ModelMesh
|
|||||||
VBOInfo vboinfo = new VBOInfo(true);
|
VBOInfo vboinfo = new VBOInfo(true);
|
||||||
vboinfo.setVBOIndexEnabled(true);
|
vboinfo.setVBOIndexEnabled(true);
|
||||||
vboinfo.setVBOColorID(ovboinfo.getVBOColorID());
|
vboinfo.setVBOColorID(ovboinfo.getVBOColorID());
|
||||||
vboinfo.setVBOTextureID(0, ovboinfo.getVBOTextureID(0));
|
for (int ii = 0; ii < nunits; ii++) {
|
||||||
|
vboinfo.setVBOTextureID(ii, ovboinfo.getVBOTextureID(ii));
|
||||||
|
}
|
||||||
vboinfo.setVBOIndexID(ovboinfo.getVBOIndexID());
|
vboinfo.setVBOIndexID(ovboinfo.getVBOIndexID());
|
||||||
tbatch.setVBOInfo(vboinfo);
|
tbatch.setVBOInfo(vboinfo);
|
||||||
} else if (_useDisplayLists) {
|
} else if (_useDisplayLists) {
|
||||||
|
|||||||
Reference in New Issue
Block a user