QB64.org Forum

Active Forums => Programs => Topic started by: Petr on July 06, 2019, 07:40:07 am

Title: Deformed Sphere (3D)
Post by: Petr on July 06, 2019, 07:40:07 am
Hi guys. I muss go out, but have problem. It is most for 3D programmers. Why my attempt for sphere draws something als baseball ball but not sphere? Is used MAPTRINGLE 3D again:
I look back in the evening, or maybe tomorrow, I'm go to celebrate friends daughter's birthday with our kids. If someone reveals the reason for the error, I will be very happy. Thank you.

Program idea is - draw circles in space, from zero radius for first circle in foreground to full radius in middle and then from middle with full radius to zero radius in background.
I know about _gluSphere, but i try solving it with _MAPTRIANGLE.

Code: QB64: [Select]
  1. 'cilem programu je rotujici koule pomoci maptriangle.
  2.     cX AS SINGLE
  3.     cY AS SINGLE
  4.     cZ AS SINGLE
  5.     X AS SINGLE
  6.     Y AS SINGLE
  7.     Z AS SINGLE
  8.     R AS SINGLE
  9.     Pi AS SINGLE
  10.     Pi2 AS SINGLE
  11. REDIM SHARED v(0) AS V
  12.  
  13.  
  14. texture& = Textur&
  15. init_Sphere 0.1, 0.1, -15, 10
  16.  
  17.  
  18. 'test
  19.     RotoXZ
  20.     draw_Sphere texture&
  21.     _DISPLAY
  22.  
  23.  
  24.  
  25. SUB test
  26.     FOR t = LBOUND(v) TO UBOUND(v)
  27.         PRINT v(t).Z; v(t).R; t
  28.         SLEEP
  29.     NEXT
  30.  
  31.  
  32.  
  33.  
  34.  
  35. SUB init_Sphere (cx AS SINGLE, cy AS SINGLE, cz AS SINGLE, radius AS SINGLE)
  36.  
  37.     'one circle circuit is set here as 8 steps (6.28/8)
  38.  
  39.     O = radius / 8 'step on circle circuit
  40.     Hl = radius / 16 'depth step in Z axis
  41.     nz = cz + radius 'nz = new Z = new depth
  42.  
  43.     FOR r1 = 0 TO radius STEP O 'udelej 8 kruznic
  44.         FOR c1 = 0 TO _PI(2) STEP _PI(2) / 8
  45.             nX = cx + (SIN(c1) * r1)
  46.             nY = cy + (COS(c1) * r1)
  47.             tz = cz + COS(c1) * r1
  48.             '            pi = JK(cy, cz, nY, nz, r1)
  49.             '           pi2 = JK(cx, cz, nX, nz, r1)
  50.             v(i).X = nX
  51.             v(i).Y = nY
  52.             v(i).Z = nz
  53.             v(i).cZ = cz
  54.             v(i).cY = cy
  55.             v(i).cX = cx
  56.             '    v(i).Pi = pi
  57.             '    v(i).Pi2 = pi2
  58.  
  59.             radius3D = SQR((cx - nX) ^ 2 + (cy - nY) ^ 2 + (cz - nz) ^ 2)
  60.  
  61.             v(i).R = radius3D
  62.  
  63.             pi = JK(cy, cz, nY, nz, radius3D)
  64.             pi2 = JK(cx, cz, nX, nz, radius3D)
  65.  
  66.             v(i).Pi = pi
  67.             v(i).Pi2 = pi2
  68.  
  69.             i = i + 1
  70.             REDIM _PRESERVE v(i) AS V
  71.  
  72.         NEXT c1
  73.  
  74.         nz = nz - Hl
  75.  
  76.     NEXT r1
  77.  
  78.  
  79.     FOR r1 = radius - O TO 0 STEP -O
  80.         FOR c1 = 0 TO _PI(2) STEP _PI(2) / 8
  81.             nX = cx + (SIN(c1) * r1)
  82.             nY = cy + (COS(c1) * r1)
  83.             tz = cz + COS(c1) * r1
  84.             ' pi = JK(cy, cz, nY, nz, r1)
  85.             'pi2 = JK(cx, cz, nX, nz, r1)
  86.             v(i).X = nX
  87.             v(i).Y = nY
  88.             v(i).Z = nz
  89.             v(i).cZ = cz
  90.             v(i).cY = cy
  91.             v(i).cX = cx
  92.             '            v(i).Pi = pi
  93.             '            v(i).Pi2 = pi2
  94.  
  95.             radius3D = SQR((cx - nX) ^ 2 + (cy - nY) ^ 2 + (cz - nz) ^ 2)
  96.             v(i).R = radius3D
  97.  
  98.             pi = JK(cy, cz, nY, nz, radius3D)
  99.             pi2 = JK(cx, cz, nX, nz, radius3D)
  100.  
  101.             v(i).Pi = pi
  102.             v(i).Pi2 = pi2
  103.             i = i + 1
  104.             REDIM _PRESERVE v(i) AS V
  105.         NEXT c1
  106.         nz = nz - Hl
  107.     NEXT r1
  108.     i = i - 1
  109.     REDIM _PRESERVE v(i) AS V
  110.  
  111.  
  112. SUB draw_Sphere (texture AS LONG)
  113.     'je to po osmi zaznamech na jeden obvod   'every one circle circuit contains 8 steps (so one radius is not circle, but 8-angle)
  114.     W = _WIDTH(texture)
  115.     H = _HEIGHT(texture)
  116.  
  117.     c = 1
  118.     DO UNTIL c >= UBOUND(v) - 8
  119.         FOR i = c TO c + 7
  120.             i2 = 9 + i
  121.             _MAPTRIANGLE (0, 0)-(W, 0)-(0, H), texture TO(v(i - 1).X, v(i - 1).Y, v(i - 1).Z)-(v(i).X, v(i).Y, v(i).Z)-(v(i2 - 1).X, v(i2 - 1).Y, v(i2 - 1).Z)
  122.             _MAPTRIANGLE (W, 0)-(0, H)-(W, H), texture TO(v(i).X, v(i).Y, v(i).Z)-(v(i2 - 1).X, v(i2 - 1).Y, v(i2 - 1).Z)-(v(i2).X, v(i2).Y, v(i2).Z)
  123.         NEXT i
  124.         c = c + 9
  125.     LOOP
  126.  
  127.  
  128.  
  129.  
  130. SUB RotoXZ
  131.     SHARED angle
  132.     angle = angle + .0001
  133.     FOR r = LBOUND(v) TO UBOUND(v)
  134.         cx = v(r).cX
  135.         cz = v(r).cZ
  136.         pi = v(r).Pi2
  137.         radius = v(r).R
  138.         nx = cx + SIN(pi + angle) * radius
  139.         nz = cz + COS(pi + angle) * radius
  140.         v(r).Z = nz
  141.         v(r).X = nx
  142.         REM        PRINT nx, ny, nz
  143.     NEXT r
  144.  
  145.  
  146. SUB RotoYZ
  147.     SHARED angle
  148.     angle = angle + .001
  149.     FOR r = LBOUND(v) TO UBOUND(v)
  150.         cy = v(r).cY
  151.         cz = v(r).cZ
  152.         pi = v(r).Pi
  153.         radius = v(r).R
  154.         nz = cz + SIN(pi + angle) * radius
  155.         ny = cy + COS(pi + angle) * radius
  156.         v(r).Z = nz
  157.         v(r).Y = ny
  158.         REM        PRINT nx, ny, nz
  159.     NEXT r
  160.  
  161.  
  162. FUNCTION JK! (cx, cy, px, py, R!) 'return vector angle
  163.     LenX! = cx - px
  164.     LenY! = cy - py
  165.     jR! = 1 / R!
  166.  
  167.     jX! = LenX! * jR!
  168.     jY! = LenY! * jR!
  169.  
  170.     sinusAlfa! = jX!
  171.     Alfa! = ABS(_ASIN(sinusAlfa!))
  172.  
  173.     Q = 1
  174.     IF px >= cx AND py >= cy THEN Q = 1 ' select angle to quadrant
  175.     IF px >= cx AND py <= cy THEN Q = 2
  176.     IF px <= cx AND py <= cy THEN Q = 3
  177.     IF px <= cx AND py >= cy THEN Q = 4
  178.     SELECT CASE Q
  179.         CASE 1: alfaB! = Alfa!
  180.         CASE 2: alfaB! = _PI / 2 + (_PI / 2 - Alfa!)
  181.         CASE 3: alfaB! = _PI + Alfa!
  182.         CASE 4: alfaB! = _PI(1.5) + (_PI / 2 - Alfa!)
  183.     END SELECT
  184.     JK! = alfaB!
  185.     IF JK! = 0 THEN BEEP
  186.  
  187.  
  188. FUNCTION Textur&
  189.     text = _NEWIMAGE(100, 100, 32)
  190.     a = _DEST
  191.     _DEST text
  192.     FOR f = 5 TO 0 STEP -1
  193.         LINE (f, f)-(100 - f, 100 - f), &HFFFFFFFF, B
  194.     NEXT f
  195.     LINE (5, 5)-(95, 95), &H00000000, BF
  196.     Textur& = _COPYIMAGE(text, 33)
  197.     _DEST a
  198.     _FREEIMAGE text
  199.  
  200.  

