Help with Pointers
- Posted by Icy_Viking 5 days ago
- 156 views
Hi all, I am bit confused on how to wrap this pointer. I tried using chatGPT to help, but every time it tried to help, nothing worked. So I'm trying here.
C example being ported to Eu [https://github.com/ColleagueRiley/RGFW/blob/main/examples/gears/gears.c]
//From gl.h WINGDIAPI void APIENTRY glLightiv(GLenum light,GLenum pname,const GLint *params);
--From opengl32 DLL public constant xglLightfv = define_c_proc(gl,"+glLightfv",{C_INT,C_INT,C_POINTER}) public procedure glLightfv(atom light,atom pname,object param) c_proc(xglLightfv,{light,pname,param}) --There's gotta be a better way to wrap this? end procedure --Update, chatGPT recommend this public constant xglLightfv = define_c_proc(gl, "+glLightfv", {C_INT, C_INT, C_POINTER}) public procedure glLightfv(atom light,atom pname,object param) atom p = allocate_data(sizeof(param)) c_proc(xglLightfv,{light,pname,p}) free(p) end procedure
include std/ffi.e include std/machine.e include std/math.e include rgfw.e include opengl.e public constant M_PI = 3.14159265 public constant NOP = 0 public constant EXIT = 1 public constant DRAW = 2 atom win = NULL atom view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0 atom gear1=NULL,gear2=NULL,gear3=NULL atom gangle = 0.0 atom fullscreen = GL_FALSE atom stereo = GL_FALSE atom samples = 0 atom animate = GL_TRUE atom eyesep = 5.0 atom fix_point = 40.0 atom left=NULL,right=NULL,asp=NULL procedure gear(atom inner_radius, atom outer_radius, atom width, atom teeth, atom tooth_depth) atom i, r0, r1, r2, angle, da, u, v, len r0 = inner_radius r1 = outer_radius - tooth_depth / 2.0 r2 = outer_radius + tooth_depth / 2.0 da = 2.0 * M_PI / teeth / 4.0 glShadeModel(GL_FLAT) glNormal3f(0.0, 0.0, 1.0) -- Draw front face glBegin(GL_QUAD_STRIP) for j = 0 to teeth - 1 do angle = j * 2.0 * M_PI / teeth glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5) glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5) glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5) glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5) end for glEnd() -- Draw front sides of teeth glBegin(GL_QUADS) for j = 0 to teeth - 1 do angle = j * 2.0 * M_PI / teeth glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5) glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5) glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5) glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5) end for glEnd() glNormal3f(0.0, 0.0, -1.0) -- Draw back face glBegin(GL_QUAD_STRIP) for j = 0 to teeth - 1 do angle = j * 2.0 * M_PI / teeth glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5) glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5) glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5) glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5) end for glEnd() -- Draw back sides of teeth glBegin(GL_QUADS) for j = 0 to teeth - 1 do angle = j * 2.0 * M_PI / teeth glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5) glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5) glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5) glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5) end for glEnd() -- Draw outward faces of teeth glBegin(GL_QUAD_STRIP) for j = 0 to teeth - 1 do angle = j * 2.0 * M_PI / teeth glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5) glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5) u = r2 * cos(angle + da) - r1 * cos(angle) v = r2 * sin(angle + da) - r1 * sin(angle) len = sqrt(u * u + v * v) u /= len v /= len glNormal3f(v, -u, 0.0) glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5) glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5) end for glEnd() -- Draw inside radius cylinder glBegin(GL_QUAD_STRIP) for j = 0 to teeth - 1 do angle = j * 2.0 * M_PI / teeth glNormal3f(-cos(angle), -sin(angle), 0.0) glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5) glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5) end for glEnd() end procedure procedure draw() glClear(or_all({GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT})) glPushMatrix() glRotatef(view_rotx,1.0,0.0,0.0) glRotatef(view_roty,0.0,1.0,0.0) glRotatef(view_rotz,0.0,0.0,1.0) glPushMatrix() glTranslatef(-30.0,-2.0,0.0) glRotatef(gangle,0.0,0.0,1.0) glCallList(gear1) glPopMatrix() glPushMatrix() glTranslatef(3.1,-2.0,0.0) glRotatef(-2.0 * gangle - 9.0,0.0,0.0,1.0) glCallList(gear2) glPopMatrix() glPushMatrix() glTranslatef(-3.1,4.2,0.0) glRotatef(-2.0 * gangle - 25.0,0.0,0.0,1.0) glCallList(gear3) glPopMatrix() glPopMatrix() end procedure procedure draw_gears() if stereo then glDrawBuffer(GL_BACK_LEFT) glMatrixMode(GL_PROJECTION) glLoadIdentity() glFrustum(left,right,-asp,asp,5.0,60.0) glMatrixMode(GL_MODELVIEW) glPushMatrix() glTranslated(+0.5 * eyesep,0.0,0.0) draw() glPopMatrix() glDrawBuffer(GL_BACK_RIGHT) glMatrixMode(GL_PROJECTION) glLoadIdentity() glFrustum(-right,-left,-asp,asp,5.0,60.0) glMatrixMode(GL_MODELVIEW) glPushMatrix() glTranslated(-0.5 * eyesep,0.0,0.0) draw() glPopMatrix() else draw() end if end procedure procedure draw_frame() atom frames = 0 atom rot0 = -1.0, rate0 = -1.0 atom dt, t = time() if rot0 < 0.0 then rot0 = t dt = t - rot0 rot0 = t end if if animate then gangle += 70.0 * dt if gangle > 3600.0 then gangle -= 3600.0 end if end if draw_gears() RGFW_window_swapBuffers(win) frames += 1 if rate0 < 0.0 then rate0 = t if t - rate0 >= 5.0 then atom secs = t - rate0 atom fps = frames / secs printf(1,"%d frames",{frames}) rate0 = t frames = 0 end if end if end procedure procedure reshape(atom width,atom height) glViewport(0,0,width,height) if stereo then atom w asp = height / width w = fix_point * (1.0 / 5.0) left = -5.0 * ((w - 0.5 * eyesep) / fix_point) right = 5.0 * ((w + 0.5 * eyesep) / fix_point) else atom h = height / width glMatrixMode(GL_PROJECTION) glLoadIdentity() glFrustum(-1.0,1.0,-h,h,5.0,60.0) end if glMatrixMode(GL_MODELVIEW) glLoadIdentity() glTranslatef(0.0,0.0,-40.0) end procedure procedure init() sequence pos = {5.0,5.0,10.0,0.0} sequence red = {0.8,0.1,0.0,1.0} sequence green = {0.0,0.8,0.2,1.0} sequence blue = {0.2,0.2,1.0,1.0} glLightfv(GL_LIGHT0,GL_POSITION,pos[4]) --causes program to crash glEnable(GL_CULL_FACE) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) glEnable(GL_DEPTH_TEST) gear1 = glGenLists(1) glNewList(gear1,GL_COMPILE) glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,{red[1],red[2],red[3],red[4]}) --same as above gear(1.0,4.0,1.0,20,0.7) glEndList() gear2 = glGenLists(1) glNewList(gear2,GL_COMPILE) glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,{green[1],green[2],green[3],green[4]}) --same as above gear(0.5,2.0,2.0,10,0.7) glEndList() gear3 = glGenLists(1) glNewList(gear3,GL_COMPILE) glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,{blue[1],blue[2],blue[3],blue[4]}) --same as above gear(1.3,2.0,0.5,10,0.7) glEndList() glEnable(GL_NORMALIZE) end procedure atom winWidth = 300, winHeight = 300 atom x = 0, y = 0 atom flag = 0 --if fullscreen then -- flag = RGFW_winodwFullscreen --end if win = RGFW_createWindow("gear",{x,y,winWidth,winHeight},RGFW_windowCenter) RGFW_window_makeCurrent(win) init() while not RGFW_window_shouldClose(win) do while RGFW_window_checkEvent(win) do if win = RGFW_quit then exit end if if RGFW_isPressed(win,RGFW_escape) then exit end if if RGFW_isPressed(win,RGFW_left) then view_roty += 5.0 end if end while draw_frame() end while glDeleteLists(gear1,1) glDeleteLists(gear2,1) glDeleteLists(gear3,1) RGFW_window_close(win)