diff --git a/res/img/kitten_npot.png b/res/img/kitten_npot.png
new file mode 100644
index 0000000..b97edfa
Binary files /dev/null and b/res/img/kitten_npot.png differ
diff --git a/src/mightypork/gamecore/loading/DeferredResource.java b/src/mightypork/gamecore/loading/DeferredResource.java
index 160b2e3..28b08b7 100644
--- a/src/mightypork/gamecore/loading/DeferredResource.java
+++ b/src/mightypork/gamecore/loading/DeferredResource.java
@@ -42,7 +42,8 @@ public abstract class DeferredResource implements Deferred, Destroyable {
loadFailed = false;
- if (isNull()) return;
+ if (this instanceof NullResource) return; // don't even try
+
try {
if (resource == null) {
throw new NullPointerException("Resource string cannot be null for non-null resource.");
@@ -61,8 +62,6 @@ public abstract class DeferredResource implements Deferred, Destroyable {
@Override
public synchronized final boolean isLoaded()
{
- if (isNull()) return false;
-
return loadAttempted && !loadFailed;
}
@@ -74,8 +73,6 @@ public abstract class DeferredResource implements Deferred, Destroyable {
*/
public synchronized final boolean ensureLoaded()
{
- if (isNull()) return false;
-
if (isLoaded()) {
return true;
} else {
@@ -132,10 +129,4 @@ public abstract class DeferredResource implements Deferred, Destroyable {
} else if (!resource.equals(other.resource)) return false;
return true;
}
-
-
- private boolean isNull()
- {
- return this instanceof NullResource;
- }
}
diff --git a/src/mightypork/gamecore/render/Render.java b/src/mightypork/gamecore/render/Render.java
index 5ad4462..73757b6 100644
--- a/src/mightypork/gamecore/render/Render.java
+++ b/src/mightypork/gamecore/render/Render.java
@@ -18,7 +18,6 @@ import mightypork.util.math.color.Color;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.opengl.Texture;
-import org.newdawn.slick.opengl.TextureImpl;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;
@@ -299,7 +298,7 @@ public class Render {
* @param filtering filtering mode to use while loading.
* @return the loaded texture
*/
- public synchronized static Texture loadTexture(String resourcePath, FilterMode filtering)
+ public synchronized static Texture loadSlickTexture(String resourcePath, FilterMode filtering)
{
try {
@@ -322,29 +321,6 @@ public class Render {
}
- /**
- * Bind texture
- *
- * @param texture the texture
- * @throws RuntimeException if not loaded yet
- */
- private static void bindTexture(GLTexture texture) throws RuntimeException
- {
- texture.bind();
- }
-
-
- /**
- * Unbind all
- */
- private static void unbindTexture()
- {
- if (TextureImpl.getLastBind() != null) {
- TextureImpl.bindNone();
- }
- }
-
-
/**
* Render quad 2D
*
@@ -368,7 +344,7 @@ public class Render {
final RectDigest q = quad.digest();
// draw with color
-
+
glDisable(GL_TEXTURE_2D);
// quad
@@ -381,47 +357,6 @@ public class Render {
}
- /**
- * Render textured rect (texture must be binded already)
- *
- * @param quad rectangle (px)
- * @param uvs texture coords (0-1)
- */
- public static void quadUV(Rect quad, Rect uvs)
- {
- glBegin(GL_QUADS);
- quadUV_nobound(quad, uvs);
- glEnd();
- }
-
-
- /**
- * Draw quad without glBegin and glEnd.
- *
- * @param quad rectangle (px)
- * @param uvs texture coords (0-1)
- */
- public static void quadUV_nobound(Rect quad, Rect uvs)
- {
- final RectDigest q = quad.digest();
-
- final RectDigest u = uvs.digest();
-
- // quad with texture
- glTexCoord2d(u.left, u.bottom);
- glVertex2d(q.left, q.bottom);
-
- glTexCoord2d(u.right, u.bottom);
- glVertex2d(q.right, q.bottom);
-
- glTexCoord2d(u.right, u.top);
- glVertex2d(q.right, q.top);
-
- glTexCoord2d(u.left, u.top);
- glVertex2d(q.left, q.top);
- }
-
-
/**
* Draw quad with horizontal gradient
*
@@ -455,7 +390,7 @@ public class Render {
final RectDigest r = quad.digest();
// draw with color
-
+
glDisable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
@@ -498,10 +433,32 @@ public class Render {
public static void quadTextured(Rect quad, Rect uvs, GLTexture texture, Color tint)
{
glEnable(GL_TEXTURE_2D);
- bindTexture(texture);
+
+ texture.bind();
+
setColor(tint);
- quadUV(quad, uvs);
- unbindTexture();
+
+ glBegin(GL_QUADS);
+
+ final RectDigest q = quad.digest();
+ final RectDigest u = uvs.digest();
+
+ final double w = texture.getWidth01();
+ final double h = texture.getHeight01();
+
+ // quad with texture
+ glTexCoord2d(u.x * w, u.bottom * h);
+ glVertex2d(q.left, q.bottom);
+
+ glTexCoord2d(u.right * w, u.bottom * h);
+ glVertex2d(q.right, q.bottom);
+
+ glTexCoord2d(u.right * w, u.top * h);
+ glVertex2d(q.right, q.top);
+
+ glTexCoord2d(u.left * w, u.top * h);
+ glVertex2d(q.left, q.top);
+ glEnd();
}
diff --git a/src/mightypork/gamecore/render/fonts/impl/CachedFont.java b/src/mightypork/gamecore/render/fonts/impl/CachedFont.java
index e70cbdc..9fa4e5c 100644
--- a/src/mightypork/gamecore/render/fonts/impl/CachedFont.java
+++ b/src/mightypork/gamecore/render/fonts/impl/CachedFont.java
@@ -334,30 +334,6 @@ public class CachedFont implements GLFont {
}
- private void drawQuad(float xmin, float ymin, float xmax, float ymax, float txmin, float tymin, float txmax, float tymax)
- {
- final float draw_width = xmax - xmin;
- final float draw_height = ymax - ymin;
-
- final float txmin01 = txmin / textureWidth;
- final float tymin01 = tymin / textureHeight;
- final float twidth01 = ((txmax - txmin) / textureWidth);
- final float theight01 = ((tymax - tymin) / textureHeight);
-
- glTexCoord2f(txmin01, tymin01);
- glVertex2f(xmin, ymin);
-
- glTexCoord2f(txmin01, tymin01 + theight01);
- glVertex2f(xmin, ymin + draw_height);
-
- glTexCoord2f(txmin01 + twidth01, tymin01 + theight01);
- glVertex2f(xmin + draw_width, ymin + draw_height);
-
- glTexCoord2f(txmin01 + twidth01, tymin01);
- glVertex2f(xmin + draw_width, ymin);
- }
-
-
/**
* Get size needed to draw given string
*
@@ -398,31 +374,57 @@ public class CachedFont implements GLFont {
{
GLUtils.checkGLContext();
+ // PUSH
glPushAttrib(GL_ENABLE_BIT);
+
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureID);
glColor4d(color.red(), color.green(), color.blue(), color.alpha());
+
glBegin(GL_QUADS);
CharTile chtx = null;
char charCurrent;
+ int minx = 0;
- glBegin(GL_QUADS);
-
- int totalwidth = 0;
for (int i = 0; i < text.length(); i++) {
charCurrent = text.charAt(i);
chtx = chars.get(charCurrent);
if (chtx != null) {
- drawQuad((totalwidth), 0, (totalwidth + chtx.width), (chtx.height), chtx.texPosX, chtx.texPosY, chtx.texPosX + chtx.width, chtx.texPosY
- + chtx.height);
- totalwidth += chtx.width;
+
+ // draw quad
+
+ float txmin = chtx.texPosX;
+ float tymin = chtx.texPosY;
+ final float draw_width = minx + chtx.width - minx;
+ final float draw_height = (float) (chtx.height) - (float) 0;
+
+ final float txmin01 = txmin / textureWidth;
+ final float tymin01 = tymin / textureHeight;
+ final float twidth01 = ((chtx.texPosX + chtx.width - txmin) / textureWidth);
+ final float theight01 = ((chtx.texPosY + chtx.height - tymin) / textureHeight);
+
+ glTexCoord2f(txmin01, tymin01);
+ glVertex2f(minx, 0);
+
+ glTexCoord2f(txmin01, tymin01 + theight01);
+ glVertex2f(minx, 0 + draw_height);
+
+ glTexCoord2f(txmin01 + twidth01, tymin01 + theight01);
+ glVertex2f(minx + draw_width, 0 + draw_height);
+
+ glTexCoord2f(txmin01 + twidth01, tymin01);
+ glVertex2f(minx + draw_width, 0);
+ minx += chtx.width;
+
}
}
glEnd();
+
+ // POP
glPopAttrib();
}
diff --git a/src/mightypork/gamecore/render/textures/DeferredTexture.java b/src/mightypork/gamecore/render/textures/DeferredTexture.java
index 65475a6..39b898a 100644
--- a/src/mightypork/gamecore/render/textures/DeferredTexture.java
+++ b/src/mightypork/gamecore/render/textures/DeferredTexture.java
@@ -15,13 +15,15 @@ import org.lwjgl.opengl.GL11;
*
* @author MightyPork
*/
-@MustLoadInMainThread
@LogAlias(name = "Texture")
+@MustLoadInMainThread
public class DeferredTexture extends DeferredResource implements GLTexture {
private org.newdawn.slick.opengl.Texture backingTexture;
private FilterMode filter = FilterMode.NEAREST;
private WrapMode wrap = WrapMode.CLAMP;
+ private boolean alpha;
+ private boolean alphal;
/**
@@ -33,12 +35,6 @@ public class DeferredTexture extends DeferredResource implements GLTexture {
}
- /**
- * Get a quad from this texture of given position/size
- *
- * @param uvs quad rect
- * @return the quad
- */
@Override
public TxQuad makeQuad(Rect uvs)
{
@@ -49,7 +45,7 @@ public class DeferredTexture extends DeferredResource implements GLTexture {
@Override
protected synchronized void loadResource(String path)
{
- backingTexture = Render.loadTexture(path, filter);
+ backingTexture = Render.loadSlickTexture(path, filter);
}
@@ -58,30 +54,22 @@ public class DeferredTexture extends DeferredResource implements GLTexture {
{
if (!ensureLoaded()) return false;
- return backingTexture.hasAlpha();
- }
-
-
- /**
- * Bind without adjusting parameters
- */
- @Override
- public void bindRaw()
- {
- if (!ensureLoaded()) return;
+ if (!alphal) {
+ alphal = true;
+ alpha = backingTexture.hasAlpha();
+ }
- backingTexture.bind();
+ return alpha;
}
- /**
- * Bind and adjust parameters (filter, wrap)
- */
@Override
public void bind()
{
if (!ensureLoaded()) return;
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+
GL11.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, wrap.num);
@@ -90,7 +78,7 @@ public class DeferredTexture extends DeferredResource implements GLTexture {
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter.num);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filter.num);
- bindRaw();
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, getTextureID());
}
@@ -113,16 +101,7 @@ public class DeferredTexture extends DeferredResource implements GLTexture {
@Override
- public String getTextureRef()
- {
- if (!ensureLoaded()) return null;
-
- return backingTexture.getTextureRef();
- }
-
-
- @Override
- public float getHeight()
+ public float getHeight01()
{
if (!ensureLoaded()) return 0;
@@ -131,7 +110,7 @@ public class DeferredTexture extends DeferredResource implements GLTexture {
@Override
- public float getWidth()
+ public float getWidth01()
{
if (!ensureLoaded()) return 0;
@@ -140,25 +119,7 @@ public class DeferredTexture extends DeferredResource implements GLTexture {
@Override
- public int getTextureHeight()
- {
- if (!ensureLoaded()) return 0;
-
- return backingTexture.getTextureHeight();
- }
-
-
- @Override
- public int getTextureWidth()
- {
- if (!ensureLoaded()) return 0;
-
- return backingTexture.getTextureWidth();
- }
-
-
- @Override
- public void release()
+ public void destroy()
{
if (!isLoaded()) return;
@@ -175,31 +136,6 @@ public class DeferredTexture extends DeferredResource implements GLTexture {
}
- @Override
- public byte[] getTextureData()
- {
- if (!ensureLoaded()) return null;
-
- return backingTexture.getTextureData();
- }
-
-
- @Override
- public void setTextureFilter(int textureFilter)
- {
- if (!ensureLoaded()) return;
-
- backingTexture.setTextureFilter(textureFilter);
- }
-
-
- @Override
- public void destroy()
- {
- release();
- }
-
-
@Override
public void setFilter(FilterMode filterMin)
{
diff --git a/src/mightypork/gamecore/render/textures/GLTexture.java b/src/mightypork/gamecore/render/textures/GLTexture.java
index 1adf29e..9792d44 100644
--- a/src/mightypork/gamecore/render/textures/GLTexture.java
+++ b/src/mightypork/gamecore/render/textures/GLTexture.java
@@ -2,8 +2,7 @@ package mightypork.gamecore.render.textures;
import mightypork.util.constraints.rect.Rect;
-
-import org.newdawn.slick.opengl.Texture;
+import mightypork.util.control.Destroyable;
/**
@@ -11,7 +10,7 @@ import org.newdawn.slick.opengl.Texture;
*
* @author MightyPork
*/
-public interface GLTexture extends Texture {
+public interface GLTexture extends Destroyable {
/**
* Set filter for scaling
@@ -36,12 +35,6 @@ public interface GLTexture extends Texture {
TxQuad makeQuad(Rect uvs);
- /**
- * Bind without adjusting parameters
- */
- void bindRaw();
-
-
/**
* Get a grid for given number of tiles
*
@@ -50,4 +43,50 @@ public interface GLTexture extends Texture {
* @return grid
*/
QuadGrid grid(int x, int y);
+
+
+ /**
+ * @return OpenGL texture ID
+ */
+ int getTextureID();
+
+
+ /**
+ * Get the height of the texture, 0..1.
+ *
+ * @return height 0..1
+ */
+ float getHeight01();
+
+
+ /**
+ * Get the width of the texture, 0..1.
+ *
+ * @return width 0..1
+ */
+ float getWidth01();
+
+
+ /**
+ * @return source image width (corresponding to width01)
+ */
+ int getImageWidth();
+
+
+ /**
+ * @return source image height (corresponding to height01)
+ */
+ int getImageHeight();
+
+
+ /**
+ * Bind to GL context, applying the filters prescribed.
+ */
+ void bind();
+
+
+ /**
+ * @return true if the image is RGBA
+ */
+ boolean hasAlpha();
}
diff --git a/src/mightypork/rogue/Res.java b/src/mightypork/rogue/Res.java
index 8bc19c5..0078db3 100644
--- a/src/mightypork/rogue/Res.java
+++ b/src/mightypork/rogue/Res.java
@@ -11,8 +11,6 @@ import mightypork.gamecore.render.fonts.Glyphs;
import mightypork.gamecore.render.fonts.impl.DeferredFont;
import mightypork.gamecore.render.textures.*;
-import org.newdawn.slick.opengl.Texture;
-
/**
* Static resource repository
@@ -65,6 +63,7 @@ public final class Res {
GLTexture texture;
texture = textures.loadTexture("test.kitten", "/res/img/kitten.png", FilterMode.LINEAR, WrapMode.CLAMP);
+ texture = textures.loadTexture("test.kitten2", "/res/img/kitten_npot.png", FilterMode.LINEAR, WrapMode.CLAMP);
texture = textures.loadTexture("gui1", "/res/img/gui1.png", FilterMode.NEAREST, WrapMode.CLAMP);
final QuadGrid gui = texture.grid(4, 4);
@@ -107,7 +106,7 @@ public final class Res {
}
- public static Texture getTexture(String key)
+ public static GLTexture getTexture(String key)
{
return textures.getTexture(key);
}
diff --git a/src/mightypork/rogue/screens/test_cat_sound/LayerFlyingCat.java b/src/mightypork/rogue/screens/test_cat_sound/LayerFlyingCat.java
index 3cff7d5..2cb7de8 100644
--- a/src/mightypork/rogue/screens/test_cat_sound/LayerFlyingCat.java
+++ b/src/mightypork/rogue/screens/test_cat_sound/LayerFlyingCat.java
@@ -42,7 +42,7 @@ public class LayerFlyingCat extends ScreenLayer implements MouseButtonEvent.List
cat_position.setTo(getDisplay().getCenter());
cat_position.setDefaultDuration(3);
- final ImagePainter cat = new ImagePainter(Res.getTxQuad("test.kitten"));
+ final ImagePainter cat = new ImagePainter(Res.getTxQuad("test.kitten2"));
cat.setRect(Rect.make(size).centerTo(cat_position));
cat.enableCaching(false);
diff --git a/src/mightypork/util/constraints/rect/caching/RectDigest.java b/src/mightypork/util/constraints/rect/caching/RectDigest.java
index fe372bb..6c6065c 100644
--- a/src/mightypork/util/constraints/rect/caching/RectDigest.java
+++ b/src/mightypork/util/constraints/rect/caching/RectDigest.java
@@ -2,7 +2,6 @@ package mightypork.util.constraints.rect.caching;
import mightypork.util.constraints.rect.Rect;
-import mightypork.util.constraints.rect.RectConst;
public class RectDigest {
@@ -19,20 +18,17 @@ public class RectDigest {
public RectDigest(Rect rect)
- {
-
- final RectConst frozen = rect.freeze();
-
- this.x = frozen.x().value();
- this.y = frozen.y().value();
+ {
+ this.x = rect.origin().x();
+ this.y = rect.origin().y();
- this.width = frozen.width().value();
- this.height = frozen.height().value();
+ this.width = rect.size().x();
+ this.height = rect.size().y();
- this.left = frozen.left().value();
- this.right = frozen.right().value();
- this.top = frozen.top().value();
- this.bottom = frozen.bottom().value();
+ this.left = x;
+ this.right = x + width;
+ this.top = y;
+ this.bottom = y + height;
}