Title: Re: Deformed Sphere (3D)
Post by: Pete on July 06, 2019, 11:51:45 am
It looks like you're trying to build a golf net... Can I help?

All that 3-D effect in under 200 lines of code, wow! I hope you get some non-SCREEN 0 guru to tweak the math so you get  that  sphere shape you want out of it. Apparently _maptriangle likes to create geometric shapes in it's own image?

Oh well, sorry I am of no use at all when it comes to graphics, but I did run the program and posted this reply because I'm impressed with the 3-D effects in general. Back in the old QB days, it took more lines to rotate a simple 3-D cube outline on one axis.

EDIT: Well, I can't just sit around on my ASCII and do nothing, so I fiddled with one line. This change does improve the shape, making it have a more spherical appearance, but I have no idea if it is close enough to what you are looking for or if other areas of the code need to be modified to further improve the effect.

So, try: init_Sphere 0, 0, -6, 6

Pete
Title: Re: Deformed Sphere (3D)
Post by: Ashish on July 07, 2019, 09:56:43 am
Hi Petr! You are doing everything fine, but I see that you are not using correct equation for sphere in init_sphere() subroutine.
This is the actual equation for the sphere which I found according to wikipedia -

 [ This attachment cannot be displayed inline in 'Print Page' view ]


I write a little demo using these equation. It is in OpenGL (I'm not good at _maptriangle)
Code: QB64: [Select]
  1. SCREEN _NEWIMAGE(600, 600, 32)
  2. TYPE vec3
  3.     x AS SINGLE
  4.     y AS SINGLE
  5.     z AS SINGLE
  6.     _DELAY 0.05
  7.  
  8. SUB _GL ()
  9.     DIM center AS vec3, vertex AS vec3, radius
  10.     center.x = 0
  11.     center.y = 0
  12.     center.z = 0
  13.     radius = 1
  14.     _glPointSize 5.0
  15.     _glRotatef TIMER * 30, 1, 2, 0
  16.     _glBegin _GL_POINTS
  17.     FOR theta = 0 TO _PI STEP _PI / 50
  18.         FOR phi = 0 TO _PI(2) STEP _PI(2) / 100
  19.             vertex.x = center.x + SIN(theta) * COS(phi) * radius
  20.             vertex.y = center.y + SIN(theta) * SIN(phi) * radius
  21.             vertex.z = center.z + COS(theta) * radius
  22.  
  23.             _glVertex3f vertex.x, vertex.y, vertex.z
  24.         NEXT phi
  25.     NEXT theta
  26.     _glEnd
  27.  
Title: Re: Deformed Sphere (3D)
Post by: bplus on July 07, 2019, 10:04:33 am
Hi Ashish,

WOW OpenGL does it again!

Is there a way to differentiate one hemisphere and pole from the other, like make the dots of closer one larger and/or farther one darker in shade?
Title: Re: Deformed Sphere (3D)
Post by: Ashish on July 07, 2019, 10:16:31 am
Yes, why not?
I used shading method for differentiating hemisphere and poles.
Code: QB64: [Select]
  1. SCREEN _NEWIMAGE(600, 600, 32)
  2. TYPE vec3
  3.     x AS SINGLE
  4.     y AS SINGLE
  5.     z AS SINGLE
  6.     _DELAY 0.05
  7.  
  8. SUB _GL ()
  9.     DIM center AS vec3, vertex AS vec3, radius
  10.     center.x = 0
  11.     center.y = 0
  12.     center.z = 0
  13.     radius = 1
  14.     _glPointSize 5.0
  15.     _glRotatef TIMER * 30, 1, 2, 0
  16.     _glBegin _GL_POINTS
  17.     FOR theta = 0 TO _PI STEP _PI / 50
  18.         FOR phi = 0 TO _PI(2) STEP _PI(2) / 100
  19.             vertex.x = center.x + SIN(theta) * COS(phi) * radius
  20.             vertex.y = center.y + SIN(theta) * SIN(phi) * radius
  21.             vertex.z = center.z + COS(theta) * radius
  22.             c = ABS(COS(theta))
  23.             _glColor3f c, c, c
  24.             _glVertex3f vertex.x, vertex.y, vertex.z
  25.         NEXT phi
  26.     NEXT theta
  27.     _glEnd
  28.  
Title: Re: Deformed Sphere (3D)
Post by: Petr on July 07, 2019, 12:39:11 pm
So. Guys. Thank you very much for your interest and your patince with me.

What I did. Flat disk. Something that can be called a 3D satellite with a little imagination. Shape that can be used on a 3D submarine (cigar shape). Something that can be used as a cannon when properly textured. I have achieved everything possible. With the idea that the regular round circuit will be supplemented by another sum of SIN or COS to achieve an oval (and irregular) shape, I can texture the meteorites. BUT PERFECT BALLS I CAN NOT DO! I attach the source. Play with the variables O, Hl, Nz, PIN in the init_sphere sub, to get a variety of 3D things. This is fun!
Ashish, thank you for the ball equation, when I try to implant it, I achieved some sort of thing that looked like - a funny statement - as gatehouse from Chernobyl,  that flew into space after the Chernobyl explosion. :-D I'm sure it's due my implantation that was bad. I realized that increasing the distance in the Z-axis simply couldn't be linear, because then I would get some shape of a dragonfly or how to call it better. Your OpenGL version is a fantastic example of math and speed. 30 lines and you're done. What? Unreal. Absolutely great work. I can't imagine how I would connect the individual points of the surface for maptriangle in this way.
Pete thank you for your interest and effort to find a problem. I appreciate it.

almost ball source:

Code: QB64: [Select]
  1.  
  2.     cX AS SINGLE
  3.     cY AS SINGLE
  4.     cZ AS SINGLE
  5.     X AS SINGLE
  6.     Y AS SINGLE
  7.     Z AS SINGLE
  8.     R AS SINGLE
  9.     Pi AS SINGLE
  10.     Pi2 AS SINGLE
  11.     pi3 AS SINGLE
  12. REDIM SHARED v(0) AS V
  13.  
  14.  
  15. texture& = Textur&
  16. init_Sphere 0, 0, -6, 2, 24 'this last number muss be the same!
  17.  
  18.     RotoXZ
  19.     draw_Sphere texture&, 24 'this last number muss be the same!
  20.     _DISPLAY
  21.  
  22.  
  23. SUB init_Sphere (cx AS SINGLE, cy AS SINGLE, cz AS SINGLE, radius AS SINGLE, N)
  24.  
  25.     O = radius / 8 'step on circle circuit
  26.     hl = radius / (_PI / .9)
  27.     nz = cz - radius
  28.     PIN = N * 2
  29.  
  30.  
  31.     t = 0
  32.     FOR r1 = 0 TO radius STEP O
  33.         t = t + _PI / PIN
  34.         FOR c1 = 0 TO _PI(2) + .001 STEP _PI(2) / N
  35.             nX = cx + (SIN(c1) * r1)
  36.             nY = cy + (COS(c1) * r1)
  37.  
  38.             v(i).X = nX
  39.             v(i).Y = nY
  40.             v(i).Z = nz
  41.             v(i).cZ = cz
  42.             v(i).cY = cy
  43.             v(i).cX = cx
  44.             radius3d = SQR((cx - nX) ^ 2 + (cz - nz) ^ 2)
  45.  
  46.             v(i).R = radius3d
  47.  
  48.             PI = JK(cy, cz, nY, nz, radius3d)
  49.             pi2 = JK(cx, cz, nX, nz, radius3d)
  50.             v(i).pi3 = JK(cx, cy, nX, nY, radius3d)
  51.             v(i).Pi = PI
  52.             v(i).Pi2 = pi2
  53.  
  54.             i = i + 1
  55.             REDIM _PRESERVE v(i) AS V
  56.  
  57.         NEXT c1
  58.         nz = nz + hl * SIN(t)
  59.     NEXT r1
  60.  
  61.     ' t = 0
  62.     FOR r1 = radius TO 0 STEP -O
  63.         t = t - _PI / PIN
  64.         FOR c1 = -.001 TO _PI(2) STEP _PI(2) / N
  65.             nX = cx + SIN(c1) * r1
  66.             nY = cy + COS(c1) * r1
  67.  
  68.  
  69.             v(i).X = nX
  70.             v(i).Y = nY
  71.             v(i).Z = nz
  72.             v(i).cZ = cz
  73.             v(i).cY = cy
  74.             v(i).cX = cx
  75.             radius3d = SQR((cx - nX) ^ 2 + (cz - nz) ^ 2)
  76.             v(i).R = radius3d
  77.  
  78.             PI = JK(cy, cz, nY, nz, radius3d)
  79.             pi2 = JK(cx, cz, nX, nz, radius3d)
  80.             v(i).pi3 = JK(cx, cy, nX, nY, radius3d)
  81.             v(i).Pi = PI
  82.             v(i).Pi2 = pi2
  83.             i = i + 1
  84.             REDIM _PRESERVE v(i) AS V
  85.         NEXT c1
  86.         nz = nz + hl * SIN(t)
  87.  
  88.     NEXT r1
  89.     i = i - 1
  90.     REDIM _PRESERVE v(i) AS V
  91.  
  92.  
  93. SUB draw_Sphere (texture AS LONG, N)
  94.     W = _WIDTH(texture)
  95.     H = _HEIGHT(texture)
  96.  
  97.     c = 1
  98.     DO UNTIL c >= UBOUND(v) - N
  99.         FOR i = c TO c + (N - 1)
  100.             i2 = (N + 1) + i
  101.             _MAPTRIANGLE (0, 0)-(W, 0)-(0, H), texture TO(v(i - 1).X, v(i - 1).Y, v(i - 1).Z)-(v(i).X, v(i).Y, v(i).Z)-(v(i2 - 1).X, v(i2 - 1).Y, v(i2 - 1).Z)
  102.             _MAPTRIANGLE (W, 0)-(0, H)-(W, H), texture TO(v(i).X, v(i).Y, v(i).Z)-(v(i2 - 1).X, v(i2 - 1).Y, v(i2 - 1).Z)-(v(i2).X, v(i2).Y, v(i2).Z)
  103.         NEXT i
  104.         c = c + (N + 1)
  105.     LOOP
  106.  
  107.  
  108.  
  109. SUB RotoXZ
  110.     SHARED angle
  111.     angle = angle + .0001
  112.     FOR r = LBOUND(v) TO UBOUND(v)
  113.         cx = v(r).cX
  114.         cz = v(r).cZ
  115.         pi = v(r).Pi2
  116.         pi3 = v(r).pi3
  117.         radius = v(r).R
  118.         nx = cx + SIN(pi + angle) * radius
  119.         nz = cz + COS(pi + angle) * radius
  120.         v(r).Z = nz
  121.         v(r).X = nx
  122.         REM        PRINT nx, ny, nz
  123.     NEXT r
  124.  
  125.  
  126. SUB RotoYZ
  127.     SHARED angle
  128.     angle = angle + .0001
  129.     FOR r = LBOUND(v) TO UBOUND(v)
  130.         cy = v(r).cY
  131.         cz = v(r).cZ
  132.         pi = v(r).Pi
  133.         radius = v(r).R
  134.         nz = cz + SIN(pi + angle) * radius
  135.         ny = cy + COS(pi + angle) * radius
  136.         v(r).Z = nz
  137.         v(r).Y = ny
  138.         REM        PRINT nx, ny, nz
  139.     NEXT r
  140.  
  141.  
  142. FUNCTION JK! (cx, cy, px, py, R!) 'return vector angle
  143.     LenX! = cx - px
  144.     LenY! = cy - py
  145.     jR! = 1 / R!
  146.  
  147.     jX! = LenX! * jR!
  148.     jY! = LenY! * jR!
  149.  
  150.     sinusAlfa! = jX!
  151.     Alfa! = ABS(_ASIN(sinusAlfa!))
  152.  
  153.     Q = 1
  154.     IF px >= cx AND py >= cy THEN Q = 1 ' select angle to quadrant
  155.     IF px >= cx AND py <= cy THEN Q = 2
  156.     IF px <= cx AND py <= cy THEN Q = 3
  157.     IF px <= cx AND py >= cy THEN Q = 4
  158.     SELECT CASE Q
  159.         CASE 1: alfaB! = Alfa!
  160.         CASE 2: alfaB! = _PI / 2 + (_PI / 2 - Alfa!)
  161.         CASE 3: alfaB! = _PI + Alfa!
  162.         CASE 4: alfaB! = _PI(1.5) + (_PI / 2 - Alfa!)
  163.     END SELECT
  164.     JK! = alfaB!
  165.     IF JK! = 0 THEN BEEP
  166.  
  167.  
  168. FUNCTION Textur&
  169.     text = _NEWIMAGE(100, 100, 32)
  170.     a = _DEST
  171.     _DEST text
  172.     FOR f = 5 TO 0 STEP -1
  173.         LINE (f, f)-(100 - f, 100 - f), &HFFFFFFFF, B
  174.     NEXT f
  175.     LINE (5, 5)-(95, 95), &H00000000, BF
  176.     Textur& = _COPYIMAGE(text, 33)
  177.     _DEST a
  178.     _FREEIMAGE text
  179.  

"Sattelite"

Code: QB64: [Select]
  1.  
  2.     cX AS SINGLE
  3.     cY AS SINGLE
  4.     cZ AS SINGLE
  5.     X AS SINGLE
  6.     Y AS SINGLE
  7.     Z AS SINGLE
  8.     R AS SINGLE
  9.     Pi AS SINGLE
  10.     Pi2 AS SINGLE
  11.     pi3 AS SINGLE
  12. REDIM SHARED v(0) AS V
  13.  
  14.  
  15. texture& = Textur&
  16. init_Sphere 0, 0, -6, 2
  17.  
  18.  
  19. 'test
  20.     RotoXZ
  21.     draw_Sphere texture&
  22.     _DISPLAY
  23.  
  24.  
  25.  
  26. SUB test
  27.     FOR t = LBOUND(v) TO UBOUND(v)
  28.         PRINT v(t).Z; v(t).R; t
  29.         SLEEP
  30.     NEXT
  31.  
  32.  
  33.  
  34.  
  35.  
  36. SUB init_Sphere (cx AS SINGLE, cy AS SINGLE, cz AS SINGLE, radius AS SINGLE)
  37.  
  38.     'one circle circuit is set here as 8 steps (6.28/8)
  39.  
  40.     O = radius / 8 'step on circle circuit
  41.     Hl = _PI / 16 '16 'depth step in Z axis
  42.     nz = cz + radius
  43.  
  44.     FOR r1 = 0 TO radius STEP O 'udelej 8 kruznic
  45.         FOR c1 = 0 TO _PI(2) STEP _PI(2) / 8
  46.             nX = cx + (SIN(c1) * r1)
  47.             nY = cy + (COS(c1) * r1)
  48.             v(i).X = nX
  49.             v(i).Y = nY
  50.             v(i).Z = nz
  51.             v(i).cZ = cz
  52.             v(i).cY = cy
  53.             v(i).cX = cx
  54.             radius3D = SQR((cx - nX) ^ 2 + (cz - nz) ^ 2) '+ (cz - nz) ^ 2)
  55.  
  56.             v(i).R = radius3D
  57.  
  58.             pi = JK(cy, cz, nY, nz, radius3D)
  59.             pi2 = JK(cx, cz, nX, nz, radius3D)
  60.             v(i).pi3 = JK(cx, cy, nX, nY, radius3D)
  61.             v(i).Pi = pi
  62.             v(i).Pi2 = pi2
  63.  
  64.             i = i + 1
  65.             REDIM _PRESERVE v(i) AS V
  66.  
  67.         NEXT c1
  68.  
  69.         nz = cz + SIN(Hl) * r1
  70.         Hl = Hl + Hl
  71.  
  72.  
  73.     NEXT r1
  74.  
  75.  
  76.     FOR r1 = radius - O TO 0 STEP -O
  77.         FOR c1 = 0 TO _PI(2) STEP _PI(2) / 8
  78.             nX = cx + (SIN(c1) * r1)
  79.             nY = cy + (COS(c1) * r1)
  80.  
  81.             v(i).X = nX
  82.             v(i).Y = nY
  83.             v(i).Z = nz
  84.             v(i).cZ = cz
  85.             v(i).cY = cy
  86.             v(i).cX = cx
  87.             radius3D = SQR((cx - nX) ^ 2 + (cz - nz) ^ 2) ' + (cz - nz) ^ 2)
  88.             v(i).R = radius3D
  89.  
  90.             pi = JK(cy, cz, nY, nz, radius3D)
  91.             pi2 = JK(cx, cz, nX, nz, radius3D)
  92.             v(i).pi3 = JK(cx, cy, nX, nY, radius3D)
  93.             v(i).Pi = pi
  94.             v(i).Pi2 = pi2
  95.             i = i + 1
  96.             REDIM _PRESERVE v(i) AS V
  97.         NEXT c1
  98.  
  99.         nz = cz + SIN(Hl) * r1
  100.         Hl = Hl + Hl
  101.  
  102.     NEXT r1
  103.     i = i - 1
  104.     REDIM _PRESERVE v(i) AS V
  105.  
  106.  
  107. SUB draw_Sphere (texture AS LONG)
  108.     'je to po osmi zaznamech na jeden obvod   'every one circle circuit contains 8 steps (so one radius is not circle, but 8-angle)
  109.     W = _WIDTH(texture)
  110.     H = _HEIGHT(texture)
  111.  
  112.     c = 1
  113.     DO UNTIL c >= UBOUND(v) - 8
  114.         FOR i = c TO c + 7
  115.             i2 = 9 + i
  116.             _MAPTRIANGLE (0, 0)-(W, 0)-(0, H), texture TO(v(i - 1).X, v(i - 1).Y, v(i - 1).Z)-(v(i).X, v(i).Y, v(i).Z)-(v(i2 - 1).X, v(i2 - 1).Y, v(i2 - 1).Z)
  117.             _MAPTRIANGLE (W, 0)-(0, H)-(W, H), texture TO(v(i).X, v(i).Y, v(i).Z)-(v(i2 - 1).X, v(i2 - 1).Y, v(i2 - 1).Z)-(v(i2).X, v(i2).Y, v(i2).Z)
  118.         NEXT i
  119.         c = c + 9
  120.     LOOP
  121.  
  122.  
  123.  
  124.  
  125. SUB RotoXZ
  126.     SHARED angle
  127.     angle = angle + .0001
  128.     FOR r = LBOUND(v) TO UBOUND(v)
  129.         cx = v(r).cX
  130.         cz = v(r).cZ
  131.         pi = v(r).Pi2
  132.         pi3 = v(r).pi3
  133.         radius = v(r).R
  134.         nx = cx + SIN(pi + angle) * radius
  135.         nz = cz + COS(pi + angle) * radius
  136.         v(r).Z = nz
  137.         v(r).X = nx
  138.         REM        PRINT nx, ny, nz
  139.     NEXT r
  140.  
  141.  
  142. SUB RotoYZ
  143.     SHARED angle
  144.     angle = angle + .0001
  145.     FOR r = LBOUND(v) TO UBOUND(v)
  146.         cy = v(r).cY
  147.         cz = v(r).cZ
  148.         pi = v(r).Pi
  149.         radius = v(r).R
  150.         nz = cz + SIN(pi + angle) * radius
  151.         ny = cy + COS(pi + angle) * radius
  152.         v(r).Z = nz
  153.         v(r).Y = ny
  154.         REM        PRINT nx, ny, nz
  155.     NEXT r
  156.  
  157.  
  158. FUNCTION JK! (cx, cy, px, py, R!) 'return vector angle
  159.     LenX! = cx - px
  160.     LenY! = cy - py
  161.     jR! = 1 / R!
  162.  
  163.     jX! = LenX! * jR!
  164.     jY! = LenY! * jR!
  165.  
  166.     sinusAlfa! = jX!
  167.     Alfa! = ABS(_ASIN(sinusAlfa!))
  168.  
  169.     Q = 1
  170.     IF px >= cx AND py >= cy THEN Q = 1 ' select angle to quadrant
  171.     IF px >= cx AND py <= cy THEN Q = 2
  172.     IF px <= cx AND py <= cy THEN Q = 3
  173.     IF px <= cx AND py >= cy THEN Q = 4
  174.     SELECT CASE Q
  175.         CASE 1: alfaB! = Alfa!
  176.         CASE 2: alfaB! = _PI / 2 + (_PI / 2 - Alfa!)
  177.         CASE 3: alfaB! = _PI + Alfa!
  178.         CASE 4: alfaB! = _PI(1.5) + (_PI / 2 - Alfa!)
  179.     END SELECT
  180.     JK! = alfaB!
  181.     IF JK! = 0 THEN BEEP
  182.  
  183.  
  184. FUNCTION Textur&
  185.     text = _NEWIMAGE(100, 100, 32)
  186.     a = _DEST
  187.     _DEST text
  188.     FOR f = 5 TO 0 STEP -1
  189.         LINE (f, f)-(100 - f, 100 - f), &HFFFFFFFF, B
  190.     NEXT f
  191.     LINE (5, 5)-(95, 95), &H00000000, BF
  192.     Textur& = _COPYIMAGE(text, 33)
  193.     _DEST a
  194.     _FREEIMAGE text
  195.  

"satellite 2"

Code: QB64: [Select]
  1. 'cilem programu je rotujici koule pomoci maptriangle.
  2.     cX AS SINGLE
  3.     cY AS SINGLE
  4.     cZ AS SINGLE
  5.     X AS SINGLE
  6.     Y AS SINGLE
  7.     Z AS SINGLE
  8.     R AS SINGLE
  9.     Pi AS SINGLE
  10.     Pi2 AS SINGLE
  11.     pi3 AS SINGLE
  12. REDIM SHARED v(0) AS V
  13.  
  14.  
  15. texture& = Textur&
  16. init_Sphere 0, 0, -6, 2
  17.  
  18.  
  19. 'test
  20.     RotoXZ
  21.     draw_Sphere texture&
  22.     _DISPLAY
  23.  
  24.  
  25.  
  26. SUB test
  27.     FOR t = LBOUND(v) TO UBOUND(v)
  28.         PRINT v(t).Z; v(t).R; t
  29.         SLEEP
  30.     NEXT
  31.  
  32.  
  33.  
  34.  
  35.  
  36. SUB init_Sphere (cx AS SINGLE, cy AS SINGLE, cz AS SINGLE, radius AS SINGLE)
  37.  
  38.     'one circle circuit is set here as 8 steps (6.28/8)
  39.  
  40.     O = radius / 16 'step on circle circuit
  41.     Hl = _PI / 32 '16 'depth step in Z axis
  42.     nz = cz + radius
  43.  
  44.     FOR r1 = 0 TO radius STEP O 'udelej 8 kruznic
  45.         FOR c1 = 0 TO _PI(2) STEP _PI(2) / 8
  46.             nX = cx + (SIN(c1) * r1)
  47.             nY = cy + (COS(c1) * r1)
  48.             v(i).X = nX
  49.             v(i).Y = nY
  50.             v(i).Z = nz
  51.             v(i).cZ = cz
  52.             v(i).cY = cy
  53.             v(i).cX = cx
  54.             radius3D = SQR((cx - nX) ^ 2 + (cz - nz) ^ 2) '+ (cz - nz) ^ 2)
  55.  
  56.             v(i).R = radius3D
  57.  
  58.             pi = JK(cy, cz, nY, nz, radius3D)
  59.             pi2 = JK(cx, cz, nX, nz, radius3D)
  60.             v(i).pi3 = JK(cx, cy, nX, nY, radius3D)
  61.             v(i).Pi = pi
  62.             v(i).Pi2 = pi2
  63.  
  64.             i = i + 1
  65.             REDIM _PRESERVE v(i) AS V
  66.  
  67.         NEXT c1
  68.  
  69.         nz = cz + SIN(Hl) * r1
  70.         Hl = Hl + Hl
  71.  
  72.  
  73.     NEXT r1
  74.  
  75.  
  76.     FOR r1 = radius - O TO 0 STEP -O
  77.         FOR c1 = 0 TO _PI(2) STEP _PI(2) / 8
  78.             nX = cx + (SIN(c1) * r1)
  79.             nY = cy + (COS(c1) * r1)
  80.  
  81.             v(i).X = nX
  82.             v(i).Y = nY
  83.             v(i).Z = nz
  84.             v(i).cZ = cz
  85.             v(i).cY = cy
  86.             v(i).cX = cx
  87.             radius3D = SQR((cx - nX) ^ 2 + (cz - nz) ^ 2) ' + (cz - nz) ^ 2)
  88.             v(i).R = radius3D
  89.  
  90.             pi = JK(cy, cz, nY, nz, radius3D)
  91.             pi2 = JK(cx, cz, nX, nz, radius3D)
  92.             v(i).pi3 = JK(cx, cy, nX, nY, radius3D)
  93.             v(i).Pi = pi
  94.             v(i).Pi2 = pi2
  95.             i = i + 1
  96.             REDIM _PRESERVE v(i) AS V
  97.         NEXT c1
  98.  
  99.         nz = cz + SIN(Hl) * r1
  100.         Hl = Hl + Hl
  101.  
  102.     NEXT r1
  103.     i = i - 1
  104.     REDIM _PRESERVE v(i) AS V
  105.  
  106.  
  107. SUB draw_Sphere (texture AS LONG)
  108.     'je to po osmi zaznamech na jeden obvod   'every one circle circuit contains 8 steps (so one radius is not circle, but 8-angle)
  109.     W = _WIDTH(texture)
  110.     H = _HEIGHT(texture)
  111.  
  112.     c = 1
  113.     DO UNTIL c >= UBOUND(v) - 8
  114.         FOR i = c TO c + 7
  115.             i2 = 9 + i
  116.             _MAPTRIANGLE (0, 0)-(W, 0)-(0, H), texture TO(v(i - 1).X, v(i - 1).Y, v(i - 1).Z)-(v(i).X, v(i).Y, v(i).Z)-(v(i2 - 1).X, v(i2 - 1).Y, v(i2 - 1).Z)
  117.             _MAPTRIANGLE (W, 0)-(0, H)-(W, H), texture TO(v(i).X, v(i).Y, v(i).Z)-(v(i2 - 1).X, v(i2 - 1).Y, v(i2 - 1).Z)-(v(i2).X, v(i2).Y, v(i2).Z)
  118.         NEXT i
  119.         c = c + 9
  120.     LOOP
  121.  
  122.  
  123.  
  124.  
  125. SUB RotoXZ
  126.     SHARED angle
  127.     angle = angle + .0001
  128.     FOR r = LBOUND(v) TO UBOUND(v)
  129.         cx = v(r).cX
  130.         cz = v(r).cZ
  131.         pi = v(r).Pi2
  132.         pi3 = v(r).pi3
  133.         radius = v(r).R
  134.         nx = cx + SIN(pi + angle) * radius
  135.         nz = cz + COS(pi + angle) * radius
  136.         v(r).Z = nz
  137.         v(r).X = nx
  138.         REM        PRINT nx, ny, nz
  139.     NEXT r
  140.  
  141.  
  142. SUB RotoYZ
  143.     SHARED angle
  144.     angle = angle + .0001
  145.     FOR r = LBOUND(v) TO UBOUND(v)
  146.         cy = v(r).cY
  147.         cz = v(r).cZ
  148.         pi = v(r).Pi
  149.         radius = v(r).R
  150.         nz = cz + SIN(pi + angle) * radius
  151.         ny = cy + COS(pi + angle) * radius
  152.         v(r).Z = nz
  153.         v(r).Y = ny
  154.         REM        PRINT nx, ny, nz
  155.     NEXT r
  156.  
  157.  
  158. FUNCTION JK! (cx, cy, px, py, R!) 'return vector angle
  159.     LenX! = cx - px
  160.     LenY! = cy - py
  161.     jR! = 1 / R!
  162.  
  163.     jX! = LenX! * jR!
  164.     jY! = LenY! * jR!
  165.  
  166.     sinusAlfa! = jX!
  167.     Alfa! = ABS(_ASIN(sinusAlfa!))
  168.  
  169.     Q = 1
  170.     IF px >= cx AND py >= cy THEN Q = 1 ' select angle to quadrant
  171.     IF px >= cx AND py <= cy THEN Q = 2
  172.     IF px <= cx AND py <= cy THEN Q = 3
  173.     IF px <= cx AND py >= cy THEN Q = 4
  174.     SELECT CASE Q
  175.         CASE 1: alfaB! = Alfa!
  176.         CASE 2: alfaB! = _PI / 2 + (_PI / 2 - Alfa!)
  177.         CASE 3: alfaB! = _PI + Alfa!
  178.         CASE 4: alfaB! = _PI(1.5) + (_PI / 2 - Alfa!)
  179.     END SELECT
  180.     JK! = alfaB!
  181.     IF JK! = 0 THEN BEEP
  182.  
  183.  
  184. FUNCTION Textur&
  185.     text = _NEWIMAGE(100, 100, 32)
  186.     a = _DEST
  187.     _DEST text
  188.     FOR f = 5 TO 0 STEP -1
  189.         LINE (f, f)-(100 - f, 100 - f), &HFFFFFFFF, B
  190.     NEXT f
  191.     LINE (5, 5)-(95, 95), &H00000000, BF
  192.     Textur& = _COPYIMAGE(text, 33)
  193.     _DEST a
  194.     _FREEIMAGE text
  195.  

and more and more....


I would like to add one thing. I just wanted to try. I thought it might be like this, I wasn't looking for formulas, nothing. I just sat down and started writing the program. I'm excited about a lot of new things I've discovered.
Title: Re: Deformed Sphere (3D)
Post by: Pete on July 07, 2019, 01:20:00 pm
I'm the candidate who will bring hemispheres and poles together!

@Amish: OpenGL seems well suited for this. I wonder if _maptriangle could make a sphere without noticeable linear components?

I wasn't sure what Petr meant by "baseball" in his original post, So I thought he was just looking for a way to make one hemisphere match the other, but if he wants the image perfectly rounded, you nailed it, just not with _maptriangle!

@Petr: I half finished my post, did some stuff in the yard, and saw you came up with a _maptriangle solution. I tried it, and yes, it evens things out between the two hemispheres better than just adjusting init_Sphere.

Pete
Title: Re: Deformed Sphere (3D)
Post by: Petr on July 07, 2019, 01:44:04 pm
Hi Pete. Certainly it can be done. I just chose the wrong way to do it. Those lines around the perimeter - that's the intention. It is actually the texture of a white rectangle with transparency set inside to see where the texture is mapped. To texturize the surface, simply take photos, split them into the same number of parts, and place them on a specific surface location. This achieves the effect of the textured body. For example, for a cylinder rotating in X / Z axes. If the cylinder is made up of ten segments, you divide the texture into 10 bars - the texture width / 10 and place it on the surface of the cylinder. Each segment is one tenth of the circumference., so one tenth from texture width.
Title: Re: Deformed Sphere (3D)
Post by: Pete on July 07, 2019, 01:58:28 pm
Oh, it's a math thing...

I tried math once, but it didn't add up!

Code: QB64: [Select]
  1. DEFINT A-Z
  2. var1 = 3
  3. up! = 2
  4.  
  5. main sum, var1, up
  6. PRINT sum
  7.  
  8. SUB main (sum, var1, up)
  9.     sum = var1 + up
  10.  

Pete :D
Title: Re: Deformed Sphere (3D)
Post by: Petr on July 07, 2019, 03:35:24 pm
yes, Pete... :-D use DEFSNG.
Title: Re: Deformed Sphere (3D)
Post by: bplus on July 07, 2019, 11:41:16 pm
Hi Petr,

Those are cool looking satellites.
Title: Re: Deformed Sphere (3D)
Post by: Pete on July 08, 2019, 12:02:20 am
Saddle lights? Oh right. What cowboys use for night riding.

Pete :D
Title: Re: Deformed Sphere (3D)
Post by: Ashish on July 08, 2019, 12:52:40 am
Oh, it's a math thing...

I tried math once, but it didn't add up!

Code: QB64: [Select]
  1. DEFINT A-Z
  2. var1 = 3
  3. up! = 2
  4.  
  5. main sum, var1, up
  6. PRINT sum
  7.  
  8. SUB main (sum, var1, up)
  9.     sum = var1 + up
  10.  

Pete :D
You are forgetting "!" on line 5.
This add up the thing.
Code: QB64: [Select]
  1. DEFINT A-Z
  2. var1 = 3
  3. up! = 2
  4.  
  5. main sum, var1, up!
  6. PRINT sum
  7.  
  8. SUB main (sum, var1, up)
  9.     sum = var1 + up
  10.  
Title: Re: Deformed Sphere (3D)
Post by: Ashish on July 08, 2019, 01:37:23 am
@Petr
Why not use OpenGL for this?
Title: Re: Deformed Sphere (3D)
Post by: Petr on July 08, 2019, 08:12:23 am
Hi Ashish. Why? 90 percent of my program use hardware images. Is problem with _DISPLAYORDER  _HARDWARE, _GLRENDER. Hardware layer is not visible if i use quadrics and external H file for call it. I just tried it. With _GLRENDER _BEHIND is visible hardware layer, but not OpenGL layer.... better way is maptriangle if is most used in existing program.
Title: Re: Deformed Sphere (3D)
Post by: Ashish on July 08, 2019, 09:45:53 am
@Petr
Well... You can render OpenGL context directly on software screen.
Title: Re: Deformed Sphere (3D)
Post by: Petr on July 08, 2019, 09:54:23 am
Really? So i try it again. My goal is therefore a screen with visible hardware elements and visible GLRender elements.
Title: Re: Deformed Sphere (3D)
Post by: Ashish on July 08, 2019, 10:04:37 am
Yes. With _mem, you can copy OpenGL pixel data to main screen.
I already created a SUB RenderGLToSoftwareScreen which take the handle of destination image as argument.
In the below code, if you press the key, the gl context is retained on screen.

Code: QB64: [Select]
  1. 'OpenGL context capture example
  2. 'by Ashish Kushwaha
  3.  
  4. _TITLE "Rendering OpenGL Context on Software"
  5. SCREEN _NEWIMAGE(600, 600, 32)
  6.  
  7. DIM SHARED glAllow AS _BYTE
  8. DIM SHARED GL_Color_Buffer~%%(_WIDTH * _HEIGHT * 4 - 1)
  9. DIM SHARED keyHit AS LONG, BufferDone
  10.  
  11. BufferDone = 1
  12. ' CLS , _RGB(255,0,0)
  13. ' _DISPLAYORDER _SOFTWARE 'this is hide opengl screen
  14. glAllow = -1
  15.         _DISPLAY
  16.     _LIMIT 48
  17. LOOP UNTIL INKEY$<>""
  18.  
  19.  
  20. SUB _GL ()
  21.     STATIC fps AS LONG, tt#
  22.  
  23.     IF NOT glAllow THEN EXIT SUB
  24.        
  25.  
  26.  
  27.     _glClearColor 0, 0, 0, 1
  28.     _glClear _GL_COLOR_BUFFER_BIT
  29.  
  30.     _glMatrixMode _GL_MODELVIEW
  31.  
  32.     _glRotatef fps, 0, 0, 1
  33.  
  34.     _glBegin _GL_TRIANGLES
  35.  
  36.     _glColor3f 1, 0, 0
  37.     _glVertex2f 0, 1
  38.     _glColor3f 0, 1, 0
  39.     _glVertex2f -1, -1
  40.     _glColor3f 0, 0, 1
  41.     _glVertex2f 1, -1
  42.     _glEnd
  43.        
  44.          RenderGLToSoftwareScreen 0 : tt# = timer
  45.  
  46.     _glFlush
  47.  
  48.     fps = fps + 1
  49.  
  50. SUB RenderGLToSoftwareScreen (dest&)
  51.  
  52.     ' $CHECKING:OFF
  53.  
  54.     'storing GL Color Buffer in our  GL_Color_Buffer() array
  55.     _glReadBuffer _GL_BACK
  56.     _glPixelStorei _GL_UNPACK_ALIGNMENT, 1
  57.     _glReadPixels 0, 0, _WIDTH, _HEIGHT, _GL_BGRA_EXT, _GL_UNSIGNED_BYTE, _OFFSET(GL_Color_Buffer~%%())
  58.     DIM m AS _MEM, m2 as _MEM
  59.         tmp& = _NEWIMAGE(_width(dest&), _HEIGHT(dest&), 32)
  60.     m2 = _MEMIMAGE(tmp&) 'store it in memory
  61.         m = _MEM(GL_Color_Buffer~%%())
  62.         _MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET
  63.        
  64.     _MEMFREE m
  65.         ' _CLEARCOLOR _RGBA(0,0,0,255), tmp&
  66.         _PUTIMAGE (0, _HEIGHT(dest&)-1)-(_width(dest&)-1, 0), tmp&, dest&
  67.         _MEMFREE m2
  68.         _FREEIMAGE tmp&
  69.  
  70.  
Title: Re: Deformed Sphere (3D)
Post by: SMcNeill on July 08, 2019, 10:25:49 am
Yes. With _mem, you can copy OpenGL pixel data to main screen.
I already created a SUB RenderGLToSoftwareScreen which take the handle of destination image as argument.
In the below code, if you press the key, the gl context is retained on screen.

This content should probably be added as an option to _COPYIMAGE so that someone can easily copy a hardware image to a software screen.  Maybe someone with a little more free time than me, could look into the addition for us.   ;D
Title: Re: Deformed Sphere (3D)
Post by: Ashish on July 08, 2019, 10:29:08 am
This content should probably be added as an option to _COPYIMAGE so that someone can easily copy a hardware image to a software screen.  Maybe someone with a little more free time than me, could look into the addition for us.   ;D
That will be very cool and very useful, Steve.
Title: Re: Deformed Sphere (3D)
Post by: Petr on July 08, 2019, 10:45:42 am
Yes, but.... what objects depth? Is not accepted for Hardware images. Or is something wrong here? I add _DISPLAYORDER, so now is visible OpenGL content and Hardware layer. But objects depth is not accepted for hardware images (is always visible, even though the triangle that is in front of the hardware image should cover it.



Code: QB64: [Select]
  1. 'OpenGL context capture example
  2. 'by Ashish Kushwaha
  3.  
  4.  
  5. W = _WIDTH(img)
  6. H = _HEIGHT(img)
  7.  
  8.  
  9.  
  10.  
  11. _TITLE "Rendering OpenGL Context on Software"
  12. SCREEN _NEWIMAGE(800, 600, 32)
  13. PRINT "Software screen text"
  14. DIM SHARED glAllow AS _BYTE
  15. DIM SHARED GL_Color_Buffer~%%(_WIDTH * _HEIGHT * 4 - 1)
  16. DIM SHARED keyHit AS LONG, BufferDone
  17.  
  18. BufferDone = 1
  19. ' CLS , _RGB(255,0,0)
  20. _DISPLAYORDER _GLRENDER , _HARDWARE ', _SOFTWARE 'this is hide opengl screen
  21. glAllow = -1
  22.     'try insert hardware image
  23.     _MAPTRIANGLE (0, 0)-(W, 0)-(0, H), img TO(-3, 1, -5)-(-2, 1, -5)-(-3, -1, -5)
  24.     _MAPTRIANGLE (W, 0)-(0, H)-(W, H), img TO(-2, 1, -5)-(-3, -1, -5)-(-2, -1, -5)
  25.  
  26.     'is always visible, but the triangle is in smaller depth.
  27.     _DISPLAY
  28.     _LIMIT 48
  29.  
  30.  
  31. SUB _GL ()
  32.     STATIC fps AS LONG, tt#
  33.  
  34.     IF NOT glAllow THEN EXIT SUB
  35.  
  36.  
  37.  
  38.     _glClearColor 0, 0, 0, 1
  39.     _glClear _GL_COLOR_BUFFER_BIT
  40.  
  41.     _glMatrixMode _GL_MODELVIEW
  42.  
  43.     _glRotatef fps, 0, 0, 1
  44.  
  45.     _glBegin _GL_TRIANGLES
  46.  
  47.     _glColor3f 1, 0, 0
  48.     _glVertex3f 0, 1, -1
  49.     _glColor3f 0, 1, 0
  50.     _glVertex3f -1, -1, -1
  51.     _glColor3f 0, 0, 1
  52.     _glVertex3f 1, -1, -1
  53.     _glEnd
  54.  
  55.     RenderGLToSoftwareScreen 0: tt# = TIMER
  56.  
  57.     _glFlush
  58.  
  59.     fps = fps + 1
  60.  
  61. SUB RenderGLToSoftwareScreen (dest&)
  62.  
  63.     ' $CHECKING:OFF
  64.  
  65.     'storing GL Color Buffer in our  GL_Color_Buffer() array
  66.     _glReadBuffer _GL_BACK
  67.     _glPixelStorei _GL_UNPACK_ALIGNMENT, 1
  68.     _glReadPixels 0, 0, _WIDTH, _HEIGHT, _GL_BGRA_EXT, _GL_UNSIGNED_BYTE, _OFFSET(GL_Color_Buffer~%%())
  69.     DIM m AS _MEM, m2 AS _MEM
  70.     tmp& = _NEWIMAGE(_WIDTH(dest&), _HEIGHT(dest&), 32)
  71.     m2 = _MEMIMAGE(tmp&) 'store it in memory
  72.     m = _MEM(GL_Color_Buffer~%%())
  73.     _MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET
  74.  
  75.     _MEMFREE m
  76.     ' _CLEARCOLOR _RGBA(0,0,0,255), tmp&
  77.     _PUTIMAGE (0, _HEIGHT(dest&) - 1)-(_WIDTH(dest&) - 1, 0), tmp&, dest&
  78.     _MEMFREE m2
  79.     _FREEIMAGE tmp&
  80.  
  81.  
  82.  
  83.  

Title: Re: Deformed Sphere (3D)
Post by: Ashish on July 08, 2019, 10:54:00 am
@Petr
What are you trying to say? Your code is working as expected.
Title: Re: Deformed Sphere (3D)
Post by: Petr on July 08, 2019, 11:08:35 am
It is a combination of 3D OpenGL and a combination of 3D hardware. This is not what I expect. If I combine both of these methods, I need the body that is closer to the screen to hide the body behind it. Regardless of the method it is assembled.
How we talked about at the beginning. Why did I make a ball through MAPTRIANGLE as a hardware image. I did it because I can't mix the Hardware method and the OpenGL method. Your program will display the OpenGL layer together with the hardware layer. It is well. To do this, I still need to compare the depth of the bodies and hide what is hidden behind the body closer. This would mean reading the Z-axis depths for the solids on both layers and writing only those to really see into the resulting layer.
You see, it's one complication after another. That's why I didn't choose OpenGL for the ball.
Title: Re: Deformed Sphere (3D)
Post by: Ashish on July 20, 2019, 08:55:00 am
Yes, but.... what objects depth? Is not accepted for Hardware images. Or is something wrong here? I add _DISPLAYORDER, so now is visible OpenGL content and Hardware layer. But objects depth is not accepted for hardware images (is always visible, even though the triangle that is in front of the hardware image should cover it.



Code: QB64: [Select]
  1. 'OpenGL context capture example
  2. 'by Ashish Kushwaha
  3.  
  4.  
  5. W = _WIDTH(img)
  6. H = _HEIGHT(img)
  7.  
  8.  
  9.  
  10.  
  11. _TITLE "Rendering OpenGL Context on Software"
  12. SCREEN _NEWIMAGE(800, 600, 32)
  13. PRINT "Software screen text"
  14. DIM SHARED glAllow AS _BYTE
  15. DIM SHARED GL_Color_Buffer~%%(_WIDTH * _HEIGHT * 4 - 1)
  16. DIM SHARED keyHit AS LONG, BufferDone
  17.  
  18. BufferDone = 1
  19. ' CLS , _RGB(255,0,0)
  20. _DISPLAYORDER _GLRENDER , _HARDWARE ', _SOFTWARE 'this is hide opengl screen
  21. glAllow = -1
  22.     'try insert hardware image
  23.     _MAPTRIANGLE (0, 0)-(W, 0)-(0, H), img TO(-3, 1, -5)-(-2, 1, -5)-(-3, -1, -5)
  24.     _MAPTRIANGLE (W, 0)-(0, H)-(W, H), img TO(-2, 1, -5)-(-3, -1, -5)-(-2, -1, -5)
  25.  
  26.     'is always visible, but the triangle is in smaller depth.
  27.     _DISPLAY
  28.     _LIMIT 48
  29.  
  30.  
  31. SUB _GL ()
  32.     STATIC fps AS LONG, tt#
  33.  
  34.     IF NOT glAllow THEN EXIT SUB
  35.  
  36.  
  37.  
  38.     _glClearColor 0, 0, 0, 1
  39.     _glClear _GL_COLOR_BUFFER_BIT
  40.  
  41.     _glMatrixMode _GL_MODELVIEW
  42.  
  43.     _glRotatef fps, 0, 0, 1
  44.  
  45.     _glBegin _GL_TRIANGLES
  46.  
  47.     _glColor3f 1, 0, 0
  48.     _glVertex3f 0, 1, -1
  49.     _glColor3f 0, 1, 0
  50.     _glVertex3f -1, -1, -1
  51.     _glColor3f 0, 0, 1
  52.     _glVertex3f 1, -1, -1
  53.     _glEnd
  54.  
  55.     RenderGLToSoftwareScreen 0: tt# = TIMER
  56.  
  57.     _glFlush
  58.  
  59.     fps = fps + 1
  60.  
  61. SUB RenderGLToSoftwareScreen (dest&)
  62.  
  63.     ' $CHECKING:OFF
  64.  
  65.     'storing GL Color Buffer in our  GL_Color_Buffer() array
  66.     _glReadBuffer _GL_BACK
  67.     _glPixelStorei _GL_UNPACK_ALIGNMENT, 1
  68.     _glReadPixels 0, 0, _WIDTH, _HEIGHT, _GL_BGRA_EXT, _GL_UNSIGNED_BYTE, _OFFSET(GL_Color_Buffer~%%())
  69.     DIM m AS _MEM, m2 AS _MEM
  70.     tmp& = _NEWIMAGE(_WIDTH(dest&), _HEIGHT(dest&), 32)
  71.     m2 = _MEMIMAGE(tmp&) 'store it in memory
  72.     m = _MEM(GL_Color_Buffer~%%())
  73.     _MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET
  74.  
  75.     _MEMFREE m
  76.     ' _CLEARCOLOR _RGBA(0,0,0,255), tmp&
  77.     _PUTIMAGE (0, _HEIGHT(dest&) - 1)-(_WIDTH(dest&) - 1, 0), tmp&, dest&
  78.     _MEMFREE m2
  79.     _FREEIMAGE tmp&
  80.  
  81.  
  82.  
  83.  
RenderGLToSoftwareScreen only copies the pixel color data of OpenGL context on the software screen. It does not copy the depth data.
Actually, it is my mistake. I gave wrong name to the SUB. It must be CopyGLPixelsToSoftware.