BBC BASIC
« BOX2D library for BBCSDL? »

Welcome Guest. Please Login or Register.
Oct 24th, 2017, 11:05am


Cross-platform BBC BASIC (Win32, Linux x86, Android, Mac OS-X, Raspberry Pi)

« Previous Topic | Next Topic »
Pages: 1  Notify Send Topic Print
 thread  Author  Topic: BOX2D library for BBCSDL?  (Read 93 times)
Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 605
xx BOX2D library for BBCSDL?
« Thread started on: Sep 22nd, 2017, 11:43am »

If I were to port the BOX2D library to BBCSDL (which wouldn't be easy, given that the DLL was built in Visual Studio) would anybody use it?

Richard.
User IP Logged

michael
Full Member
ImageImageImage


member is offline

Avatar




PM


Posts: 101
xx Re: BOX2D library for BBCSDL?
« Reply #1 on: Sep 23rd, 2017, 12:41am »

After looking at the videos on BOX2D, I would be very interested in a tool that helps with the laws of physics.

I will have my next improvement to the 3Deditor on Monday night and look forward to adding some physics to certain types of games, like 3D pinball, which I really would like to work on once the editor is ready for small object designs.

User IP Logged

I like reinventing the wheel, but for now I will work on tools for D3D
Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 605
xx Re: BOX2D library for BBCSDL?
« Reply #2 on: Sep 23rd, 2017, 09:27am »

on Sep 23rd, 2017, 12:41am, michael wrote:
look forward to adding some physics to certain types of games, like 3D pinball

I hope you realise that BOX2D is strictly 2D (the clue is in the name)! You could only apply it to a 3D scenario in very limited and specific circumstances, when the 'physics' somehow only applies in 2 dimensions! If by 3D pinball you mean that the only use of the 'third' dimension is in having a frictionless sloping surface, then yes you could possibly simulate that by scaling the gravity term.

Anyway, as I hope was clear, my question was specifically about porting the BOX2D library to BBCSDL. The support (albeit for a fairly old version) in BB4W remains excellent, using BOX2DLIB.BBC, BOX2DGFX.BBC and BOX2DDBG.BBC. Build your pinball simulation in BB4W first and then, if you are still keen to port it to BBCSDL, we can discuss what the possibilities might be.

Richard.
User IP Logged

michael
Full Member
ImageImageImage


member is offline

Avatar




PM


Posts: 101
xx Re: BOX2D library for BBCSDL?
« Reply #3 on: Sep 23rd, 2017, 1:54pm »

Quote:
I hope you realise that BOX2D is strictly 2D


Yes. The renderer, regardless of the coordinate system, doesn't effect the x,y coordinates of the graphics screen.

( I checked that when working the mouse presence for each screen)

The only aspects that I would make 3D would be the spinning ball and the rotating paddles.

If BOX2D physics coordinate system is only applicable to predefined draw controls, then I guess it would be not applicable because I am aware of the shared graphics subject.

(which I am working on a remedy for 3D button controls that would have mouse interactivity. So when the mouse moves over the 3D button, a button of different texture would move slightly ahead of the main button and reverse when the mouse was away from it.)

From what I have determined, adjustment in the 3D world can be 0.01 and -0.01 to the limits of the view (on the horizontal and verticle coordinates.

So it would be a matter of working out the conversion of coordinates for mouse control, as well as location of the 3D image in a 2D location relative conversion.

« Last Edit: Sep 23rd, 2017, 2:13pm by michael » User IP Logged

I like reinventing the wheel, but for now I will work on tools for D3D
Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 605
xx Re: BOX2D library for BBCSDL?
« Reply #4 on: Sep 23rd, 2017, 3:34pm »

on Sep 23rd, 2017, 1:54pm, michael wrote:
The only aspects that I would make 3D would be the spinning ball and the rotating paddles.

Ah, OK. I don't think anybody has yet used BBC BASIC to combine the Box2D physics engine with 3D-rendered graphics and that would be an extremely interesting project. There are no technical hurdles that I am aware of, and the result could be visually exciting.

If you don't attempt it I probably will!

Richard.
User IP Logged

michael
Full Member
ImageImageImage


member is offline

Avatar




PM


Posts: 101
xx Re: BOX2D library for BBCSDL?
« Reply #5 on: Sep 23rd, 2017, 4:11pm »

Quote:
If you don't attempt it I probably will!


I have already tested the button idea. It will work. Ill have an demo ready on Monday.

That would be cool if you did work on an physics engine for 3D. I will try my hand at it regardless.

OH by the way! You may want to talk to DDRM, as he just made a shapes library for 3D (he did it lightning fast in response to my endeavours. He is interested in this also.


« Last Edit: Sep 23rd, 2017, 4:19pm by michael » User IP Logged

I like reinventing the wheel, but for now I will work on tools for D3D
Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 605
xx Re: BOX2D library for BBCSDL?
« Reply #6 on: Sep 23rd, 2017, 6:46pm »

on Sep 23rd, 2017, 4:11pm, michael wrote:
That would be cool if you did work on an physics engine for 3D. I will try my hand at it regardless.

I wasn't suggesting that I would do any work on the 'physics engine' itself - none is necessary really since Box2D already works with floating-point coordinates that are compatible with 3D rendering.

Quote:
You may want to talk to DDRM, as he just made a shapes library for 3D

He's a member of this forum (at least, he was) so if he wants to contribute he can. There is a FNshape() function, written by me, in opengl.bbc (in the examples/graphics folder of BBCSDL) which can create vertex arrays for spheres, cones and cylinders (in fact any shape that can be described by rotating a 2D function around the Z-axis).

Richard.
« Last Edit: Sep 23rd, 2017, 7:03pm by Richard Russell » User IP Logged

DDRM
Global Moderator
ImageImageImageImageImage


member is offline

Avatar




PM


Posts: 17
xx Re: BOX2D library for BBCSDL?
« Reply #7 on: Sep 24th, 2017, 6:33pm »

Hi Richard et al,

I've posted my current version of "Make3DLib" in the libraries section of the files section of the groups.io discussion group.

https://groups.io/g/bb4w/files/Libraries/Make3dLib.bbc

Richard, if you don't think it's finished enough to leave there, feel free to move it to the temp folder (but let us know!). It does one naughty thing - it uses a global variable to facilitate "overloading" of the routines.

You may need to be logged in as a member to get it. It's slightly updated from the version I posted on the BB4W conforum - most significantly with much better texture mapping to some shapes.

It has fairly copious notes at the beginning about what routines are included, and how to use them, and I've got some sort examples which give an idea. It can make spheres, cones,cylinders, truncated cones (and, indirectly prisms) prisms and write them either singly or en masses to an FVF file. You can include coordinates, normals, texture coordinates, and ambient and specular colours, depending on the vertex format code you specify. There are also routines to modify the shapes (shear/stretch/rotate/translate), so you can align them to make more complex shapes.

I'm interested to read about Richard's routine: that may well be better than mine, though my routines do allow you to make PART of a shape. I will add some more primitives (torus and "cove" are on my list - the latter once I work out how to calculate the external centre of curvature!

Best wishes,

D

Here's a program to generate a model somewhat like the Starship Enterprise:

Code:
      INSTALL "Make3dLib.BBC"

      capped%=TRUE   :REM Include ends on the cylinder
      nf%=20       :REM Number of faces
      startface%=1   :REM Include the whole cylinder, or only part of it?
      endface%=10
      REM Coordinates to map a texture to the shape. You might want to use only a small part of a texture
      texminu=0
      texmaxu=1
      texminv=0
      texmaxv=1

      maxnv%=FNGetNumVerts("sphere",nf%,1,nf%,TRUE)
      DIM v(maxnv%,2),vn(maxnv%,2),t(maxnv%,1)  :REM hold vertex, normal, and texture data
      DIM vr(maxnv%,2),vnr(maxnv%,2)         :REM These are only needed for the display routine
      nf%=10

      REM We need to count up all the vertices that will be used in all the sections, so that we can put it at the beginning of the file
      tnv%=4*FNGetNumVerts("trunccone",nf%,1,nf%,TRUE)+1*FNGetNumVerts("sphere",nf%,1,nf%,FALSE)+4*FNGetNumVerts("sphere",nf%,6,nf%,FALSE)+4*FNGetNumVerts("prism",5,1,5,FALSE)
      vform%=&152       :REM Here I'm making a file with vertex, normal, and colour data
      fh%=FNOpenFVF("Enterprise",tnv%,vform%)

      nv%=FNGetNumVerts("trunccone",nf%,1,nf%,TRUE)
      PROCMake3D_TruncCone(1.0,0.5,nf%,v(),vn(),t(),1,nf%,TRUE,texminu,texmaxu,texminv,texmaxv)
      PROCStretch(nv%,v(),-0.5,1,1)
      REM Normals for smooth shapes are initially generated as their endpoints, so that can be scaled etc,
      REM So we need to carry out any transformations on them in parallel
      PROCStretch(nv%,vn(),-0.5,1,1)
      REM Now we need to convert the normals to normalised vectors
      vn()=vn()-v()
      PROCNormalise(nv%,vn())
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FF808080,&FFFFFFFF)

      nv%=FNGetNumVerts("trunccone",nf%,1,nf%,TRUE)
      PROCMake3D_TruncCone(1.0,0.5,nf%,v(),vn(),t(),1,nf%,TRUE,texminu,texmaxu,texminv,texmaxv)
      PROCStretch(nv%,v(),4,1,1)
      PROCStretch(nv%,vn(),4,1,1)
      vn()=vn()-v()                  :REM "Normals" are initially generated as their endpoints, so that can be scaled etc, but now need to be converted to vectors
      PROCNormalise(nv%,vn())
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FF808080,&FFFFFFFF)

      nv%=FNGetNumVerts("trunccone",nf%,1,nf%,TRUE)
      PROCMake3D_TruncCone(0.5,0.4,nf%,v(),vn(),t(),1,nf%,TRUE,texminu,texmaxu,texminv,texmaxv)
      PROCStretch(nv%,v(),4,1,1)
      PROCStretch(nv%,vn(),4,1,1)
      PROCShift(v(),2,2.5,2.5,nv%)
      PROCShift(vn(),2,2.5,2.5,nv%)
      vn()=vn()-v()                  :REM "Normals" are initially generated as their endpoints, so that can be scaled etc, but now need to be converted to vectors
      PROCNormalise(nv%,vn())
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FF808080,&FFFFFFFF)

      nv%=FNGetNumVerts("trunccone",nf%,1,nf%,TRUE)
      PROCMake3D_TruncCone(0.5,0.4,nf%,v(),vn(),t(),1,nf%,TRUE,texminu,texmaxu,texminv,texmaxv)
      PROCStretch(nv%,v(),4,1,1)
      PROCStretch(nv%,vn(),4,1,1)
      PROCShift(v(),2,2.5,-2.5,nv%)
      PROCShift(vn(),2,2.5,-2.5,nv%)
      vn()=vn()-v()                  :REM "Normals" are initially generated as their endpoints, so that can be scaled etc, but now need to be converted to vectors
      PROCNormalise(nv%,vn())
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FF808080,&FFFFFFFF)

      nv%=FNGetNumVerts("sphere",nf%,1,nf%,TRUE)
      PROCMake3D_Sphere(nf%,v(),vn(),t(),1,nf%,texminu,texmaxu,texminv,texmaxv)
      PROCStretch(nv%,v(),3,0.2,3)
      PROCStretch(nv%,vn(),3,0.2,3)
      PROCShift(v(),-2.1,1.5,0,nv%)
      PROCShift(vn(),-2.1,1.5,0,nv%)
      vn()=vn()-v()                  :REM "Normals" are initially generated as their endpoints, so that can be scaled etc, but now need to be converted to vectors
      PROCNormalise(nv%,vn())
      PROCFindNormals(nv%,v(),vn())  :REM Cheat: something is going wrong with normals of sphere by flattening it so much: cheat by using triangles directly - OK when this flat
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FF808080,&FFFFFFFF)

      nf%=4
      nv%=FNGetNumVerts("prism",nf%,1,nf%,FALSE)
      PROCMake3D_Prism(nf%,v(),t(),1,nf%,FALSE,texminu,texmaxu,texminv,texmaxv)
      PROCRotate(v(),PI/4,0,0)
      PROCStretch(nv%,v(),3.5,0.5,0.2)
      PROCRotate(v(),0,0,-PI/2)
      PROCRotate(v(),-PI/4,0,0)
      PROCShift(v(),2.5,0,0,nv%)
      PROCFindNormals(nv%,v(),vn())  :REM With facetted shapes we can simply calculate the normals after all the messing around
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FF808080,&FFFFFFFF)

      nv%=FNGetNumVerts("prism",nf%,1,nf%,FALSE)
      PROCMake3D_Prism(nf%,v(),t(),1,nf%,FALSE,texminu,texmaxu,texminv,texmaxv)
      PROCRotate(v(),PI/4,0,0)
      PROCStretch(nv%,v(),3.5,0.5,0.2)
      PROCRotate(v(),0,0,-PI/2)
      PROCRotate(v(),PI/4,0,0)
      PROCShift(v(),2.5,0,0,nv%)
      PROCFindNormals(nv%,v(),vn())
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FF808080,&FFFFFFFF)

      nv%=FNGetNumVerts("prism",nf%,1,nf%,FALSE)
      PROCMake3D_Prism(nf%,v(),t(),1,nf%,FALSE,texminu,texmaxu,texminv,texmaxv)
      PROCRotate(v(),PI/4,0,0)
      PROCStretch(nv%,v(),1.5,1,0.3)
      PROCShear(nv%,v(),2,0,1)
      PROCRotate(v(),0,0,-PI/2)
      PROCShift(v(),1.8,0,0,nv%)
      PROCFindNormals(nv%,v(),vn())
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FF808080,&FFFFFFFF)

      nv%=FNGetNumVerts("prism",nf%,1,nf%,FALSE)
      PROCMake3D_Prism(nf%,v(),t(),1,nf%,FALSE,texminu,texmaxu,texminv,texmaxv)
      PROCRotate(v(),PI/4,0,0)
      PROCStretch(nv%,v(),0.5,0.1,0.1)
      PROCShift(v(),-1,0,0,nv%)
      PROCFindNormals(nv%,v(),vn())
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FF804040,&FFFFFFFF)

      nf%=10
      nv%=FNGetNumVerts("sphere",nf%,6,nf%,TRUE)
      PROCMake3D_Sphere(nf%,v(),vn(),t(),6,nf%,texminu,texmaxu,texminv,texmaxv)
      PROCStretch(nv%,v(),0.2,0.5,0.5)
      PROCStretch(nv%,vn(),0.2,0.5,0.5)
      PROCShift(v(),-0.8,0,0,nv%)
      PROCShift(vn(),-0.8,0,0,nv%)
      vn()=vn()-v()
      PROCNormalise(nv%,vn())
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FF804040,&FFFFFFFF)

      nv%=FNGetNumVerts("sphere",nf%,1,5,TRUE)
      PROCMake3D_Sphere(nf%,v(),vn(),t(),1,5,texminu,texmaxu,texminv,texmaxv)
      PROCStretch(nv%,v(),0.4,0.4,0.4)
      PROCStretch(nv%,vn(),0.4,0.4,0.4)
      PROCShift(v(),2,2.5,-2.5,nv%)
      PROCShift(vn(),2,2.5,-2.5,nv%)
      vn()=vn()-v()
      PROCNormalise(nv%,vn())
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FFF04040,&FFFFFFFF)

      nv%=FNGetNumVerts("sphere",nf%,1,5,TRUE)
      PROCMake3D_Sphere(nf%,v(),vn(),t(),1,5,texminu,texmaxu,texminv,texmaxv)
      PROCStretch(nv%,v(),0.4,0.4,0.4)
      PROCStretch(nv%,vn(),0.4,0.4,0.4)
      PROCShift(v(),2,2.5,2.5,nv%)
      PROCShift(vn(),2,2.5,2.5,nv%)

      vn()=vn()-v()
      PROCNormalise(nv%,vn())
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FFF04040,&FFFFFFFF)

      nv%=FNGetNumVerts("sphere",nf%,6,nf%,TRUE)
      PROCMake3D_Sphere(nf%,v(),vn(),t(),6,nf%,texminu,texmaxu,texminv,texmaxv)
      PROCRotate(v(),0,0,-PI/2)
      PROCRotate(vn(),0,0,-PI/2)
      PROCStretch(nv%,v(),1,0.3,0.5)
      PROCStretch(nv%,vn(),1,0.3,0.5)
      PROCShear(nv%,v(),-0.3,1,0)
      PROCShift(v(),-1.7,1.7,0,nv%)
      PROCShift(vn(),-1.7,1.7,0,nv%)
      vn()=vn()-v()
      PROCNormalise(nv%,vn())
      PROCExtendFVF(fh%,vform%,nv%,v(),vn(),t(),&FF808080,&FFFFFFFF)

      PROCCloseFVF(fh%)

      PRINT "Success!"
      END
 
