Per-side texturing and textures loaded in.

origin
Joshua Sigona 3 years ago
parent 6c0b5ccd32
commit 87c2c555b8
  1. 12
      cube.obj
  2. 4
      src/sig/BlockType.java
  3. 24
      src/sig/Cube.java
  4. 2
      src/sig/Mesh.java
  5. 49
      src/sig/SigRenderer.java
  6. 6
      src/sig/Texture.java
  7. 9
      src/sig/TextureType.java

@ -12,15 +12,15 @@ vt 0 1 #2
vt 1 0 #3
vt 1 1 #4
f 1/2 3/1 7/3
f 1/2 3/1 7/3 #South
f 1/2 7/3 5/4
f 5/2 7/1 8/3
f 5/2 7/1 8/3 #East
f 5/2 8/3 6/4
f 6/2 8/1 4/3
f 6/2 8/1 4/3 #North
f 6/2 4/3 2/4
f 2/2 4/1 3/3
f 2/2 4/1 3/3 #West
f 2/2 3/3 1/4
f 3/2 4/1 8/3
f 3/2 4/1 8/3 #Top
f 3/2 8/3 7/4
f 6/2 2/1 1/3
f 6/2 2/1 1/3 #Bottom
f 6/2 1/3 5/4

@ -222,4 +222,8 @@ public enum BlockType {
sides[RIGHT]=sideRight;
sides[LEFT]=sideLeft;
}
public Texture getTexture(int side) {
return SigRenderer.blockTextures.get(sides[side]);
}
}

@ -0,0 +1,24 @@
package sig;
import sig.utils.OBJReader;
public class Cube extends Mesh{
Cube(BlockType type) {
super(type);
this.triangles=OBJReader.ReadOBJFile("cube.obj",true);
triangles.get(0).tex=type.getTexture(BlockType.FRONT);
triangles.get(1).tex=type.getTexture(BlockType.FRONT);
triangles.get(2).tex=type.getTexture(BlockType.RIGHT);
triangles.get(3).tex=type.getTexture(BlockType.RIGHT);
triangles.get(4).tex=type.getTexture(BlockType.BACK);
triangles.get(5).tex=type.getTexture(BlockType.BACK);
triangles.get(6).tex=type.getTexture(BlockType.LEFT);
triangles.get(7).tex=type.getTexture(BlockType.LEFT);
triangles.get(8).tex=type.getTexture(BlockType.TOP);
triangles.get(9).tex=type.getTexture(BlockType.TOP);
triangles.get(10).tex=type.getTexture(BlockType.BOTTOM);
triangles.get(11).tex=type.getTexture(BlockType.BOTTOM);
}
}

@ -21,4 +21,6 @@ public class Mesh {
t.tex=te;
}
}
Mesh(BlockType type) {;
}
}

@ -7,7 +7,10 @@ import sig.utils.OBJReader;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
@ -48,11 +51,11 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
public static float roll = 0;
final float MOVESPEED = 0.2f;
final float TURNSPEED = 0.2f;
final float TURNSPEED = 0.05f;
public static float[] depthBuffer;
public static Mesh DIRT_CUBE=new Mesh("cube.obj","dirt.png");
public static HashMap<TextureType,Texture> blockTextures = new HashMap<TextureType,Texture>();
boolean upHeld=false,downHeld=false,leftHeld=false,rightHeld=false,
aHeld=false,sHeld=false,dHeld=false,wHeld=false;
@ -63,10 +66,10 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
public void runGameLoop() {
if (upHeld) {
pitch+=MOVESPEED;
pitch+=TURNSPEED;
}
if (downHeld) {
pitch-=MOVESPEED;
pitch-=TURNSPEED;
}
if (rightHeld) {
roll-=MOVESPEED;
@ -95,8 +98,8 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
}
}
public static void addBlock(Vector pos,Mesh type) {
Block b = new Block(pos,type);
public static void addBlock(Vector pos,BlockType type) {
Block b = new Block(pos,new Cube(type));
blockGrid.put(pos.x+"_"+pos.y+"_"+pos.z,b);
b.updateFaces();
updateRenderGrid();
@ -120,8 +123,10 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
Random r = new Random(438107);
for (int x=0;x<32;x++) {
for (int z=0;z<32;z++) {
for (int y=0;y<r.nextInt(64);y++) {
addBlock(new Vector(x,y,z),DIRT_CUBE);
if (Math.random()<=0.5) {
addBlock(new Vector(x,0,z),BlockType.DIRT);
} else {
addBlock(new Vector(x,0,z),BlockType.SNOW_DIRT);
}
}
}
@ -165,8 +170,32 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
}.start();
}
public static void main(String[] args) {
JFrame f = new JFrame("SigRenderer");
new SigRenderer(f);
try {
final int BLOCK_WIDTH = 128;
final int BLOCK_HEIGHT = 128;
BufferedImage img = ImageIO.read(new File("textures.png"));
WritableRaster r = img.getRaster();
for (TextureType tt : TextureType.values()) {
int[] pixelData = new int[tt.texWidth*BLOCK_WIDTH*tt.texHeight*BLOCK_HEIGHT];
int startX=tt.texX*BLOCK_WIDTH;
int startY=tt.texY*BLOCK_HEIGHT;
for (int x=0;x<tt.texWidth*BLOCK_WIDTH;x++) {
for (int y=0;y<tt.texHeight*BLOCK_HEIGHT;y++) {
int[] pixel = r.getPixel(x+startX,y+startY,new int[4]);
pixelData[x+y*tt.texWidth*BLOCK_WIDTH]=pixel[2]+(pixel[1]<<8)+(pixel[0]<<16)+(pixel[3]<<24);
}
}
blockTextures.put(tt,new Texture(pixelData,tt.texWidth*BLOCK_WIDTH,tt.texHeight*BLOCK_HEIGHT));
}
JFrame f = new JFrame("SigRenderer");
new SigRenderer(f);
} catch (IOException e) {
System.err.println("Cannot find game textures! (textures.png required)");
}
}
@Override

@ -33,6 +33,12 @@ public class Texture{
}
}
public Texture(int[] tex,int width,int height) {
this.tex=tex;
this.width=width;
this.height=height;
}
public int getColor(float u,float v,float mult) {
int sx = (int)(u*width-1f);
int sy = (int)(v*height-1f);

@ -1,5 +1,12 @@
package sig;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import javax.imageio.ImageIO;
public enum TextureType {
GRASS_TOP(0,0),
STONE(1,0),
@ -255,8 +262,8 @@ public enum TextureType {
(14,15),
(15,15),*/
;
int texX,texY,texWidth,texHeight;
Texture tex;
TextureType(int texX,int texY) {
this(texX,texY,1,1);

Loading…
Cancel
Save