Page 1 of 2

Calling OpenGL directly using external library

Posted: Thu Feb 18, 2010 1:41 pm
by VilleK
One very powerful new feature made possible thanks to external libraries is the ability to make direct OpenGL-calls to draw your own graphics.

Using ZExpressions in OnRender-lists you can mix the standard ZGE-Render components with your custom OpenGL-calls. This gives you the best of two worlds: Use the render-components for an high level approach and code your own OpenGL-effects for more advanced possibilities.

Attached is an example. Main code is this:

Code: Select all

//Draw distorted circles using OpenGL-calls
int circleCount=2;
for(int circle=0; circle<circleCount; circle++) {
  //Set color
  glColor3f(0.5,circle,0);

  //Line-loop
  glBegin(2);
  float radius=3;
  int steps=64;
  for(int i=0; i<steps; i++) {
    float a=i * (PI*2)/steps;
    float x=sin(a) * radius;
    float y=cos(a) * radius;
    x+=noise3( abs(x),abs(y),App.Time*0.45 + (circle*1.131))*2.95;
    y+=noise3( abs(x*0.3),abs(y*0.95),App.Time*0.3 + (circle*1.133441))*1;
    glVertex2f(x,y);
  }
  glEnd();
}
I've only defined the OpenGL-functions that I use in this example, but I plan to make a more complete set of functions so that we can have a OpenGL-component in the Library ready to be pasted into any project for easy access.

Posted: Thu Feb 18, 2010 2:24 pm
by Kjell
:?:

Neat!

But why not add some of these features to ZGE itself? Shouldn't be too hard to add a drop-down with GL_POINTS / GL_LINES / GL_TRIANGLES etc. to Mesh and a accompanying addVertex Component, right?

At least we can finally use the build-in light capacities of OpenGL this way ( and turn off that dreaded ambient light :wink: ) ~

K

Posted: Thu Feb 18, 2010 4:39 pm
by y offs et
ZGE rocks!

Posted: Thu Feb 18, 2010 7:05 pm
by jph_wacheski
SuperCool indeed!

I will have to start looking into the gl stuff,. any nice web link that describe all the niffty functions ?

Here is (yet another) glitchy hyptographic .scr,. . Thanks Ville.

Posted: Thu Feb 18, 2010 7:08 pm
by Kjell
:arrow: OpenGL Reference

Posted: Thu Feb 18, 2010 8:26 pm
by diki
Ha, i was wondering wether placing opengl-calls through external libraries would be possible - absolutely wonderful that it is!

Posted: Thu Mar 11, 2010 7:27 pm
by diki
it there a way to get a hold of the int-values for flags like GL_DEPTH_BUFFER_BIT - to use them as arguments from inside zge?

Posted: Thu Mar 11, 2010 7:47 pm
by VilleK
You can google for that constant, or find a opengl-headers file on the net.

Like this one:

http://www.koders.com/delphi/fidE163653 ... s=pos#L387

GL_DEPTH_BUFFER_BIT = $00000100;

So use 0x100 in zge.

Posted: Thu Mar 11, 2010 10:51 pm
by diki
alright! thanks!

btw, does ZGE locate the opengl32.dll in the system folder or is it integrated into ZGE - because it works without the .dll being present in the project folder ... ?

Posted: Fri Mar 12, 2010 7:05 am
by VilleK
ZGE asks the operating system for the DLL without a path so Windows will first look in the path of the executable and then in other directories including System32 where Opengl32.dll normally is located.

See the remarks-section here for details:

http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Posted: Thu Mar 18, 2010 3:37 pm
by Kjell
8)

For people without a photographic memory.

Code: Select all

