Hello,

This is an OpenGL version of teselation. It is really 10 times faster or 
more althought less flexible for doing modifications.
The CD sample is more "soft" looking because of some kind of dither, I 
wonder if this could be avoided anyhow.

Best
victor bombi


----------------Opengl teselation sample begin
require("iuplua")
require("iupluagl")
require("luagl")
require("luaglu")
require("imlua")

filename = 
[[C:\LUA\im-3.8.2_Win32_dllw4_lib\im-3.8.2_Examples\im\html\examples\flower.jpg]]
heightfac=math.sqrt(3)*0.5 -- ratio from height to side in equilateral 
triangle
iup.key_open()

texture = 0

cnv = iup.glcanvas{buffer="DOUBLE", rastersize = "640x480"}

function cnv:resize_cb(width, height)
  iup.GLMakeCurrent(self)
  gl.Viewport(0, 0, width, height)

  gl.MatrixMode('PROJECTION')   -- Select The Projection Matrix
  gl.LoadIdentity()             -- Reset The Projection Matrix

  if height == 0 then           -- Calculate The Aspect Ratio Of The Window
    height = 1
  end
 gl.Ortho(0, width, height,0, 0.0, 500);
  gl.MatrixMode('MODELVIEW')    -- Select The Model View Matrix
  gl.LoadIdentity()             -- Reset The Model View Matrix
end

function EQtriang(dummy,wi)
 gl.PushMatrix()
 gl.Scale(wi,wi,1)
  gl.Begin('TRIANGLES')          -- Drawing Using Triangles
 gl.TexCoord(0.5, 1) gl.Vertex( 0.5,  math.sqrt(3)*0.5, 0)         -- Top
 gl.TexCoord(0, 0) gl.Vertex(0, 0, 0)         -- Bottom Left
 gl.TexCoord(1, 0) gl.Vertex( 1, 0, 0)         -- Bottom Right
 gl.End()        -- Finished Drawing The Triangle
 gl.PopMatrix()
end
function TeselR(fun,wi,lev)
 local fu = lev > 0 and TeselR or fun
 local w = wi*(2^lev)

 gl.PushMatrix()
 fu(fun,wi,lev-1)
 gl.PopMatrix()

 gl.PushMatrix()
 gl.Translate(1.5*w,heightfac*w,0)
 gl.Rotate(120,0,0,1)
 fu(fun,wi,lev-1)

 gl.PopMatrix()

 gl.PushMatrix()
 --gl.LoadIdentity()             -- Reset The Current Modelview Matrix
 gl.Translate(1.5*w,heightfac*w,0)
 gl.Rotate(-120,0,0,1)
 fu(fun,wi,lev-1)

 gl.Rotate(180,1,0,0)
 fu(fun,wi,lev-1)

 gl.PopMatrix()

end
function cnv:action(x, y)
 --local timebegin = os.clock()
 --print((self.DRAWSIZE):match("(%d*)x(%d*)"))
 local w,h = (self.DRAWSIZE):match("(%d*)x(%d*)")
 local endwide = h*2/math.sqrt(3) + w
 local cellwide = math.max(10,mouseX)
 local iters = math.floor(math.log(endwide/cellwide)/math.log(2))
 --print(w,h,endwide,iters)
 iup.GLMakeCurrent(self)
 gl.Clear('COLOR_BUFFER_BIT,DEPTH_BUFFER_BIT') -- Clear Screen And Depth 
Buffer

 gl.LoadIdentity()             -- Reset The Current Modelview Matrix
 gl.Translate(-0.5*(endwide -w),0,-40)
 gl.BindTexture('TEXTURE_2D', texture[1])
 --TeselR(EQtriang,0)

 TeselR(EQtriang,cellwide,iters)

 iup.GLSwapBuffers(self)
 --print("drawtime",os.clock()-timebegin)
end

mouseX,mouseY=0,0
nostatus=(" "):rep(10)
function cnv:motion_cb(x,y,status)
 if status == nostatus then
  mouseX = x
  mouseY = y
  iup.Update(cnv)
 end
end
function cnv:k_any(c)
  if c == iup.K_q or c == iup.K_ESC then
    return iup.CLOSE
  elseif c == iup.K_F1 then
    if fullscreen then
      fullscreen = false
      dlg.fullscreen = "No"
    else
      fullscreen = true
      dlg.fullscreen = "Yes"
    end
    iup.SetFocus(cnv)
  end
end

function LoadImage(fileName)
  local image = im.FileImageLoadBitmap(fileName)
  if (not image) then
    print ("Unnable to open the file: " .. fileName)
    os.exit()
  end
  local gldata, glformat = image:GetOpenGLData()
  gl.PixelStore(gl.UNPACK_ALIGNMENT, 1)

  glu.Build2DMipmaps(image:Depth(), image:Width(), image:Height(), glformat, 
gl.UNSIGNED_BYTE, gldata)

  -- gldata will be destroyed when the image object is destroyed
  image:Destroy()
end

function cnv:map_cb()
  iup.GLMakeCurrent(self)
  gl.Enable('TEXTURE_2D')            -- Enable Texture Mapping ( NEW )

  texture = gl.GenTextures(1)  -- Create The Texture

  -- Typical Texture Generation Using Data From The Bitmap
  gl.BindTexture('TEXTURE_2D', texture[1])
  gl.TexParameter('TEXTURE_2D','TEXTURE_MIN_FILTER','LINEAR')
  gl.TexParameter('TEXTURE_2D','TEXTURE_MAG_FILTER','LINEAR')

  LoadImage(fileName)
end

if arg[1] ~= nil then
  fileName = arg[1]
else
  fileName = filename --[[C:\LUA\LuaGLsource\luagl\html\examples\luagl.tga]]
end

dlg = iup.dialog{cnv; title="LuaGL Image Texture Loader"}

dlg:show()
cnv.rastersize = nil -- reset minimum limitation

if (not iup.MainLoopLevel or iup.MainLoopLevel()==0) then
  iup.MainLoop()
end

-------------------End sample 


------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today. 
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
Iup-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/iup-users

Reply via email to