35#include <libFreeWRL.h>
37#include "../vrml_parser/Structs.h"
38#include "../main/headers.h"
39#include "../opengl/OpenGL_Utils.h"
40#include "../opengl/Textures.h"
41#include "../scenegraph/Component_Shape.h"
42#include "../scenegraph/RenderFuncs.h"
43#include "../scenegraph/Polyrep.h"
44#include "LinearAlgebra.h"
46void pushnset_framebuffer(
int ibuffer);
47void popnset_framebuffer();
48void fw_gluPerspective_2(
double xcenter,
double fovy,
double aspect,
double zNear,
double zFar);
49void push_globalRenderFlags();
50void pop_globalRenderFlags();
51void printFramebufferStatusIfNotComplete(
int status);
52void set_debug_quad(
int which_debug_shader,
int textureID);
67 if (!strcmp(node->update->strptr,
"ALWAYS") || !strcmp(node->update->strptr,
"NEXT_FRAME_ONLY")) {
70 if (rs->render_geom) {
71 double modelviewmatrix[16];
72 textureTableIndexStruct_s* tti;
73 float vp[4] = { 0.0f,1.0f,0.0f,1.0f };
76 tti = getTableIndex(node->__textureTableIndex);
84 tti->x = node->size.p[0];
85 tti->y = node->size.p[1];
86 glGenTextures(1, &tti->OpenGLTexture);
88 glBindTexture(GL_TEXTURE_2D, tti->OpenGLTexture);
89 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
90 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
92 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
93 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
94 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tti->x, tti->y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
97 glBindTexture(GL_TEXTURE_2D, 0);
99 glGenFramebuffers(1, &tti->ifbobuffer);
100 glBindFramebuffer(GL_FRAMEBUFFER, tti->ifbobuffer);
108 glGenRenderbuffers(1, &tti->idepthbuffer);
110 glBindRenderbuffer(GL_RENDERBUFFER, tti->idepthbuffer);
111 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, tti->x, tti->y);
113 glBindRenderbuffer(GL_RENDERBUFFER, 0);
117 glViewport(0, 0, tti->x, tti->y);
118 glEnable(GL_TEXTURE_GEN_S);
119 glEnable(GL_TEXTURE_GEN_T);
121 PRINT_GL_ERROR_IF_ANY(
"render_GeneratedTexture, after set framebuffer");
125 if (tti->OpenGLTexture == 0) glGenTextures(1, &tti->OpenGLTexture);
126 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tti->OpenGLTexture, 0);
128 PRINT_GL_ERROR_IF_ANY(
"render_GeneratedTexture, after glFramebufferTexture2D");
130 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, tti->idepthbuffer);
132 glBindFramebuffer(GL_FRAMEBUFFER, 0);
135 pushnset_framebuffer(tti->ifbobuffer);
138 glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
139 FW_GL_CLEAR(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
143 FW_GL_MATRIX_MODE(GL_PROJECTION);
144 FW_GL_LOAD_IDENTITY();
146 fw_gluPerspective_2(0.0, 90.0, 1.0, .1, 10000.0);
148 FW_GL_MATRIX_MODE(GL_MODELVIEW);
149 FW_GL_LOAD_IDENTITY();
160 PRINT_GL_ERROR_IF_ANY(
"render_GeneratedTexture, before render_hier");
163 PRINT_GL_ERROR_IF_ANY(
"XEvents::render, after render_hier(VF_globalLight)");
167 profile_start(
"hier_geom");
168 push_globalRenderFlags();
171 normalChildren(node->children);
172 pop_globalRenderFlags();
174 profile_end(
"hier_geom");
175 PRINT_GL_ERROR_IF_ANY(
"render_GeneratedTexture, after render_hier(VF_Geom)");
185 int status = glCheckNamedFramebufferStatus(tti->ifbobuffer, GL_FRAMEBUFFER);
186 printFramebufferStatusIfNotComplete(status);
187 popnset_framebuffer();
190 set_debug_quad(2, tti->ifbobuffer);
196 gglobal()->RenderFuncs.textureStackTop = 1;
197 gglobal()->RenderFuncs.texturenode = node;
203 loadTextureNode(X3D_NODE(node),NULL);
204 gglobal()->RenderFuncs.textureStackTop=1;
206void* set_TextureRep(
void* _texrep) {
221 if (tr->buffer->loaded) {
223 loadTextureNode(X3D_NODE(node), NULL);
224 gglobal()->RenderFuncs.textureStackTop = 1;
231 if (node->autoRefresh > 0.0) {
232 double dtime = TickTime();
233 double elapsedTime = dtime - node->__lasttime;
234 double runtime = dtime - BrowserStartTime();
235 if (elapsedTime > node->autoRefresh && runtime < node->autoRefreshTimeLimit) {
236 node->__lasttime = dtime;
237 textureTableIndexStruct_s* tti;
238 tti = getTableTableFromTextureNode(X3D_NODE(node));
239 tti->status = TEX_NOTLOADED;
243 loadTextureNode(X3D_NODE(node),NULL);
245 gglobal()->RenderFuncs.textureStackTop=1;
250 loadMultiTexture(node);
257 render_AudioClip(anode);
258 if (node->autoRefresh > 0.0) {
259 double dtime = TickTime();
260 double elapsedTime = dtime - node->__lasttime;
261 double runtime = dtime - BrowserStartTime();
262 if (elapsedTime > node->autoRefresh && runtime < node->autoRefreshTimeLimit) {
263 node->__lasttime = dtime;
264 textureTableIndexStruct_s* tti;
265 tti = getTableTableFromTextureNode(X3D_NODE(node));
266 tti->status = TEX_NOTLOADED;
270 loadTextureNode(X3D_NODE(node),NULL);
271 gglobal()->RenderFuncs.textureStackTop=1;