35 #ifdef G4OPENGL_VERSION_2
39 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
47 G4OpenGLVboDrawer::G4OpenGLVboDrawer (G4OpenGLViewer* viewer,
55 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
56 G4OpenGLImmediateWtViewer* v =
dynamic_cast<G4OpenGLImmediateWtViewer*
>(viewer);
58 G4OpenGLImmediateQtViewer* v =
dynamic_cast<G4OpenGLImmediateQtViewer*
>(viewer);
66 "precision highp float;\n"
69 "varying vec3 vLightWeighting;\n"
70 "uniform vec4 uPointColor; // Point Color\n"
73 " vec4 matColor = uPointColor;\n"
74 " gl_FragColor = vec4(matColor.rgb, matColor.a);\n"
78 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
80 "attribute vec3 aVertexPosition;\n"
81 "attribute vec3 aVertexNormal;\n"
83 "uniform mat4 uMVMatrix; // [M]odel[V]iew matrix\n"
84 "uniform mat4 uCMatrix; // Client-side manipulated [C]amera matrix\n"
85 "uniform mat4 uPMatrix; // Perspective [P]rojection matrix\n"
86 "uniform mat4 uNMatrix; // [N]ormal transformation\n"
87 "// uNMatrix is the transpose of the inverse of uCMatrix * uMVMatrix\n"
88 "uniform mat4 uTMatrix; // [T]ransformation matrix\n"
89 "uniform float uPointSize; // Point size\n"
91 "varying vec3 vLightWeighting;\n"
94 " // Calculate the position of this vertex\n"
95 " gl_Position = uPMatrix * uCMatrix * uMVMatrix * uTMatrix * vec4(aVertexPosition, 1.0);\n"
98 " vec3 transformedNormal = normalize((uNMatrix * vec4(normalize(aVertexNormal), 0)).xyz);\n"
99 " vec3 lightingDirection = normalize(vec3(1, 1, 1));\n"
100 " float directionalLightWeighting = max(dot(transformedNormal, lightingDirection), 0.0);\n"
101 " vec3 uAmbientLightColor = vec3(0.2, 0.2, 0.2);\n"
102 " vec3 uDirectionalColor = vec3(0.8, 0.8, 0.8);\n"
103 " gl_PointSize = uPointSize;\n"
104 " vLightWeighting = uAmbientLightColor + uDirectionalColor * directionalLightWeighting;\n"
111 "attribute highp vec4 aVertexPosition;\n"
112 "attribute vec3 aVertexNormal;\n"
113 "uniform highp mat4 uCMatrix;\n"
114 "uniform highp mat4 uPMatrix; // Perspective [P]rojection matrix\n"
115 "uniform highp mat4 uMVMatrix; // [M]odel[V]iew matrix\n"
116 "uniform highp mat4 uTMatrix; // [T]ransformation matrix\n"
117 "uniform float uPointSize; // Point size\n"
120 " gl_Position = uPMatrix * uCMatrix * uMVMatrix * uTMatrix * aVertexPosition;\n"
121 " // Phong shading\n"
123 " vec3 lightingDirection = normalize(vec3(1, 1, 1));\n"
127 " gl_PointSize = uPointSize;\n"
136 G4OpenGLVboDrawer::~G4OpenGLVboDrawer (
146 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
148 void G4OpenGLVboDrawer:: vboGlClear(Wt::WFlags< GLenum >
mask) {
149 if (fVboViewer->isInitialized()) {
150 fVboViewer->clear(mask);
155 void G4OpenGLVboDrawer:: vboGlUniformMatrix4(
const Wt::WGLWidget::UniformLocation &location,
const Wt::WMatrix4x4 &
m) {
157 vboGlUseProgram(fVboViewer->getShaderProgram());
158 fVboViewer->uniformMatrix4(location, m);
163 void G4OpenGLVboDrawer:: vboGlUniformMatrix4(
const Wt::WGLWidget::UniformLocation &location,
const double* matrix) {
166 (
double) matrix[0], (
double) matrix[4], (
double) matrix[8], (
double) matrix[12],
167 (
double) matrix[1], (
double) matrix[5], (
double) matrix[9], (
double) matrix[13],
168 (
double) matrix[2], (
double) matrix[6], (
double) matrix[10],(
double) matrix[14],
169 (
double) matrix[3],(
double) matrix[7],(
double) matrix[11],(
double) matrix[15]);
171 fVboViewer->uniformMatrix4(location, mat);
175 void G4OpenGLVboDrawer:: vboGlUniformMatrix4fv(
const Wt::WGLWidget::UniformLocation &location,
const float* matrix) {
178 (
double) matrix[0], (
double) matrix[4], (
double) matrix[8], (
double) matrix[12],
179 (
double) matrix[1], (
double) matrix[5], (
double) matrix[9], (
double) matrix[13],
180 (
double) matrix[2], (
double) matrix[6], (
double) matrix[10],(
double) matrix[14],
181 (
double) matrix[3],(
double) matrix[7],(
double) matrix[11],(
double) matrix[15]);
183 fVboViewer->uniformMatrix4(location, mat);
187 void G4OpenGLVboDrawer:: vboGlUniformMatrix4(
const Wt::WGLWidget::UniformLocation &location,
const Wt::WGLWidget::JavaScriptMatrix4x4 &m) {
188 if (fVboViewer->isInitialized()) {
189 fVboViewer->uniformMatrix4(location, m);
193 Wt::WGLWidget::Buffer G4OpenGLVboDrawer:: vboGlCreateBuffer(){
195 return fVboViewer->createBuffer();
197 return Wt::WGLWidget::Buffer();
200 void G4OpenGLVboDrawer:: vboGlBindBuffer(GLenum
target, Wt::WGLWidget::Buffer
buffer){
202 fVboViewer->bindBuffer(target,buffer);
206 void G4OpenGLVboDrawer:: vboGlDeleteBuffer(Wt::WGLWidget::Buffer buffer){
207 if (fVboViewer == NULL)
return;
208 fVboViewer->deleteBuffer(buffer);
211 void G4OpenGLVboDrawer:: vboGlVertexAttribPointer(Wt::WGLWidget::AttribLocation location,
int size, GLenum type,
bool normalized,
unsigned stride,
unsigned offset){
212 if (fVboViewer->isInitialized()) {
213 fVboViewer->vertexAttribPointer(location, size,type, normalized, stride, offset);
217 Wt::WGLWidget::Program G4OpenGLVboDrawer:: vboGlCreateProgram(){
219 return fVboViewer->createProgram();
221 return Wt::WGLWidget::Program();
224 void G4OpenGLVboDrawer:: vboGlAttachShader(Wt::WGLWidget::Program program, Shader shader){
226 fVboViewer->attachShader(program,shader);
230 void G4OpenGLVboDrawer:: vboGlLinkProgram(Wt::WGLWidget::Program program){
232 fVboViewer->linkProgram(program);
236 void G4OpenGLVboDrawer:: vboGlUseProgram(Wt::WGLWidget::Program program){
238 fVboViewer->useProgram(program);
242 void G4OpenGLVboDrawer:: vboGlEnableVertexAttribArray(Wt::WGLWidget::AttribLocation pointer){
244 fVboViewer->enableVertexAttribArray(pointer);
248 void G4OpenGLVboDrawer:: vboGlDisableVertexAttribArray(Wt::WGLWidget::AttribLocation pointer){
250 fVboViewer->disableVertexAttribArray(pointer);
254 Wt::WGLWidget::UniformLocation G4OpenGLVboDrawer:: vboGlGetUniformLocation(Wt::WGLWidget::Program programm,
const std::string &src){
256 return fVboViewer->getUniformLocation(programm, src);
258 return Wt::WGLWidget::UniformLocation();
261 Wt::WGLWidget::AttribLocation G4OpenGLVboDrawer:: vboGlGetAttribLocation(Wt::WGLWidget::Program shader,
const std::string &src){
263 return fVboViewer->getAttribLocation(shader, src);
265 return Wt::WGLWidget::AttribLocation();
272 void G4OpenGLVboDrawer::vboGlClearColor (
double r,
double g,
double b,
double a) {
274 if (fVboViewer->isInitialized() ) {
275 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
276 fVboViewer->clearColor(r,g,b,a);
282 void G4OpenGLVboDrawer::vboGlClearDepth(
double depth) {
283 if (fVboViewer->isInitialized()) {
284 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
285 fVboViewer->clearDepth(depth);
293 void G4OpenGLVboDrawer::vboGlFlush() {
294 if (fVboViewer->isInitialized()) {
295 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
302 void G4OpenGLVboDrawer:: vboGlViewport(
int x,
int y,
unsigned width,
unsigned height) {
303 if (fVboViewer->isInitialized()) {
304 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
305 fVboViewer->viewport(x,y,width,height);
311 void G4OpenGLVboDrawer:: vboGlEnable(GLenum cap) {
312 if (fVboViewer->isInitialized()) {
313 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
315 fVboViewer->enable(cap);
322 void G4OpenGLVboDrawer:: vboGlDisable(GLenum cap) {
323 if (fVboViewer->isInitialized()) {
324 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
326 fVboViewer->disable(cap);
333 void G4OpenGLVboDrawer:: vboGlBlendFunc (GLenum sfactor, GLenum dfactor) {
334 if (fVboViewer->isInitialized()) {
335 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
336 fVboViewer->blendFunc(sfactor, dfactor);
343 void G4OpenGLVboDrawer:: vboGlDepthFunc (GLenum func) {
344 if (fVboViewer->isInitialized()) {
345 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
346 fVboViewer->depthFunc(func);
352 void G4OpenGLVboDrawer:: vboGlDepthMask(
bool flag) {
353 if (fVboViewer->isInitialized()) {
354 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
355 fVboViewer->depthMask(flag);
361 void G4OpenGLVboDrawer:: vboGlColorMask (
bool red,
bool green,
bool blue,
bool alpha) {
362 if (fVboViewer->isInitialized()) {
363 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
364 fVboViewer->colorMask(red,green,blue,alpha);
370 void G4OpenGLVboDrawer:: vboGlLineWidth(
double width) {
371 if (fVboViewer->isInitialized()) {
372 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
373 fVboViewer->lineWidth(width);
380 void G4OpenGLVboDrawer:: vboGlDrawArrays(GLenum mode,
int first,
unsigned count){
381 if (fVboViewer->isInitialized()) {
382 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
383 fVboViewer->drawArrays(mode,first, count);
389 void G4OpenGLVboDrawer:: vboGlDrawElements(GLenum mode,
unsigned count, GLenum type,
unsigned offset){
390 if (fVboViewer->isInitialized()) {
391 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
392 fVboViewer->drawElements(mode,count,type,offset);
398 void G4OpenGLVboDrawer:: vboGlBufferDatafv(GLenum target,
const std::vector<double>::iterator begin,
const std::vector<double>::iterator end, GLenum usage){
400 if (fVboViewer->isInitialized()) {
401 fVboViewer->bufferDatafv(target,begin,end,usage);
406 void G4OpenGLVboDrawer:: vboGlBufferDataiv(GLenum target,
const std::vector<unsigned short>::iterator begin,
const std::vector<unsigned short>::iterator end, GLenum usage, GLenum type){
408 if (fVboViewer->isInitialized()) {
409 fVboViewer->bufferDataiv(target,begin,end,usage,type);
415 void G4OpenGLVboDrawer:: vboGlMultMatrixd(
const GLdouble *matrix){
417 if (fVboViewer->isInitialized()) {
419 (
double) matrix[0], (
double) matrix[4], (
double) matrix[8], (
double) matrix[12],
420 (
double) matrix[1], (
double) matrix[5], (
double) matrix[9], (
double) matrix[13],
421 (
double) matrix[2], (
double) matrix[6], (
double) matrix[10],(
double) matrix[14],
422 (
double) matrix[3],(
double) matrix[7],(
double) matrix[11],(
double) matrix[15]);
425 fVboViewer->uniformMatrix4(fVboViewer->getShaderTransformMatrix(),mat);
426 if (fMatrixMode == GL_MODELVIEW) {
429 G4cerr <<
"glMultMatrixd could only be used in GL_MODELVIEW mode" <<
G4endl;
435 void G4OpenGLVboDrawer:: vboGlMultMatrixf(
const GLfloat *matrix){
437 if (fVboViewer->isInitialized()) {
439 matrix[0], matrix[4], matrix[8], matrix[12],
440 matrix[1], matrix[5], matrix[9], matrix[13],
441 matrix[2], matrix[6], matrix[10], matrix[14],
442 matrix[3], matrix[7], matrix[11], matrix[15]);
444 if (fMatrixMode == GL_MODELVIEW) {
445 fVboViewer->uniformMatrix4(fVboViewer->getShaderTransformMatrix(),mat);
447 G4cerr <<
"glMultMatrixf could only be used in GL_MODELVIEW mode" <<
G4endl;
453 void G4OpenGLVboDrawer:: vboGlShaderSource(Shader shader, GLsizei ,
const GLchar **src,
const GLint *){
455 std::string
s = *src;
456 fVboViewer->shaderSource(shader, s);
460 void G4OpenGLVboDrawer:: vboGlCompileShader(Shader shader){
462 fVboViewer->compileShader(shader);
466 Shader G4OpenGLVboDrawer:: vboGlCreateShader(GLenum shader){
468 return fVboViewer->createShader(shader);
479 void G4OpenGLVboDrawer:: vboGlMultMatrixf(
const GLfloat *matrix){
481 if (fVboViewer->isInitialized()) {
486 if (fMatrixMode == GL_MODELVIEW) {
487 glUniformMatrix4fv(fVboViewer->getShaderTransformMatrix(),1,0,matrix);
489 G4cerr <<
"glMultMatrixf could only be used in GL_MODELVIEW mode" <<
G4endl;
496 void G4OpenGLVboDrawer:: vboGlMultMatrixd(
const GLdouble *matrix){
498 if (fVboViewer->isInitialized()) {
504 matrix[0],matrix[1],matrix[2],matrix[3],
505 matrix[4],matrix[5],matrix[6],matrix[7],
506 matrix[8],matrix[9],matrix[10],matrix[11],
507 matrix[12],matrix[13],matrix[14],matrix[15]
510 glUniformMatrix4fv(fVboViewer->getShaderTransformMatrix(),1,0,mat);
511 GLenum e = glGetError();
512 printf(
"GL error : %d",e);
529 void G4OpenGLVboDrawer::vboGlOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) {
531 if (fVboViewer->isInitialized()) {
532 printf(
"glOrtho implemented --- %f %f %f %f %f %f \n",left, right, bottom, top, zNear, zFar);
533 float a = 2.0f / (right - left);
534 float b = 2.0f / (top - bottom);
535 float c = -2.0f / (zFar - zNear);
537 float tx = - (right + left)/(right - left);
538 float ty = - (top + bottom)/(top - bottom);
539 float tz = - (zFar + zNear)/(zFar - zNear);
551 if (fMatrixMode == GL_PROJECTION) {
552 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
553 vboGlUniformMatrix4fv(fVboViewer->getShaderProjectionMatrix(), ortho);
555 glUniformMatrix4fv(fVboViewer->getShaderProjectionMatrix(), 1, 0, ortho);
558 G4cerr <<
"glFrustum could only be used in GL_PROJECTION mode" <<
G4endl;
565 void G4OpenGLVboDrawer::vboGlFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) {
567 if (fVboViewer->isInitialized()) {
568 float deltaX = right - left;
569 float deltaY = top - bottom;
570 float deltaZ = zFar - zNear;
572 float a = 2.0f * zNear / deltaX;
573 float b = 2.0f * zNear / deltaY;
574 float c = (right + left) / deltaX;
575 float d = (top + bottom) / deltaY;
576 float e = -(zFar + zNear) / (zFar - zNear);
577 float f = -2.0f * zFar * zNear / deltaZ;
586 if (fMatrixMode == GL_PROJECTION) {
587 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
588 vboGlUniformMatrix4fv(fVboViewer->getShaderProjectionMatrix(), proj);
590 glUniformMatrix4fv(fVboViewer->getShaderProjectionMatrix(), 1, 0, proj);
593 G4cerr <<
"glFrustrum could only be used in GL_PROJECTION mode" <<
G4endl;
600 void G4OpenGLVboDrawer::vboGlMatrixMode(GLenum a) {
602 if (fVboViewer->isInitialized()) {
603 printf(
"G4OpenGLVboDrawer::vboGlMatrixMode CHANGED :%d \n",a);
610 void G4OpenGLVboDrawer::vboGlColor4d(
int red,
int green,
int blue,
int alpha) {
612 if (fVboViewer->isInitialized()) {
615 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
616 double color [] = { red, green, blue, 0.7 };
617 glUniform4fv (fVboViewer->getUniformLocation(fVboViewer->getShaderProgram(),
"uPointColor"),color);
620 glUniform4f (glGetUniformLocation(fVboViewer->getShaderProgram(),
"uPointColor"),red, green, blue, alpha);
626 void G4OpenGLVboDrawer:: vboGlColor4fv(
const GLfloat*
data) {
628 if (fVboViewer->isInitialized()) {
629 double color [] = { (data[0]), (data[1]), (data[2]), 0.7};
631 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
632 glUniform4fv (fVboViewer->getUniformLocation(fVboViewer->getShaderProgram(),
"uPointColor"),color);
634 glUniform4f (glGetUniformLocation(fVboViewer->getShaderProgram(),
"uPointColor"),color[0],color[1],color[2], color[3]);
640 void G4OpenGLVboDrawer:: vboGlPointSize(
float size) {
642 if (fVboViewer->isInitialized()) {
643 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
644 glUniform1f(fVboViewer->getUniformLocation(fVboViewer->getShaderProgram(),
"uPointSize"),size);
646 glUniform1f (glGetUniformLocation(fVboViewer->getShaderProgram(),
"uPointSize"),size);
static constexpr double g
const XML_Char const XML_Char * data
static constexpr double m
static const G4double alpha
G4GLOB_DLL std::ostream G4cerr