From: Andreas B. <and...@us...> - 2002-05-27 09:51:59
|
Update of /cvsroot/chaosrts/net/sourceforge/chaosrts/client/galaxy/engine In directory usw-pr-cvs1:/tmp/cvs-serv6465/client/galaxy/engine Modified Files: Engine3D.java EngineTest.java Added Files: TerrainTextureManager.java Log Message: a --- NEW FILE: TerrainTextureManager.java --- /* This file is part of Chaotic Domain, an advanced and highly customizable real-time strategy game written in Java. Copyright (C) 2002 Andreas Bauer Chaotic Domain is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Chaotic Domain is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Chaotic Domain; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package net.sourceforge.chaosrts.client.galaxy.engine; import java.util.*; import java.net.*; import java.awt.image.*; import javax.imageio.*; import javax.media.j3d.*; import com.sun.j3d.utils.image.*; import net.sourceforge.chaosrts.common.*; /** This class handels the terrain textures and creates the TextureUnitState * arrays for the terrain shapes * *@since 0.0.0pre3 *@author andybauer */ public class TerrainTextureManager { static final short[] bitmasks = {128,64,32,16,8,4,2,1}; static final byte[][] round = {{0,-1},{1,0},{0,1},{-1,0},{-1,-1},{1,-1},{1,1},{-1,1}}; static final short[] magic = {240,224,112,176,208,96,48,144,192,32,64,128,16,8,4,2,1}; static final short[] magic2 = {0,16,128,64,32,152,196,98,49,220,185,115,230,247,251,253,254}; /*creates a new TerrainTextureManager * *@param myEngine my 3D engine *@since 0.0.0pre3 *@author andybauer */ public TerrainTextureManager(Engine3D myEngine) { this.myEngine = myEngine; base = "/data/"+ChaosTree.theChaosTree.mod+"/terrain/"; normal = new TextureAttributes(); normal.setTextureMode(TextureAttributes.REPLACE); transparent = new TextureAttributes(); transparent.setTextureMode(TextureAttributes.COMBINE); transparent.setCombineRgbMode(TextureAttributes.COMBINE_REPLACE); transparent.setCombineRgbSource(0,TextureAttributes.COMBINE_TEXTURE_COLOR); transparent.setCombineAlphaMode(TextureAttributes.COMBINE_MODULATE); transparent.setCombineAlphaSource(0,TextureAttributes.COMBINE_TEXTURE_COLOR); transparent.setCombineAlphaSource(2,TextureAttributes.COMBINE_PREVIOUS_TEXTURE_UNIT_STATE); } /** This String is the base url * *@author andybauer *@since 0.0.0pre3 */ String base; /** My 3D Engine (used to get acces to the map * *@since 0.0.0pre3 *@author andybauer */ Engine3D myEngine; /** This Hashtable contains texture unit state arrays of the terrains * *@author andybauer *@since 0.0.0pre3 */ Hashtable textureArrays = new Hashtable(); /** This obj is the texture attribute for the base texture * *@since 0.0.0pre3 *@author andybauer */ public TextureAttributes normal; /** This obj is the texture attribute for the overlaping texture * *@since 0.0.0pre3 *@author andybauer */ public TextureAttributes transparent; /**This methods updates the TextureUnitState of a Grid shape. * *@param theGrid the Grid to update for *@param appearance the appearance to update *@since 0.0.0pre3 *@author andybauer */ public void updateTextureUnitState(Grid theGrid, Appearance appearance) { Vector types = new Vector(); short currprecendence = theGrid.type.precendence; for(int i =0;i<8;i++) { try { Terrain tmp = myEngine.map[theGrid.X+round[i][0]][theGrid.Y+round[i][1]].type; if(tmp.precendence>currprecendence && !types.contains(tmp)) { types.add(tmp); } } catch (Exception e) {} } Collections.sort(types); int currState = 1; Enumeration enum = types.elements(); while(enum.hasMoreElements()) { short bitmask = 0; Terrain currType = (Terrain) enum.nextElement(); TextureUnitState[] tex = (TextureUnitState[]) textureArrays.get(currType); for(int i=0;i<8;i++) { try { Terrain tmp = myEngine.map[theGrid.X+round[i][0]][theGrid.Y+round[i][1]].type; if(tmp==currType) { bitmask = (short)(bitmask | bitmasks[i]); } } catch (Exception e) {} } for(int i=0;i<17;i++) { if((bitmask&magic[i])==magic[i]) { bitmask = (short)(bitmask&magic2[i]); appearance.setTextureUnitState(currState, tex[i]); //currState++; } } } } /** updates the TextureUnitState for all new added Grids * *@author andybauer *@since 0.0.0pre3 */ public void updateNewGrid(boolean initial) { if(!initial) { Vector updated = new Vector(); Enumeration e = myEngine.newAddedGrids.elements(); while(e.hasMoreElements()) { Grid tmp = (Grid)e.nextElement(); short x = tmp.X; short y = tmp.Y; short prec = tmp.type.precendence; updated.add(tmp); updateTextureUnitState(tmp,myEngine.appearancemap[tmp.X][tmp.Y]); for(int i=0;i<8;i++) { try { Grid tmp2 = myEngine.map[x+round[i][0]][y+round[i][0]]; if(tmp2.type.precendence < prec &&!(updated.contains(tmp2))) { updated.add(tmp2); updateTextureUnitState(tmp2,myEngine.appearancemap[tmp2.X][tmp2.Y]); } } catch(Exception ex) {} } } } else { Enumeration e = myEngine.newAddedGrids.elements(); while(e.hasMoreElements()) { Grid tmp = (Grid)e.nextElement(); updateTextureUnitState(tmp,myEngine.appearancemap[tmp.X][tmp.Y]); } } myEngine.newAddedGrids.clear(); } /** Returns the base texture unit state for a terrain type * *@param terrain the terrain type *@returns the base texture unit state for terrain *@author andybauer *@since 0.0.0pre3 */ public TextureUnitState getBaseTexture(Terrain terrain) { if(!textureArrays.containsKey(terrain)) { loadTextures(terrain); } return ((TextureUnitState[])textureArrays.get(terrain))[17]; } /* This method loads the textures for a terrain object * *@returns if the texture were loaded *@author andybauer *@since 0.0.0pre3 */ public void loadTextures(Terrain terrain) { if(!textureArrays.containsKey(terrain)) { TextureUnitState[] textures = new TextureUnitState[18]; if(terrain.parent!=null) { if(!textureArrays.containsKey(terrain.parent)) { loadTextures(terrain.parent); } TextureUnitState[] parenttexture = (TextureUnitState[]) textureArrays.get(terrain.parent); for(int i=0;i<17;i++) { textures[i] = parenttexture[i]; } } else { for(int i=0;i<17;i++) { try { textures[i] = new TextureUnitState(loadText(getClass().getResource(base+terrain.model+i+".png"),true),transparent,null); } catch (Exception e) { System.out.println("coudn't load terrain texture "+base+terrain.model+i+".png"); } } } try { textures[17] = new TextureUnitState(loadText(getClass().getResource(base+terrain.model+".png"),false),normal,null); } catch (Exception e) { System.out.println("coudn't load terrain texture "+base+terrain.model+".png"); } textureArrays.put(terrain,textures); } } private Texture loadText(URL url,boolean transparent) throws Exception{ if( url == null) { throw new Exception(); } BufferedImage tmp = ImageIO.read(url); ImageComponent2D image = new ImageComponent2D(transparent? ImageComponent.FORMAT_RGBA:ImageComponent.FORMAT_RGB,tmp); Texture2D texture = new Texture2D(Texture.BASE_LEVEL,transparent? Texture.RGBA:Texture.RGB,tmp.getWidth(),tmp.getHeight()); texture.setImage(0,image); texture.setMagFilter(Texture.NICEST); texture.setMinFilter(Texture.NICEST); texture.setBoundaryModeS(Texture.WRAP); texture.setBoundaryModeT(Texture.WRAP); return texture; } } Index: Engine3D.java =================================================================== RCS file: /cvsroot/chaosrts/net/sourceforge/chaosrts/client/galaxy/engine/Engine3D.java,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -d -r1.33 -r1.34 *** Engine3D.java 27 May 2002 09:29:04 -0000 1.33 --- Engine3D.java 27 May 2002 09:51:56 -0000 1.34 *************** *** 230,234 **** public AmbientLight ambLight; ! /** Yust a simple blue background * *@author andybauer --- 230,234 ---- public AmbientLight ambLight; ! /** Just a simple blue background * *@author andybauer *************** *** 311,321 **** /** Creates new Engine3D * ! * @param theCanvas the 3DCanvas to draw to * @author andybauer * @since 0.0.0pre2 * @param theClient The galaxyClient of the Engine3D */ ! public Engine3D(Canvas3D theCanvas,GalaxyClient theClient) { ! this.theCanvas = theCanvas; this.myClient = theClient; --- 311,321 ---- /** Creates new Engine3D * ! * @param theConfig The graphicsConfiguration for the Canvas3D * @author andybauer * @since 0.0.0pre2 * @param theClient The galaxyClient of the Engine3D */ ! public Engine3D(GraphicsConfiguration theConfig, GalaxyClient theClient) { ! this.myClient = theClient; *************** *** 345,348 **** --- 345,350 ---- thePlatform.setActivationRadius(1); + theCanvas = new Canvas3D(theConfig); + everOn = new BoundingLeaf(new BoundingSphere(new Point3d(0,0,0),40)); *************** *** 464,467 **** --- 466,479 ---- } + /** Returns the Canvas 3D + * + *@returns the Canvas 3D + *@since 0.0.0pre3 + *@author andybauer + */ + public Canvas3D getCanvas3D() { + return theCanvas; + } + /** resets the complete Engine * *************** *** 492,495 **** --- 504,508 ---- //FIXME andybauer reset 3D stuff in GalaxyObject too + buildings.clear(); //construct terrain pick part *************** *** 546,552 **** terrainBG.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); terrainBG.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); ! terrainBG.setCapability(Node.ENABLE_PICK_REPORTING); ! ! //create the City part cityBG = new BranchGroup(); --- 559,563 ---- terrainBG.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); terrainBG.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); ! terrainBG.setCapability(Node.ENABLE_PICK_REPORTING); //create the City part cityBG = new BranchGroup(); *************** *** 667,670 **** --- 678,682 ---- /**Update the Grids appearanche (overlaping textures) * + *@param initial is this the first call to this method since the last resetEngine call? *@author andybauer *@since 0.0.0pre3 Index: EngineTest.java =================================================================== RCS file: /cvsroot/chaosrts/net/sourceforge/chaosrts/client/galaxy/engine/EngineTest.java,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** EngineTest.java 27 May 2002 09:29:04 -0000 1.21 --- EngineTest.java 27 May 2002 09:51:56 -0000 1.22 *************** *** 50,55 **** GraphicsConfigTemplate3D gct = new GraphicsConfigTemplate3D(); GraphicsConfiguration gc = gd.getBestConfiguration(gct); ! Canvas3D tmp = new Canvas3D(gc); ! Engine3D tmp2 = new Engine3D(tmp,null); tmp2.resetEngine(true,150,150,0); getContentPane().add(tmp); --- 50,56 ---- GraphicsConfigTemplate3D gct = new GraphicsConfigTemplate3D(); GraphicsConfiguration gc = gd.getBestConfiguration(gct); ! ! Engine3D tmp2 = new Engine3D(gc,null); ! Canvas3D tmp = tmp2.getCanvas3D(); tmp2.resetEngine(true,150,150,0); getContentPane().add(tmp); |