ZZDC<?xml version="1.0" encoding="iso-8859-1" ?>
<Group Comment="Constants">
  <Children>  
    <DefineConstant Name="GL_TRUE" Type="1" IntValue="1"/>
    <DefineConstant Name="GL_FALSE" Type="1" IntValue="0"/>

    <DefineConstant Name="GL_NEVER" Type="1" IntValue="512"/>
    <DefineConstant Name="GL_LESS" Type="1" IntValue="513"/>
    <DefineConstant Name="GL_EQUAL" Type="1" IntValue="514"/>
    <DefineConstant Name="GL_LEQUAL" Type="1" IntValue="515"/>
    <DefineConstant Name="GL_GREATER" Type="1" IntValue="516"/>
    <DefineConstant Name="GL_NOTEQUAL" Type="1" IntValue="517"/>
    <DefineConstant Name="GL_GEQUAL" Type="1" IntValue="518"/>
    <DefineConstant Name="GL_ALWAYS" Type="1" IntValue="519"/>

    <DefineConstant Name="GL_CLEAR" Type="1" IntValue="5376"/>
    <DefineConstant Name="GL_AND" Type="1" IntValue="5377"/>
    <DefineConstant Name="GL_AND_REVERSE" Type="1" IntValue="5378"/>
    <DefineConstant Name="GL_COPY" Type="1" IntValue="5379"/>
    <DefineConstant Name="GL_AND_INVERTED" Type="1" IntValue="5380"/>
    <DefineConstant Name="GL_NOOP" Type="1" IntValue="5381"/>
    <DefineConstant Name="GL_XOR" Type="1" IntValue="5382"/>
    <DefineConstant Name="GL_OR" Type="1" IntValue="5383"/>
    <DefineConstant Name="GL_NOR" Type="1" IntValue="5384"/>
    <DefineConstant Name="GL_EQUIV" Type="1" IntValue="5385"/>
    <DefineConstant Name="GL_INVERT" Type="1" IntValue="5386"/>
    <DefineConstant Name="GL_OR_REVERSE" Type="1" IntValue="5387"/>
    <DefineConstant Name="GL_COPY_INVERTED" Type="1" IntValue="5388"/>
    <DefineConstant Name="GL_OR_INVERTED" Type="1" IntValue="5389"/>
    <DefineConstant Name="GL_NAND" Type="1" IntValue="5390"/>
    <DefineConstant Name="GL_SET" Type="1" IntValue="5391"/>

    <DefineConstant Name="GL_NONE" Type="1" IntValue="0"/>
    <DefineConstant Name="GL_FRONT" Type="1" IntValue="1028"/>
    <DefineConstant Name="GL_BACK" Type="1" IntValue="1029"/>

    <DefineConstant Name="GL_POINTS" Type="1" IntValue="0"/>
    <DefineConstant Name="GL_LINES" Type="1" IntValue="1"/>
    <DefineConstant Name="GL_LINE_LOOP" Type="1" IntValue="2"/>
    <DefineConstant Name="GL_LINE_STRIP" Type="1" IntValue="3"/>
    <DefineConstant Name="GL_TRIANGLES" Type="1" IntValue="4"/>
    <DefineConstant Name="GL_TRIANGLE_STRIP" Type="1" IntValue="5"/>
    <DefineConstant Name="GL_TRIANGLE_FAN" Type="1" IntValue="6"/>
    <DefineConstant Name="GL_QUADS" Type="1" IntValue="7"/>
    <DefineConstant Name="GL_QUAD_STRIP" Type="1" IntValue="8"/>
    <DefineConstant Name="GL_POLYGON" Type="1" IntValue="9"/>

    <DefineConstant Name="GL_POINT_SMOOTH" Type="1" IntValue="2832"/>
    <DefineConstant Name="GL_POINT_SIZE" Type="1" IntValue="2833"/>
    <DefineConstant Name="GL_POINT_SIZE_RANGE" Type="1" IntValue="2834"/>
    <DefineConstant Name="GL_POINT_SIZE_GRANULARITY" Type="1" IntValue="2835"/>

    <DefineConstant Name="GL_LINE_SMOOTH" Type="1" IntValue="2848"/>
    <DefineConstant Name="GL_LINE_WIDTH" Type="1" IntValue="2849"/>
    <DefineConstant Name="GL_LINE_WIDTH_RANGE" Type="1" IntValue="2850"/>
    <DefineConstant Name="GL_LINE_WIDTH_GRANULARITY" Type="1" IntValue="2851"/>
    <DefineConstant Name="GL_LINE_STIPPLE" Type="1" IntValue="2852"/>
    <DefineConstant Name="GL_LINE_STIPPLE_PATTERN" Type="1" IntValue="2853"/>
    <DefineConstant Name="GL_LINE_STIPPLE_REPEAT" Type="1" IntValue="2854"/>

    <DefineConstant Name="GL_ZERO" Type="1" IntValue="0"/>
    <DefineConstant Name="GL_ONE" Type="1" IntValue="1"/>
    <DefineConstant Name="GL_SRC_COLOR" Type="1" IntValue="768"/>
    <DefineConstant Name="GL_ONE_MINUS_SRC_COLOR" Type="1" IntValue="769"/>
    <DefineConstant Name="GL_SRC_ALPHA" Type="1" IntValue="770"/>
    <DefineConstant Name="GL_ONE_MINUS_SRC_ALPHA" Type="1" IntValue="771"/>
    <DefineConstant Name="GL_DST_ALPHA" Type="1" IntValue="772"/>
    <DefineConstant Name="GL_ONE_MINUS_DST_ALPHA" Type="1" IntValue="773"/>
    <DefineConstant Name="GL_DST_COLOR" Type="1" IntValue="774"/>
    <DefineConstant Name="GL_ONE_MINUS_DST_COLOR" Type="1" IntValue="775"/>
    <DefineConstant Name="GL_SRC_ALPHA_SATURATE" Type="1" IntValue="776"/>

    <DefineConstant Name="GL_MODELVIEW" Type="1" IntValue="5888"/>
    <DefineConstant Name="GL_PROJECTION" Type="1" IntValue="5889"/>
    <DefineConstant Name="GL_TEXTURE" Type="1" IntValue="5890"/>

    <DefineConstant Name="GL_MODELVIEW_MATRIX" Type="1" IntValue="2982"/>
    <DefineConstant Name="GL_PROJECTION_MATRIX" Type="1" IntValue="2983"/>
    <DefineConstant Name="GL_TEXTURE_MATRIX" Type="1" IntValue="2984"/>

    <DefineConstant Name="GL_FOG" Type="1" IntValue="2912"/>
    <DefineConstant Name="GL_FOG_INDEX" Type="1" IntValue="2913"/>
    <DefineConstant Name="GL_FOG_DENSITY" Type="1" IntValue="2914"/>
    <DefineConstant Name="GL_FOG_START" Type="1" IntValue="2915"/>
    <DefineConstant Name="GL_FOG_END" Type="1" IntValue="2916"/>
    <DefineConstant Name="GL_FOG_MODE" Type="1" IntValue="2917"/>
    <DefineConstant Name="GL_FOG_COLOR" Type="1" IntValue="2918"/>

    <DefineConstant Name="GL_NEAREST" Type="1" IntValue="9728"/>
    <DefineConstant Name="GL_LINEAR" Type="1" IntValue="9729"/>

    <DefineConstant Name="GL_EXP" Type="1" IntValue="2048"/>
    <DefineConstant Name="GL_EXP2" Type="1" IntValue="2049"/>

    <DefineConstant Name="GL_NEAREST_MIPMAP_NEAREST" Type="1" IntValue="9984"/>
    <DefineConstant Name="GL_LINEAR_MIPMAP_NEAREST" Type="1" IntValue="9985"/>
    <DefineConstant Name="GL_NEAREST_MIPMAP_LINEAR" Type="1" IntValue="9986"/>
    <DefineConstant Name="GL_LINEAR_MIPMAP_LINEAR" Type="1" IntValue="9987"/>

    <DefineConstant Name="GL_LIGHTING" Type="1" IntValue="2896"/>

    <DefineConstant Name="GL_LIGHT0" Type="1" IntValue="16384"/>
    <DefineConstant Name="GL_LIGHT1" Type="1" IntValue="16385"/>
    <DefineConstant Name="GL_LIGHT2" Type="1" IntValue="16386"/>
    <DefineConstant Name="GL_LIGHT3" Type="1" IntValue="16387"/>
    <DefineConstant Name="GL_LIGHT4" Type="1" IntValue="16388"/>
    <DefineConstant Name="GL_LIGHT5" Type="1" IntValue="16389"/>
    <DefineConstant Name="GL_LIGHT6" Type="1" IntValue="16390"/>
    <DefineConstant Name="GL_LIGHT7" Type="1" IntValue="16391"/>

    <DefineConstant Name="GL_AMBIENT" Type="1" IntValue="4608"/>
    <DefineConstant Name="GL_DIFFUSE" Type="1" IntValue="4609"/>
    <DefineConstant Name="GL_SPECULAR" Type="1" IntValue="4610"/>
    <DefineConstant Name="GL_POSITION" Type="1" IntValue="4611"/>
    <DefineConstant Name="GL_SPOT_DIRECTION" Type="1" IntValue="4612"/>
    <DefineConstant Name="GL_SPOT_EXPONENT" Type="1" IntValue="4613"/>
    <DefineConstant Name="GL_SPOT_CUTOFF" Type="1" IntValue="4614"/>
    <DefineConstant Name="GL_CONSTANT_ATTENUATION" Type="1" IntValue="4615"/>
    <DefineConstant Name="GL_LINEAR_ATTENUATION" Type="1" IntValue="4616"/>
    <DefineConstant Name="GL_QUADRATIC_ATTENUATION" Type="1" IntValue="4617"/>

    <DefineConstant Name="GL_EMISSION" Type="1" IntValue="5632"/>
    <DefineConstant Name="GL_SHININESS" Type="1" IntValue="5633"/>
    <DefineConstant Name="GL_AMBIENT_AND_DIFFUSE" Type="1" IntValue="5634"/>
    <DefineConstant Name="GL_COLOR_INDEXES" Type="1" IntValue="5635"/>

    <DefineConstant Name="GL_ACCUM" Type="1" IntValue="256"/>
    <DefineConstant Name="GL_LOAD" Type="1" IntValue="257"/>
    <DefineConstant Name="GL_RETURN" Type="1" IntValue="258"/>
    <DefineConstant Name="GL_MULT" Type="1" IntValue="259"/>
    <DefineConstant Name="GL_ADD" Type="1" IntValue="260"/>    
  </Children>
