|
|
|
@ -29,7 +29,6 @@ |
|
|
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
|
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
package com.jme3.niftygui; |
|
|
|
|
|
|
|
|
|
import com.jme3.font.BitmapText; |
|
|
|
@ -60,143 +59,140 @@ import java.nio.FloatBuffer; |
|
|
|
|
import java.util.HashMap; |
|
|
|
|
|
|
|
|
|
public class RenderDeviceJme implements RenderDevice { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private NiftyJmeDisplay display; |
|
|
|
|
private RenderManager rm; |
|
|
|
|
private Renderer r; |
|
|
|
|
|
|
|
|
|
private HashMap<String, BitmapText> textCacheLastFrame = new HashMap<String, BitmapText>(); |
|
|
|
|
private HashMap<String, BitmapText> textCacheCurrentFrame = new HashMap<String, BitmapText>(); |
|
|
|
|
|
|
|
|
|
private final Quad quad = new Quad(1, -1, true); |
|
|
|
|
private final Geometry quadGeom = new Geometry("nifty-quad", quad); |
|
|
|
|
private final Material niftyMat; |
|
|
|
|
private final Material niftyQuadMat; |
|
|
|
|
|
|
|
|
|
private boolean clipWasSet = false; |
|
|
|
|
private BlendMode blendMode = null; |
|
|
|
|
|
|
|
|
|
private VertexBuffer quadDefaultTC = quad.getBuffer(Type.TexCoord); |
|
|
|
|
private VertexBuffer quadModTC = quadDefaultTC.clone(); |
|
|
|
|
private VertexBuffer quadColor; |
|
|
|
|
|
|
|
|
|
private Matrix4f tempMat = new Matrix4f(); |
|
|
|
|
private ColorRGBA tempColor = new ColorRGBA(); |
|
|
|
|
|
|
|
|
|
public RenderDeviceJme(NiftyJmeDisplay display){ |
|
|
|
|
|
|
|
|
|
public RenderDeviceJme(NiftyJmeDisplay display) { |
|
|
|
|
this.display = display; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
quadColor = new VertexBuffer(Type.Color); |
|
|
|
|
quadColor.setNormalized(true); |
|
|
|
|
ByteBuffer bb = BufferUtils.createByteBuffer(4 * 4); |
|
|
|
|
quadColor.setupData(Usage.Stream, 4, Format.UnsignedByte, bb); |
|
|
|
|
quad.setBuffer(quadColor); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
quadModTC.setUsage(Usage.Stream); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
niftyMat = new Material(display.getAssetManager(), "Common/MatDefs/Nifty/NiftyTex.j3md"); |
|
|
|
|
niftyMat.getAdditionalRenderState().setDepthTest(false); |
|
|
|
|
niftyQuadMat = new Material(display.getAssetManager(), "Common/MatDefs/Nifty/NiftyQuad.j3md"); |
|
|
|
|
niftyQuadMat.getAdditionalRenderState().setDepthTest(false); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setResourceLoader(NiftyResourceLoader niftyResourceLoader) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setRenderManager(RenderManager rm){ |
|
|
|
|
|
|
|
|
|
public void setRenderManager(RenderManager rm) { |
|
|
|
|
this.rm = rm; |
|
|
|
|
this.r = rm.getRenderer(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO: Cursor support
|
|
|
|
|
public MouseCursor createMouseCursor(String str, int x, int y){ |
|
|
|
|
public MouseCursor createMouseCursor(String str, int x, int y) { |
|
|
|
|
return new MouseCursor() { |
|
|
|
|
|
|
|
|
|
public void dispose() { |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void enableMouseCursor(MouseCursor cursor){ |
|
|
|
|
|
|
|
|
|
public void enableMouseCursor(MouseCursor cursor) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void disableMouseCursor(){ |
|
|
|
|
|
|
|
|
|
public void disableMouseCursor() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public RenderImage createImage(String filename, boolean linear) { |
|
|
|
|
return new RenderImageJme(filename, linear, display); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public RenderFont createFont(String filename) { |
|
|
|
|
return new RenderFontJme(filename, display); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void beginFrame() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void endFrame() { |
|
|
|
|
HashMap<String, BitmapText> temp = textCacheLastFrame; |
|
|
|
|
textCacheLastFrame = textCacheCurrentFrame; |
|
|
|
|
textCacheCurrentFrame = temp; |
|
|
|
|
textCacheCurrentFrame.clear(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// System.exit(1);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int getWidth() { |
|
|
|
|
return display.getWidth(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int getHeight() { |
|
|
|
|
return display.getHeight(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void clear() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setBlendMode(BlendMode blendMode) { |
|
|
|
|
if (this.blendMode != blendMode){ |
|
|
|
|
if (this.blendMode != blendMode) { |
|
|
|
|
this.blendMode = blendMode; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private RenderState.BlendMode convertBlend(){ |
|
|
|
|
if (blendMode == null) |
|
|
|
|
|
|
|
|
|
private RenderState.BlendMode convertBlend() { |
|
|
|
|
if (blendMode == null) { |
|
|
|
|
return RenderState.BlendMode.Off; |
|
|
|
|
else if (blendMode == BlendMode.BLEND) |
|
|
|
|
} else if (blendMode == BlendMode.BLEND) { |
|
|
|
|
return RenderState.BlendMode.Alpha; |
|
|
|
|
else if (blendMode == BlendMode.MULIPLY) |
|
|
|
|
} else if (blendMode == BlendMode.MULIPLY) { |
|
|
|
|
return RenderState.BlendMode.Modulate; |
|
|
|
|
else |
|
|
|
|
} else { |
|
|
|
|
throw new UnsupportedOperationException(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int convertColor(Color color){ |
|
|
|
|
|
|
|
|
|
private int convertColor(Color color) { |
|
|
|
|
int color2 = 0; |
|
|
|
|
color2 |= ((int)(255.0 * color.getAlpha())) << 24; |
|
|
|
|
color2 |= ((int)(255.0 * color.getBlue())) << 16; |
|
|
|
|
color2 |= ((int)(255.0 * color.getGreen())) << 8; |
|
|
|
|
color2 |= ((int)(255.0 * color.getRed())); |
|
|
|
|
color2 |= ((int) (255.0 * color.getAlpha())) << 24; |
|
|
|
|
color2 |= ((int) (255.0 * color.getBlue())) << 16; |
|
|
|
|
color2 |= ((int) (255.0 * color.getGreen())) << 8; |
|
|
|
|
color2 |= ((int) (255.0 * color.getRed())); |
|
|
|
|
return color2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private ColorRGBA convertColor(Color inColor, ColorRGBA outColor){ |
|
|
|
|
|
|
|
|
|
private ColorRGBA convertColor(Color inColor, ColorRGBA outColor) { |
|
|
|
|
return outColor.set(inColor.getRed(), inColor.getGreen(), inColor.getBlue(), inColor.getAlpha()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setColor(Color color){ |
|
|
|
|
|
|
|
|
|
private void setColor(Color color) { |
|
|
|
|
ByteBuffer buf = (ByteBuffer) quadColor.getData(); |
|
|
|
|
buf.rewind(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int color2 = convertColor(color); |
|
|
|
|
buf.putInt(color2); |
|
|
|
|
buf.putInt(color2); |
|
|
|
|
buf.putInt(color2); |
|
|
|
|
buf.putInt(color2); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
buf.flip(); |
|
|
|
|
quadColor.updateData(buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* |
|
|
|
|
* @param font |
|
|
|
@ -208,21 +204,23 @@ public class RenderDeviceJme implements RenderDevice { |
|
|
|
|
* @deprecated use renderFont(RenderFont font, String str, int x, int y, Color color, float sizeX, float sizeY) instead |
|
|
|
|
*/ |
|
|
|
|
@Deprecated |
|
|
|
|
public void renderFont(RenderFont font, String str, int x, int y, Color color, float size){ |
|
|
|
|
public void renderFont(RenderFont font, String str, int x, int y, Color color, float size) { |
|
|
|
|
renderFont(font, str, x, y, color, size, size); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void renderFont(RenderFont font, String str, int x, int y, Color color, float sizeX, float sizeY){ |
|
|
|
|
if (str.length() == 0) |
|
|
|
|
public void renderFont(RenderFont font, String str, int x, int y, Color color, float sizeX, float sizeY) { |
|
|
|
|
if (str.length() == 0) { |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
if (font instanceof RenderFontNull) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (font instanceof RenderFontNull) { |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
RenderFontJme jmeFont = (RenderFontJme) font; |
|
|
|
|
|
|
|
|
|
String key = font+str+color.getColorString(); |
|
|
|
|
String key = font + str + color.getColorString(); |
|
|
|
|
BitmapText text = textCacheLastFrame.get(key); |
|
|
|
|
if (text == null) { |
|
|
|
|
text = jmeFont.createText(); |
|
|
|
@ -230,120 +228,120 @@ public class RenderDeviceJme implements RenderDevice { |
|
|
|
|
text.updateLogicalState(0); |
|
|
|
|
} |
|
|
|
|
textCacheCurrentFrame.put(key, text); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
niftyMat.setColor("Color", convertColor(color, tempColor)); |
|
|
|
|
niftyMat.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha); |
|
|
|
|
niftyMat.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha); |
|
|
|
|
// niftyMat.getAdditionalRenderState().setBlendMode(convertBlend());
|
|
|
|
|
text.setMaterial(niftyMat); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tempMat.loadIdentity(); |
|
|
|
|
tempMat.setTranslation(x, getHeight() - y, 0); |
|
|
|
|
tempMat.setScale(sizeX, sizeY, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rm.setWorldMatrix(tempMat); |
|
|
|
|
text.render(rm); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// System.out.println("renderFont");
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void renderImage(RenderImage image, int x, int y, int w, int h, |
|
|
|
|
int srcX, int srcY, int srcW, int srcH, |
|
|
|
|
Color color, float scale, |
|
|
|
|
int centerX, int centerY){ |
|
|
|
|
int srcX, int srcY, int srcW, int srcH, |
|
|
|
|
Color color, float scale, |
|
|
|
|
int centerX, int centerY) { |
|
|
|
|
RenderImageJme jmeImage = (RenderImageJme) image; |
|
|
|
|
Texture2D texture = jmeImage.getTexture(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
niftyMat.getAdditionalRenderState().setBlendMode(convertBlend()); |
|
|
|
|
niftyMat.setColor("Color", ColorRGBA.White); |
|
|
|
|
niftyMat.setTexture("Texture", texture); |
|
|
|
|
niftyMat.setTexture("Texture", texture); |
|
|
|
|
setColor(color); |
|
|
|
|
|
|
|
|
|
float imageWidth = jmeImage.getWidth(); |
|
|
|
|
|
|
|
|
|
float imageWidth = jmeImage.getWidth(); |
|
|
|
|
float imageHeight = jmeImage.getHeight(); |
|
|
|
|
FloatBuffer texCoords = (FloatBuffer) quadModTC.getData(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float startX = srcX / imageWidth; |
|
|
|
|
float startY = srcY / imageHeight; |
|
|
|
|
float endX = startX + (srcW / imageWidth); |
|
|
|
|
float endY = startY + (srcH / imageHeight); |
|
|
|
|
|
|
|
|
|
float endX = startX + (srcW / imageWidth); |
|
|
|
|
float endY = startY + (srcH / imageHeight); |
|
|
|
|
|
|
|
|
|
startY = 1f - startY; |
|
|
|
|
endY = 1f - endY; |
|
|
|
|
|
|
|
|
|
endY = 1f - endY; |
|
|
|
|
|
|
|
|
|
texCoords.rewind(); |
|
|
|
|
texCoords.put(startX).put(startY); |
|
|
|
|
texCoords.put(endX) .put(startY); |
|
|
|
|
texCoords.put(endX) .put(endY); |
|
|
|
|
texCoords.put(endX).put(startY); |
|
|
|
|
texCoords.put(endX).put(endY); |
|
|
|
|
texCoords.put(startX).put(endY); |
|
|
|
|
texCoords.flip(); |
|
|
|
|
quadModTC.updateData(texCoords); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
quad.clearBuffer(Type.TexCoord); |
|
|
|
|
quad.setBuffer(quadModTC); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float x0 = centerX + (x - centerX) * scale; |
|
|
|
|
float y0 = centerY + (y - centerY) * scale; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tempMat.loadIdentity(); |
|
|
|
|
tempMat.setTranslation(x0, getHeight() - y0, 0); |
|
|
|
|
tempMat.setScale(w * scale, h * scale, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rm.setWorldMatrix(tempMat); |
|
|
|
|
niftyMat.render(quadGeom, rm); |
|
|
|
|
//
|
|
|
|
|
// System.out.println("renderImage (Sub)");
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void renderImage(RenderImage image, int x, int y, int width, int height, |
|
|
|
|
Color color, float imageScale){ |
|
|
|
|
|
|
|
|
|
Color color, float imageScale) { |
|
|
|
|
|
|
|
|
|
RenderImageJme jmeImage = (RenderImageJme) image; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
niftyMat.getAdditionalRenderState().setBlendMode(convertBlend()); |
|
|
|
|
niftyMat.setColor("Color", ColorRGBA.White); |
|
|
|
|
niftyMat.setTexture("Texture", jmeImage.getTexture()); |
|
|
|
|
niftyMat.setTexture("Texture", jmeImage.getTexture()); |
|
|
|
|
setColor(color); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
quad.clearBuffer(Type.TexCoord); |
|
|
|
|
quad.setBuffer(quadDefaultTC); |
|
|
|
|
|
|
|
|
|
float x0 = x + 0.5f * width * (1f - imageScale); |
|
|
|
|
|
|
|
|
|
float x0 = x + 0.5f * width * (1f - imageScale); |
|
|
|
|
float y0 = y + 0.5f * height * (1f - imageScale); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tempMat.loadIdentity(); |
|
|
|
|
tempMat.setTranslation(x0, getHeight() - y0, 0); |
|
|
|
|
tempMat.setScale(width * imageScale, height * imageScale, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rm.setWorldMatrix(tempMat); |
|
|
|
|
niftyMat.render(quadGeom, rm); |
|
|
|
|
//
|
|
|
|
|
// System.out.println("renderImage");
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void renderQuad(int x, int y, int width, int height, Color color){ |
|
|
|
|
|
|
|
|
|
public void renderQuad(int x, int y, int width, int height, Color color) { |
|
|
|
|
niftyQuadMat.getAdditionalRenderState().setBlendMode(convertBlend()); |
|
|
|
|
niftyQuadMat.setColor("Color", ColorRGBA.White); |
|
|
|
|
niftyQuadMat.setColor("Color", ColorRGBA.White); |
|
|
|
|
setColor(color); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tempMat.loadIdentity(); |
|
|
|
|
tempMat.setTranslation(x, getHeight() - y, 0); |
|
|
|
|
tempMat.setScale(width, height, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rm.setWorldMatrix(tempMat); |
|
|
|
|
niftyQuadMat.render(quadGeom, rm); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// System.out.println("renderQuad (Solid)");
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void renderQuad(int x, int y, int width, int height, |
|
|
|
|
Color topLeft, Color topRight, Color bottomRight, Color bottomLeft) { |
|
|
|
|
Color topLeft, Color topRight, Color bottomRight, Color bottomLeft) { |
|
|
|
|
|
|
|
|
|
ByteBuffer buf = (ByteBuffer) quadColor.getData(); |
|
|
|
|
buf.rewind(); |
|
|
|
|
|
|
|
|
|
buf.putInt(convertColor(topRight)); |
|
|
|
|
buf.putInt(convertColor(topLeft)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
buf.putInt(convertColor(bottomLeft)); |
|
|
|
|
buf.putInt(convertColor(bottomRight)); |
|
|
|
|
|
|
|
|
@ -352,31 +350,28 @@ public class RenderDeviceJme implements RenderDevice { |
|
|
|
|
|
|
|
|
|
niftyQuadMat.getAdditionalRenderState().setBlendMode(convertBlend()); |
|
|
|
|
niftyQuadMat.setColor("Color", ColorRGBA.White); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tempMat.loadIdentity(); |
|
|
|
|
tempMat.setTranslation(x, getHeight() - y, 0); |
|
|
|
|
tempMat.setScale(width, height, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rm.setWorldMatrix(tempMat); |
|
|
|
|
niftyQuadMat.render(quadGeom, rm); |
|
|
|
|
//
|
|
|
|
|
// System.out.println("renderQuad (Grad)");
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void enableClip(int x0, int y0, int x1, int y1){ |
|
|
|
|
|
|
|
|
|
public void enableClip(int x0, int y0, int x1, int y1) { |
|
|
|
|
// System.out.println("enableClip");
|
|
|
|
|
clipWasSet = true; |
|
|
|
|
r.setClipRect(x0, getHeight() - y1, x1 - x0, y1 - y0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void disableClip() { |
|
|
|
|
// System.out.println("disableClip");
|
|
|
|
|
if (clipWasSet){ |
|
|
|
|
if (clipWasSet) { |
|
|
|
|
r.clearClipRect(); |
|
|
|
|
clipWasSet = false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|