* Supports Format.LATC for textures, this includes
* support for ATI's 3Dc texture compression.
*/
- TextureCompressionLATC,
+ TextureCompressionLATC,
+
+ /**
+ * Supports Non-Power-Of-Two (NPOT) textures and framebuffers
+ */
+ NonPowerOfTwoTextures,
/// Vertex Buffer features
MeshInstancing,
import com.jme3.asset.AssetManager;
import com.jme3.asset.DesktopAssetManager;
import com.jme3.audio.AudioRenderer;
+import com.jme3.util.JmeFormatter;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;
}
AudioRenderer ar = clazz.newInstance();
-// ar = new QueuedAudioRenderer(ar);
return ar;
}catch (InstantiationException ex){
logger.log(Level.SEVERE, "Failed to create context", ex);
return;
initialized = true;
-// try {
-// if (!lowPermissions){
-// // can only modify logging settings
-// // if permissions are available
-//
-// JmeFormatter formatter = new JmeFormatter();
+ try {
+ if (!lowPermissions){
+ // can only modify logging settings
+ // if permissions are available
+
+ JmeFormatter formatter = new JmeFormatter();
// Handler fileHandler = new FileHandler("jme.log");
// fileHandler.setFormatter(formatter);
// Logger.getLogger("").addHandler(fileHandler);
-//
-// Handler consoleHandler = new ConsoleHandler();
-// consoleHandler.setFormatter(formatter);
-// Logger.getLogger("").removeHandler(Logger.getLogger("").getHandlers()[0]);
-// Logger.getLogger("").addHandler(consoleHandler);
-//
+
+ Handler consoleHandler = new ConsoleHandler();
+ consoleHandler.setFormatter(formatter);
+ Logger.getLogger("").removeHandler(Logger.getLogger("").getHandlers()[0]);
+ Logger.getLogger("").addHandler(consoleHandler);
+
// Logger.getLogger("com.jme3").setLevel(Level.FINEST);
-// }
+ }
// } catch (IOException ex){
// logger.log(Level.SEVERE, "I/O Error while creating log file", ex);
-// } catch (SecurityException ex){
-// logger.log(Level.SEVERE, "Security error in creating log file", ex);
-// }
+ } catch (SecurityException ex){
+ logger.log(Level.SEVERE, "Security error in creating log file", ex);
+ }
logger.log(Level.INFO, "Running on {0}", getFullName());
package com.jme3.renderer.lwjgl;
+import com.jme3.math.FastMath;
import com.jme3.renderer.GL1Renderer;
import com.jme3.shader.Shader;
import com.jme3.shader.Shader.ShaderSource;
import java.util.EnumSet;
import java.util.logging.Logger;
import jme3tools.converters.MipMapGenerator;
+import org.lwjgl.opengl.GLContext;
import static org.lwjgl.opengl.GL11.*;
private final FloatBuffer fb16 = BufferUtils.createFloatBuffer(16);
private final RenderContext context = new RenderContext();
private final GLObjectManager objManager = new GLObjectManager();
+ private final EnumSet<Caps> caps = EnumSet.noneOf(Caps.class);
private int maxTexSize;
private int maxCubeTexSize;
}
public EnumSet<Caps> getCaps() {
- return EnumSet.noneOf(Caps.class);
+ return caps;
}
public void initialize() {
//glDisable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+
+ if (GLContext.getCapabilities().GL_ARB_texture_non_power_of_two){
+ caps.add(Caps.NonPowerOfTwoTextures);
+ }else{
+ logger.log(Level.WARNING, "Your graphics card does not "
+ + "support non-power-of-2 textures. "
+ + "Some features might not work.");
+ }
}
public void resetGLObjects() {
statistics.onTextureUse(img, true);
}
+ // Check sizes if graphics card doesn't support NPOT
+ if (!GLContext.getCapabilities().GL_ARB_texture_non_power_of_two){
+ if (img.getWidth() != 0 && img.getHeight() != 0){
+ if (!FastMath.isPowerOfTwo(img.getWidth())
+ || !FastMath.isPowerOfTwo(img.getHeight())
+ || img.getWidth() != img.getHeight()){
+
+ // Resize texture to Power-of-2 size
+ MipMapGenerator.resizeToPowerOf2(img);
+
+ }
+ }
+ }
+
if (!img.hasMipmaps() && mips) {
// No pregenerated mips available,
// generate from base level if required
import com.jme3.light.LightList;\r
import com.jme3.material.RenderState;\r
import com.jme3.math.ColorRGBA;\r
+import com.jme3.math.FastMath;\r
import com.jme3.math.Matrix4f;\r
import com.jme3.math.Quaternion;\r
import com.jme3.math.Vector2f;\r
caps.add(Caps.VertexBufferArray);\r
}\r
\r
+ if (ctxCaps.GL_ARB_texture_non_power_of_two){\r
+ caps.add(Caps.NonPowerOfTwoTextures);\r
+ }else{\r
+ logger.log(Level.WARNING, "Your graphics card does not "\r
+ + "support non-power-of-2 textures. "\r
+ + "Some features might not work.");\r
+ }\r
+\r
boolean latc = ctxCaps.GL_EXT_texture_compression_latc;\r
boolean atdc = ctxCaps.GL_ATI_texture_compression_3dc;\r
if (latc || atdc) {\r
}\r
}\r
\r
+ // Check sizes if graphics card doesn't support NPOT\r
+ if (!GLContext.getCapabilities().GL_ARB_texture_non_power_of_two){\r
+ if (img.getWidth() != 0 && img.getHeight() != 0){\r
+ if (!FastMath.isPowerOfTwo(img.getWidth())\r
+ || !FastMath.isPowerOfTwo(img.getHeight())\r
+ || img.getWidth() != img.getHeight()){\r
+ logger.log(Level.WARNING, "Encountered NPOT texture {0}, "\r
+ + "it might not display correctly.", img);\r
+ }\r
+ }\r
+ }\r
+\r
if (target == GL_TEXTURE_CUBE_MAP) {\r
List<ByteBuffer> data = img.getData();\r
if (data.size() != 6) {\r
package jme3tools.converters;
+import com.jme3.math.FastMath;
import com.jme3.texture.Image;
import com.jme3.texture.Image.Format;
import com.jme3.texture.plugins.AWTLoader;
return targetImage;
}
+ public static void resizeToPowerOf2(Image image){
+ BufferedImage original = ImageToAwt.convert(image, false, true, 0);
+ int potWidth = FastMath.nearestPowerOfTwo(image.getWidth());
+ int potHeight = FastMath.nearestPowerOfTwo(image.getHeight());
+ int potSize = Math.max(potWidth, potHeight);
+
+ BufferedImage scaled = scaleDown(original, potSize, potSize);
+
+ AWTLoader loader = new AWTLoader();
+ Image output = loader.load(scaled, false);
+
+ image.setWidth(potSize);
+ image.setHeight(potSize);
+ image.setDepth(0);
+ image.setData(output.getData(0));
+ image.setFormat(output.getFormat());
+ image.setMipMapSizes(null);
+ }
+
public static void generateMipMaps(Image image){
BufferedImage original = ImageToAwt.convert(image, false, true, 0);
int width = original.getWidth();