View Javadoc

1   package com.insanityengine.ghia.renderer;
2   
3   import java.util.Stack;
4   
5   import java.awt.*;
6   
7   import java.applet.Applet;
8   import java.awt.Component;
9   import java.awt.image.ImageObserver;
10  
11  import com.insanityengine.ghia.m3.*;
12  import com.insanityengine.ghia.libograf.*;
13  import com.insanityengine.ghia.pixels.*;
14  import com.insanityengine.ghia.renderer.*;
15  
16  /***
17   *
18   * <P>
19   * Implements the RendererConsumerInterface.
20   * </P>
21   *
22   * @author BrianHammond
23   *
24   * $Header: /usr/local/cvsroot/ghia/src/java/com/insanityengine/ghia/renderer/RendererConsumer.java,v 1.5 2005/03/19 17:50:02 brian Exp $
25   *
26   */
27  
28  public class RendererConsumer implements RendererConsumerInterface {
29  
30  	////////////////////////////////////////////////////////
31  
32  	/***
33  	 *
34  	 * Constructor
35  	 *
36  	 */
37  	public RendererConsumer() {
38  		init( 0, 0, null );
39  	}
40  
41  	/***
42  	 *
43  	 * Constructor
44  	 *
45  	 * @param width of the display
46  	 * @param height of the display
47  	 * @param component to use for graphics (yuck!)
48  	 *
49  	 */
50  	public RendererConsumer( int width, int height, java.awt.Component component ) {
51  		init( width, height, component );
52  	}
53  
54  	/***
55  	 *
56  	 * Constructor, if m3_renderName parameter is defined for the 
57  	 * Applet, it will attempt to use it with the createRenderer
58  	 * method
59  	 *
60  	 * @param applet which provides context
61  	 *
62  	 */
63  	public RendererConsumer( Applet applet ) {
64  		init( applet );
65  	}
66  
67  	/***
68  	 *
69  	 * Initialize this RendererConsumer
70  	 *
71  	 * @param applet which provides context
72  	 *
73  	 */
74  	public void init( Applet applet ) {
75  		init( 
76  			applet.getSize().width,
77  			applet.getSize().height,
78  			applet
79  		);
80  		renderer.setDepthTesting( true );
81  		renderer.setShadingMethod( M3_Constants.NONE_SHADE );
82  		renderer.setShadingMethod( M3_Constants.PHONG_SHADE );
83  		renderer.setShadingMethod( M3_Constants.NORM_SHADE );
84  	}
85  	
86  	/***
87  	 *
88  	 * Initialize this RendererConsumer
89  	 *
90  	 * @param width of the display
91  	 * @param height of the display
92  	 * @param component to use
93  	 *
94  	 */
95  	public void init( int width, int height, java.awt.Component component ) {
96  
97  		w = width;
98  		h = height;
99  		this.component = component;
100 
101 		if ( 0 != width ) createRenderer();
102 		if ( null != renderer ) renderer.setObserver( component );
103 	}
104 
105 	/***
106 	 *
107 	 * Create a renderer with a given size
108 	 *
109 	 * @param width of the renderer to create
110 	 * @param height of the renderer to create
111 	 *
112 	 * @return true on success, false on fail
113 	 *
114 	 */
115 	public final boolean createRenderer( int width, int height ) {
116 		w = width;
117 		h = height;
118 		return createRenderer();
119 	}
120 
121 	/***
122 	 * 
123 	 * Try to create a renderer given the name of the class 
124 	 * It will be initialized with the values passed into the init
125 	 * method of this LiboGraf instance
126 	 *
127 	 * @param nameOfRenderer to try to use
128 	 *
129 	 * @return true if succeds, else false
130 	 *
131 	 */
132 	public final boolean createRenderer( String nameOfRenderer ) {
133 		
134 		String cause = "unknown";
135 		boolean success = false;
136 
137 		RendererInterface renderer = Renderer.getRendererByName( nameOfRenderer );
138 		if ( null == renderer ) {
139 			cause = "no rendererer named " + nameOfRenderer;
140 		} else {
141 			renderer.init( w, h, component );
142 			this.renderer = renderer;
143 			success = true;
144 		}
145 
146 		if ( !success ) System.err.println( "RendererConsumer.createRenderer failed: " + cause );
147 		else System.err.println( "RendererConsumer.createRenderer succeeded: " + nameOfRenderer );
148 		
149 		return success;
150 	}
151 
152 	/***
153 	 *
154 	 * Create a renderer of the default type using the values from 
155 	 * sent to init
156 	 *
157 	 * @return true if succeds, else false
158 	 *
159 	 */
160 	public final boolean createRenderer() {
161 		String rname = null;
162 		String pname = "m3_renderName";
163 		
164 		if ( component instanceof Applet ) {
165 			try {
166 				rname = ( ( Applet ) component ).getParameter( pname );
167 			} catch ( Exception e ) {
168 			}
169 		}
170 	
171 		try {	
172 			if ( null == rname ) rname = System.getProperty( pname );
173 		} catch ( Exception e ) {
174 		}
175 		
176 		if ( null == rname ) rname = "com.insanityengine.ghia.renderer.Memagery";
177 		return createRenderer( rname );
178 	}
179 	
180 	/***
181 	 *
182 	 * Get the renderer
183 	 *
184 	 * @return the renderer
185 	 *
186 	 */
187 	public final RendererInterface getRenderer() { 
188 		return renderer;
189 	}
190 
191 	/***
192 	 *
193 	 * Set the renderer
194 	 *
195 	 * @param renderer to use
196 	 *
197 	 */
198 	public final void setRenderer( RendererInterface renderer ) {
199 		this.renderer = renderer;
200 		w = renderer.getWidth();
201 		h = renderer.getHeight();
202 	}
203 
204 	/***
205 	 *
206 	 * Render the scene
207 	 *
208 	 */
209 	public void render( LiboGraf gl ) {
210 		renderer.render( gl );
211 	}
212 
213 	/***
214 	 *
215 	 * Set the graphics to use
216 	 * 
217 	 * @param graphics to use
218 	 *
219 	 */
220 	public void setGraphics( Graphics graphics ) {
221 		this.graphics = graphics;
222 	}
223 	
224 	/***
225 	 *
226 	 * Get the graphics
227 	 *
228 	 */
229 	public Graphics getGraphics() {
230 		return graphics;
231 	}
232 	
233 	////////////////////////////////////////////////////////
234 	
235 	protected int w = 0, h = 0;
236 	private RendererInterface renderer = null;
237 	private Component component = null;
238 	private Graphics graphics = null;
239 	
240 };
241 
242 /***
243  *
244  * $Log: RendererConsumer.java,v $
245  * Revision 1.5  2005/03/19 17:50:02  brian
246  * repackaging
247  *
248  * Revision 1.4  2004/09/11 14:56:06  brian
249  * use the Renderer.getRendererByName static method
250  *
251  * Revision 1.3  2004/09/11 14:44:59  brian
252  * each class should have an interface and vice versa...
253  *
254  * Revision 1.2  2004/09/11 14:37:21  brian
255  * added RendererConsumer and stuff
256  *
257  */