• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2009-2010 jMonkeyEngine
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  *   notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  *   notice, this list of conditions and the following disclaimer in the
14  *   documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
17  *   may be used to endorse or promote products derived from this software
18  *   without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 package com.jme3.renderer;
34 
35 import com.jme3.material.RenderState;
36 import com.jme3.math.ColorRGBA;
37 import com.jme3.scene.Mesh;
38 import com.jme3.scene.VertexBuffer;
39 import com.jme3.texture.FrameBuffer;
40 import com.jme3.texture.Image;
41 
42 /**
43  * Represents the current state of the graphics library. This class is used
44  * internally to reduce state changes. NOTE: This class is specific to OpenGL.
45  */
46 public class RenderContext {
47 
48     /**
49      * @see RenderState#setFaceCullMode(com.jme3.material.RenderState.FaceCullMode)
50      */
51     public RenderState.FaceCullMode cullMode = RenderState.FaceCullMode.Off;
52 
53     /**
54      * @see RenderState#setDepthTest(boolean)
55      */
56     public boolean depthTestEnabled = false;
57 
58     /**
59      * @see RenderState#setAlphaTest(boolean)
60      */
61     public boolean alphaTestEnabled = false;
62 
63     /**
64      * @see RenderState#setDepthWrite(boolean)
65      */
66     public boolean depthWriteEnabled = true;
67 
68     /**
69      * @see RenderState#setColorWrite(boolean)
70      */
71     public boolean colorWriteEnabled = true;
72 
73     /**
74      * @see Renderer#setClipRect(int, int, int, int)
75      */
76     public boolean clipRectEnabled = false;
77 
78     /**
79      * @see RenderState#setPolyOffset(float, float)
80      */
81     public boolean polyOffsetEnabled = false;
82 
83     /**
84      * @see RenderState#setPolyOffset(float, float)
85      */
86     public float polyOffsetFactor = 0;
87 
88     /**
89      * @see RenderState#setPolyOffset(float, float)
90      */
91     public float polyOffsetUnits = 0;
92 
93     /**
94      * For normals only. Uses GL_NORMALIZE.
95      *
96      * @see VertexBuffer#setNormalized(boolean)
97      */
98     public boolean normalizeEnabled = false;
99 
100     /**
101      * For glMatrixMode.
102      *
103      * @see Renderer#setWorldMatrix(com.jme3.math.Matrix4f)
104      * @see Renderer#setViewProjectionMatrices(com.jme3.math.Matrix4f, com.jme3.math.Matrix4f)
105      */
106     public int matrixMode = -1;
107 
108     /**
109      * @see Mesh#setPointSize(float)
110      */
111     public float pointSize = 1;
112 
113     /**
114      * @see Mesh#setLineWidth(float)
115      */
116     public float lineWidth = 1;
117 
118     /**
119      * @see RenderState#setBlendMode(com.jme3.material.RenderState.BlendMode)
120      */
121     public RenderState.BlendMode blendMode = RenderState.BlendMode.Off;
122 
123     /**
124      * @see RenderState#setWireframe(boolean)
125      */
126     public boolean wireframe = false;
127 
128     /**
129      * @see RenderState#setPointSprite(boolean)
130      */
131     public boolean pointSprite = false;
132 
133     /**
134      * @see Renderer#setShader(com.jme3.shader.Shader)
135      */
136     public int boundShaderProgram;
137 
138     /**
139      * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
140      */
141     public int boundFBO = 0;
142 
143     /**
144      * Currently bound Renderbuffer
145      *
146      * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
147      */
148     public int boundRB = 0;
149 
150     /**
151      * Currently bound draw buffer
152      * -2 = GL_NONE
153      * -1 = GL_BACK
154      *  0 = GL_COLOR_ATTACHMENT0
155      *  n = GL_COLOR_ATTACHMENTn
156      *  where n is an integer greater than 1
157      *
158      * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
159      * @see FrameBuffer#setTargetIndex(int)
160      */
161     public int boundDrawBuf = -1;
162 
163     /**
164      * Currently bound read buffer
165      *
166      * @see RenderContext#boundDrawBuf
167      * @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
168      * @see FrameBuffer#setTargetIndex(int)
169      */
170     public int boundReadBuf = -1;
171 
172     /**
173      * Currently bound element array vertex buffer.
174      *
175      * @see Renderer#renderMesh(com.jme3.scene.Mesh, int, int)
176      */
177     public int boundElementArrayVBO;
178 
179     /**
180      * @see Renderer#renderMesh(com.jme3.scene.Mesh, int, int)
181      */
182     public int boundVertexArray;
183 
184     /**
185      * Currently bound array vertex buffer.
186      *
187      * @see Renderer#renderMesh(com.jme3.scene.Mesh, int, int)
188      */
189     public int boundArrayVBO;
190 
191     public int numTexturesSet = 0;
192 
193     /**
194      * Current bound texture IDs for each texture unit.
195      *
196      * @see Renderer#setTexture(int, com.jme3.texture.Texture)
197      */
198     public Image[] boundTextures = new Image[16];
199 
200     /**
201      * IDList for texture units
202      *
203      * @see Renderer#setTexture(int, com.jme3.texture.Texture)
204      */
205     public IDList textureIndexList = new IDList();
206 
207     /**
208      * Currently bound texture unit
209      *
210      * @see Renderer#setTexture(int, com.jme3.texture.Texture)
211      */
212     public int boundTextureUnit = 0;
213 
214     /**
215      * Stencil Buffer state
216      */
217     public boolean stencilTest = false;
218     public RenderState.StencilOperation frontStencilStencilFailOperation = RenderState.StencilOperation.Keep;
219     public RenderState.StencilOperation frontStencilDepthFailOperation = RenderState.StencilOperation.Keep;
220     public RenderState.StencilOperation frontStencilDepthPassOperation = RenderState.StencilOperation.Keep;
221     public RenderState.StencilOperation backStencilStencilFailOperation = RenderState.StencilOperation.Keep;
222     public RenderState.StencilOperation backStencilDepthFailOperation = RenderState.StencilOperation.Keep;
223     public RenderState.StencilOperation backStencilDepthPassOperation = RenderState.StencilOperation.Keep;
224     public RenderState.TestFunction frontStencilFunction = RenderState.TestFunction.Always;
225     public RenderState.TestFunction backStencilFunction = RenderState.TestFunction.Always;
226 
227     /**
228      * Vertex attribs currently bound and enabled. If a slot is null, then
229      * it is disabled.
230      */
231     public VertexBuffer[] boundAttribs = new VertexBuffer[16];
232 
233     /**
234      * IDList for vertex attributes
235      */
236     public IDList attribIndexList = new IDList();
237 
238     /**
239      * Ambient color (GL1 only)
240      */
241     public ColorRGBA ambient;
242 
243     /**
244      * Diffuse color (GL1 only)
245      */
246     public ColorRGBA diffuse;
247 
248     /**
249      * Specular color (GL1 only)
250      */
251     public ColorRGBA specular;
252 
253     /**
254      * Material color (GL1 only)
255      */
256     public ColorRGBA color;
257 
258     /**
259      * Shininess (GL1 only)
260      */
261     public float shininess;
262 
263     /**
264      * Use vertex color (GL1 only)
265      */
266     public boolean useVertexColor;
267 
268     /**
269      * Reset the RenderContext to default GL state
270      */
reset()271     public void reset(){
272         cullMode = RenderState.FaceCullMode.Off;
273         depthTestEnabled = false;
274         alphaTestEnabled = false;
275         depthWriteEnabled = false;
276         colorWriteEnabled = false;
277         clipRectEnabled = false;
278         polyOffsetEnabled = false;
279         polyOffsetFactor = 0;
280         polyOffsetUnits = 0;
281         normalizeEnabled = false;
282         matrixMode = -1;
283         pointSize = 1;
284         blendMode = RenderState.BlendMode.Off;
285         wireframe = false;
286         boundShaderProgram = 0;
287         boundFBO = 0;
288         boundRB = 0;
289         boundDrawBuf = -1;
290         boundReadBuf = -1;
291         boundElementArrayVBO = 0;
292         boundVertexArray = 0;
293         boundArrayVBO = 0;
294         numTexturesSet = 0;
295         for (int i = 0; i < boundTextures.length; i++)
296             boundTextures[i] = null;
297 
298         textureIndexList.reset();
299         boundTextureUnit = 0;
300         for (int i = 0; i < boundAttribs.length; i++)
301             boundAttribs[i] = null;
302 
303         attribIndexList.reset();
304 
305         stencilTest = false;
306         frontStencilStencilFailOperation = RenderState.StencilOperation.Keep;
307         frontStencilDepthFailOperation = RenderState.StencilOperation.Keep;
308         frontStencilDepthPassOperation = RenderState.StencilOperation.Keep;
309         backStencilStencilFailOperation = RenderState.StencilOperation.Keep;
310         backStencilDepthFailOperation = RenderState.StencilOperation.Keep;
311         backStencilDepthPassOperation = RenderState.StencilOperation.Keep;
312         frontStencilFunction = RenderState.TestFunction.Always;
313         backStencilFunction = RenderState.TestFunction.Always;
314 
315         ambient = diffuse = specular = color = null;
316         shininess = 0;
317         useVertexColor = false;
318     }
319 }
320