User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 605
xx Re: BOX2D library for BBCSDL?
« Reply #8 on: Sep 24th, 2017, 9:21pm »

on Sep 24th, 2017, 6:33pm, DDRM wrote:
It does one naughty thing - it uses a global variable to facilitate "overloading" of the routines.

I don't think that's too awful so long as you use a 'unique' name for the global. Two approaches that effectively guarantee that are to include the name of the library in the name of the global, e.g. myGlobal@myLibrary, or to use a UUID as the name, which by definition is unique. I use the first of these in ogllib.bbc:

Code:
      SYS "SDL_GL_GetCurrentContext", @memhdc% TO origContext@ogllib% 

Something to bear in mind is that the library may fail if the user's program, from which it is called, executes a CLEAR statement. That's not as unlikely as you may think, for example most of the 3D programs supplied with BBCSDL contain code similar to this to cope with resizing the window or rotating an Android device from portrait to landscape orientation or vice-versa:

Code:
      ON MOVE IF @msg% <> 5 RETURN ELSE PROCcleanup : CLEAR 

Richard.
User IP Logged

Pages: 1  Notify Send Topic Print
« Previous Topic | Next Topic »

Donate $6.99 for 50,000 Ad-Free Pageviews!


This forum powered for FREE by Conforums ©
Sign up for your own Free Message Board today!
Terms of Service | Privacy Policy | Conforums Support | Parental Controls