</Group>
In case I've missed any constants you want to use, let me know ..

K

OpenGL Library

Posted: Tue Feb 08, 2011 9:36 am
by StevenM
I imported an OpenGL header library to ZGE. I'm not sure how useful it will be, but I didn't pay much attention to weeding any thing out. I did this because I am learning OpenGL and I was tired of looking up everything. I'm hoping that those of you with more experience can tidy it up a bit and maybe create some project examples.

Edit: repost - fixed some typos in the External Library Functions

Posted: Wed Feb 09, 2011 2:23 pm
by Kjell
Hi Steven,

Keep in mind that functions which require unsupported ( double / pointer / texture / shader etc. ) arguments cannot be called from ZGE .. which eliminates a significant portion of the functions / constants directly or indirectly.

+ Buffers such as Accumulation, Feedback & Stencil only work on certain NVIDIA cards without initialization.

K

Posted: Wed Feb 09, 2011 3:15 pm
by StevenM
Kjell wrote:Hi Steven,

Keep in mind that functions which require unsupported ( double / pointer / texture / shader etc. ) arguments cannot be called from ZGE .. which eliminates a significant portion of the functions / constants.

K
I thought double would work as a float.

Yes, There are probably many constants that are not needed too. I still imported as much as i could -hoping there was some work around. I will weed things out once I'm more familiar with openGL. Right now I'm not familiar enough with openGL to know what will or will not work. The code completion in ZGEviz has been really helpful.

Posted: Thu Feb 10, 2011 7:02 pm
by Kjell
:roll:
I thought double would work as a float.
Well .. you can actually use functions that require arguments of the type double, but it's a pain in the *ss. For example ..

Code: Select all

void glTranslated(GLdouble x, GLdouble y, GLdouble z);              // Original function ..
void glTranslated(int x1, int x2, int y1, int y2, int z1, int z2){} // .. becomes this in ZGE
Then you need to fill the bits individually following the IEEE 754 standard, so for a translation of x = 1/3 you actually need to use ..

Code: Select all

glTranslated(0x55555555,0x3fd55555,0,0,0,0);
Image
I've got a library that generates the arguments from a float ( 32-bit range ) if you really need it .. but I rather see doubles being added as variable type to ZGE natively.

K