Hi,
me and some of my friends began to create a game based on lwjgl a few weeks ago. Drawing textures works perfectly, but then we decided to write a method to draw single-colored rectangles (for backgrounds and things).
The method works as long as I don't call TextureLoader.getTexture(...) before.
Here is my Code:
The main-class:
package net;
import static org.lwjgl.opengl.GL11.GL_BLEND;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_MODELVIEW;
import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA;
import static org.lwjgl.opengl.GL11.GL_PROJECTION;
import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA;
import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
import static org.lwjgl.opengl.GL11.glBlendFunc;
import static org.lwjgl.opengl.GL11.glClear;
import static org.lwjgl.opengl.GL11.glEnable;
import static org.lwjgl.opengl.GL11.glLoadIdentity;
import static org.lwjgl.opengl.GL11.glMatrixMode;
import static org.lwjgl.opengl.GL11.glOrtho;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
public class Main {
public static void main(String[] args) {
init();
while(!Display.isCloseRequested()) {
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
TextureUtil.drawRect(); //calling the method, which should draw a test-rect
Display.update();
Display.sync(60);
}
Display.destroy();
}
private static void init() {
initDisplay();
initOGL();
}
private static void initDisplay() {
try {
Display.setDisplayMode(new DisplayMode(800, 600));
Display.setTitle("Pathfinder");
Display.create();
} catch(LWJGLException e){
e.printStackTrace();
}
}
private static void initOGL() {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 800, 0, 600, 1, -1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
}
And the TextureUtil-Class:
package net;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
public class TextureUtil {
private static final Texture errTexture = getErrTexture(); //when i delete this row, the rectangle is visible
private static Texture getErrTexture() { //loads a default texture, which will be shown if some texture misses
try {
return TextureLoader.getTexture("PNG", new FileInputStream(new File("res/textures/err.png")));
} catch (Exception e) {
Display.destroy();
e.printStackTrace();
System.exit(0);
}
return null;
}
public static void drawTexture(Texture texture, int x, int y, int width, int height) { //draws a texture on the given position
texture.bind();
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0, 0); GL11.glVertex2i(x, y);
GL11.glTexCoord2f(1, 0); GL11.glVertex2i(x + width, y);
GL11.glTexCoord2f(1, 1); GL11.glVertex2i(x + width, y + height);
GL11.glTexCoord2f(0, 1); GL11.glVertex2i(x, y + height);
GL11.glEnd();
}
public static void drawRect() { //draw some test-rect
// set the color of the quad (R,G,B,A)
GL11.glColor3f(10.5f,2.5f,1.0f);
// draw quad
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(100,100);
GL11.glVertex2f(100+200,100);
GL11.glVertex2f(100+200,100+200);
GL11.glVertex2f(100,100+200);
GL11.glEnd();
}
}
I absolutely do not understand why these completely different things influence each other.
Thank you for your help :)
Hoeman
I can't see your problem, but I noticed this line in your code:
glColor3f(10.5f,2.5f,1.0f);
I think that colors can be only from 0f to 1f.
And before some time when I wanted to draw line while enabled texture2d and not binding any texture before drawing line, I couldn't see it. Try to disable texture2d before rendering quad.
Thank you very much :)
I added
GL11.glDisable(GL11.GL_TEXTURE_2D);
before drawing the rectangle and it works :D