as you requested clyde mate i opend this thread this is a better version than the one i posted in your thread i fixed the camera up and made the random generation for the stars a bit nicer.
'
' Paralax Starfield.
' By Clyde Radcliffe & Special thanks to Blitz Amateur for the Random Function.
' Made in Dec '06
' modifyd slightly for opengl now in 3d
Option Explicit
Option Static
#Include Once "windows.bi"
#Include Once "GL\gl.bi"
#Include Once "GL\glext.bi"
#Include Once "GL\glu.bi"
#Include Once "fbgfx.bi"
#Include Once "crt.bi"
type mat
m0 as double
m1 as double
m2 as double
m3 as double
m4 as double
m5 as double
m6 as double
m7 as double
m8 as double
m9 as double
m10 as double
m11 as double
m12 as double
m13 as double
m14 as double
m15 as double
end type
type entity_pos
x_pos as double
y_pos as double
z_pos as double
end type
type entity_rot
x_rot as double
y_rot as double
z_rot as double
end type
type entity
position as entity_pos ptr
rotation as entity_rot ptr
matrix as mat ptr
end type
declare sub loadentityidentity( object as entity ptr )
declare sub positionentity( object as entity ptr , byval xpos as double , byval ypos as double , byval zpos as double )
declare sub moveentity( object as entity ptr , byval xpos as double , byval ypos as double , byval zpos as double )
declare sub moveentityW( object as entity ptr , byval xpos as double , byval ypos as double , byval zpos as double )
declare sub rotateentity( object as entity ptr , xpos as double , ypos as double , zpos as double )
declare sub copymatrix4x4( destination as entity ptr , byval source as entity ptr )
declare sub mulmatrix4x4( byval matrix1 as entity ptr , byval matrix2 as entity ptr , resultmatrix as entity ptr )
declare sub transposematrix( matrix as entity ptr )
declare sub multranslmatrix4x4( byval m1 as entity ptr , byval m2 as entity ptr , destination as entity ptr )
declare sub renderworld( camera as entity ptr )
declare sub clearworld()
declare sub MoveRotateCam( camera as entity ptr )
declare function new_entity() as entity ptr
declare sub convertMarray( dest as double ptr , byval source as entity ptr )
declare sub delete_entity( object as entity ptr )
Declare Sub FeedPixels( Byval X As double , ByVal Y As double , ByVal Z As double , ByVal Col As Integer )
Declare Sub InitializeParallax()
Declare Sub UpdateStars()
Declare Function Randd( ByVal lower as double , ByVal upper as double ) As double
declare function setVsync( byval inte as integer )
Const MAXSTARS=2000
dim shared as double Psin(0 to 360) , Pcos(0 to 360)
dim shared as double XRES = 800
dim shared as double YRES = 600
dim shared as entity ptr object0 , object1 , camera
Dim shared pglPointParameterfvEXT as PFNGLPOINTPARAMETERFVEXTPROC
Dim Shared StarX( MAXSTARS ) , StarY( MAXSTARS ) , StarZ( MAXSTARS ) , StarC( MAXSTARS ) , StarS( MAXSTARS )
dim x as integer
for x = 1 to 360
Psin( x ) = sin( x * 3.1415 / 180.0 )
Pcos( x ) = cos( x * 3.1415 / 180.0 )
next
object0 = new_entity()
object1 = new_entity()
camera = new_entity()
loadentityidentity( object0 )
loadentityidentity( object1 )
positionentity( camera , 1 , 0 , 0 )
InitializeParallax()
setVsync(1)
Dim Key As String
While Key<>Chr(27)
UpdateStars()
renderworld( camera )
clearworld()
camera->rotation->y_rot -= 1
camera->rotation->z_rot -= 1
Key=Inkey()
Wend
delete_entity( camera )
Sub FeedPixels( Byval x As double , Byval y As double , Byval z As double , Byval col As Integer)
dim as integer r = col shr 16 and 255
dim as integer g = col shr 8 and 255
dim as integer b = col and 255
glColor3ub( r , g , b )
glEnable(GL_BLEND)
glPointSize(12.5)
glBegin(GL_POINTS)
glVertex3f( x / ( XRES / 4 ) , y / ( YRES / 4 ) , Z/12 )
glEnd()
glDisable(GL_BLEND)
End Sub
Sub InitializeParallax()
screen 19 , 32 , , 3
glViewport 0 , 0 , xres , yres
glMatrixMode GL_PROJECTION
glLoadIdentity
gluPerspective( 45 , xres / yres , 1 , 100 )
glMatrixMode GL_MODELVIEW
glLoadIdentity
glShadeModel GL_SMOOTH
glClearColor 0.0, 0.0, 0.0, 1.0
glClearDepth 1.0
glEnable GL_DEPTH_TEST
glDepthFunc GL_LEQUAL
glHint GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST
glEnable(GL_POINT_SMOOTH)
glHint(GL_POINT_SMOOTH, GL_NICEST)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
pglPointParameterfvEXT = cast( PFNGLPOINTPARAMETERFVEXTPROC , wglGetProcAddress("glPointParameterfvEXT") )
dim as single attenuation(3) = { 0.0, 0.5, 0.0 }
pglPointParameterfvEXT( GL_DISTANCE_ATTENUATION_EXT , @attenuation(0) )
Dim Setup
For Setup=0 To MAXSTARS-1
StarX( Setup ) = Randd( -XRES , XRES - 1 )
StarY( Setup ) = Randd( -YRES , YRES - 1 )
StarZ( Setup ) = Randd( -65 , 65 )
StarS( Setup ) = Randd( 1 , 6 )
StarC( Setup ) = Randd(&H646464,&HFFFFFF)
Next
End Sub
function new_entity() as entity ptr
dim tmp_entity as entity ptr
tmp_entity = callocate( len(entity) )
tmp_entity->position = callocate(len(entity_pos))
tmp_entity->rotation = callocate(len(entity_rot))
tmp_entity->matrix = callocate(len(mat))
return(tmp_entity)
end function
sub clearworld()
glClear GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT
end sub
sub delete_entity( object as entity ptr )
deallocate(object->rotation)
deallocate(object->position)
deallocate(object->matrix)
deallocate(object)
end sub
sub renderworld( camera as entity ptr )
dim as double cam(0 to 3,0 to 3)
glloadidentity
loadentityidentity( camera )
moveentity( camera , camera->position->x_pos , camera->position->y_pos , camera->position->z_pos )
rotateentity( camera , 0 , camera->rotation->y_rot , 0 )
rotateentity( camera , camera->rotation->x_rot , 0 , 0 )
rotateentity( camera , 0 , 0 , camera->rotation->z_rot )
transposematrix( camera )
convertMarray( @cam(0,0) , camera )
glloadmatrixd( @cam(0,0) )
flip
end sub
sub convertMarray( dest as double ptr , byval source as entity ptr )
dest[0] = source->matrix->m0
dest[1] = source->matrix->m1
dest[2] = source->matrix->m2
dest[3] = source->matrix->m3
dest[4] = source->matrix->m4
dest[5] = source->matrix->m5
dest[6] = source->matrix->m6
dest[7] = source->matrix->m7
dest[8] = source->matrix->m8
dest[9] = source->matrix->m9
dest[10] = source->matrix->m10
dest[11] = source->matrix->m11
dest[12] = source->matrix->m12
dest[13] = source->matrix->m13
dest[14] = source->matrix->m14
dest[15] = source->matrix->m15
end sub
sub loadentityidentity( object as entity ptr )
object->matrix->m0 = 1
object->matrix->m1 = 0
object->matrix->m2 = 0
object->matrix->m3 = 0
object->matrix->m4 = 0
object->matrix->m5 = 1
object->matrix->m6 = 0
object->matrix->m7 = 0
object->matrix->m8 = 0
object->matrix->m9 = 0
object->matrix->m10 = 1
object->matrix->m11 = 0
object->matrix->m12 = 0
object->matrix->m13 = 0
object->matrix->m14 = 0
object->matrix->m15 = 1
end sub
sub positionentity( object as entity ptr , byval xpos as double , byval ypos as double , byval zpos as double )
object->position->x_pos = xpos
object->position->y_pos = ypos
object->position->z_pos = zpos
end sub
sub moveentity( object as entity ptr , byval xpos as double , byval ypos as double , byval zpos as double )
dim as entity ptr Tmp1 , Tmp2
Tmp1 = new_entity()
Tmp2 = new_entity()
loadentityidentity( Tmp1 )
Tmp1->matrix->m12 = xpos
Tmp1->matrix->m13 = ypos
Tmp1->matrix->m14 = zpos
mulmatrix4x4( Tmp1 , object , Tmp2 )
copymatrix4x4( object , Tmp2 )
delete_entity(Tmp1)
delete_entity(Tmp2)
end sub
sub moveentityW( object as entity ptr , byval xpos as double , byval ypos as double , byval zpos as double )
object->matrix->m12 += xpos
object->matrix->m13 += ypos
object->matrix->m14 += zpos
end sub
sub rotateentity( object as entity ptr , xpos as double , ypos as double , zpos as double )
dim as entity ptr Tmp1 , Tmp2
Tmp1 = new_entity()
Tmp2 = new_entity()
if xpos > 360 then xpos = 0
if xpos < 0 then xpos = 360
if ypos > 360 then ypos = 0
if ypos < 0 then ypos = 360
if zpos > 360 then zpos = 0
if zpos < 0 then zpos = 360
'rotate on xaxis
if xpos then
loadentityidentity( Tmp1 )
Tmp1->matrix->m5 = Pcos( xpos )
Tmp1->matrix->m6 = -Psin( xpos )
Tmp1->matrix->m9 = Psin( xpos )
Tmp1->matrix->m10 = Pcos( xpos )
mulmatrix4x4( Tmp1 , object , Tmp2 )
copymatrix4x4( object , Tmp2 )
endif
'rotate on yaxis
if ypos then
loadentityidentity( Tmp1 )
Tmp1->matrix->m0 = Pcos( ypos )
Tmp1->matrix->m2 = Psin( ypos )
Tmp1->matrix->m8 = -Psin( ypos )
Tmp1->matrix->m10 = Pcos( ypos )
mulmatrix4x4( Tmp1 , object , Tmp2 )
copymatrix4x4( object , Tmp2 )
endif
'rotate on zaxis
if zpos then
loadentityidentity( Tmp1 )
Tmp1->matrix->m0 = Pcos( zpos )
Tmp1->matrix->m1 = -Psin( zpos )
Tmp1->matrix->m4 = Psin( zpos )
Tmp1->matrix->m5 = Pcos( zpos )
mulmatrix4x4( Tmp1 , object , Tmp2 )
copymatrix4x4( object , Tmp2 )
endif
delete_entity(Tmp1)
delete_entity(Tmp2)
end sub
sub copymatrix4x4( destination as entity ptr , byval source as entity ptr )
destination->matrix->m0 = source->matrix->m0
destination->matrix->m1 = source->matrix->m1
destination->matrix->m2 = source->matrix->m2
destination->matrix->m3 = source->matrix->m3
destination->matrix->m4 = source->matrix->m4
destination->matrix->m5 = source->matrix->m5
destination->matrix->m6 = source->matrix->m6
destination->matrix->m7 = source->matrix->m7
destination->matrix->m8 = source->matrix->m8
destination->matrix->m9 = source->matrix->m9
destination->matrix->m10 = source->matrix->m10
destination->matrix->m11 = source->matrix->m11
destination->matrix->m12 = source->matrix->m12
destination->matrix->m13 = source->matrix->m13
destination->matrix->m14 = source->matrix->m14
destination->matrix->m15 = source->matrix->m15
end sub
sub transposematrix( object as entity ptr )
dim as entity ptr Tmp1 , Tmp2
Tmp1 = new_entity()
Tmp2 = new_entity()
copymatrix4x4( Tmp1 , object )
Tmp1->matrix->m0 = object->matrix->m0
Tmp1->matrix->m1 = object->matrix->m4
Tmp1->matrix->m2 = object->matrix->m8
Tmp1->matrix->m4 = object->matrix->m1
Tmp1->matrix->m5 = object->matrix->m5
Tmp1->matrix->m6 = object->matrix->m9
Tmp1->matrix->m8 = object->matrix->m2
Tmp1->matrix->m9 = object->matrix->m6
Tmp1->matrix->m10 = object->matrix->m10
multranslmatrix4x4( object , Tmp1 , Tmp2 )
copymatrix4x4( object , Tmp2 )
delete_entity(Tmp1)
delete_entity(Tmp2)
end sub
sub multranslmatrix4x4( byval m1 as entity ptr , byval m2 as entity ptr , destination as entity ptr )
dim as double Tx , Ty , Tz
Tx = m1->matrix->m0 * m2->matrix->m12 + m1->matrix->m1 * m2->matrix->m13 + m1->matrix->m2 * m2->matrix->m14
Ty = m1->matrix->m4 * m2->matrix->m12 + m1->matrix->m5 * m2->matrix->m13 + m1->matrix->m6 * m2->matrix->m14
Tz = m1->matrix->m8 * m2->matrix->m12 + m1->matrix->m9 * m2->matrix->m13 + m1->matrix->m10 * m2->matrix->m14
copymatrix4x4( destination , m2 )
Tx += m2->matrix->m8
Ty += m2->matrix->m9
Tz += m2->matrix->m10
destination->matrix->m12 = Tx
destination->matrix->m13 = Ty
destination->matrix->m14 = Tz
end sub
sub mulmatrix4x4( byval matrix1 as entity ptr , byval matrix2 as entity ptr , resultmatrix as entity ptr )
resultmatrix->matrix->m0 = matrix1->matrix->m0 * matrix2->matrix->m0 + matrix1->matrix->m1 * matrix2->matrix->m4 + matrix1->matrix->m2 * matrix2->matrix->m8 + matrix1->matrix->m3 * matrix2->matrix->m12
resultmatrix->matrix->m1 = matrix1->matrix->m0 * matrix2->matrix->m1 + matrix1->matrix->m1 * matrix2->matrix->m5 + matrix1->matrix->m2 * matrix2->matrix->m9 + matrix1->matrix->m3 * matrix2->matrix->m13
resultmatrix->matrix->m2 = matrix1->matrix->m0 * matrix2->matrix->m2 + matrix1->matrix->m1 * matrix2->matrix->m6 + matrix1->matrix->m2 * matrix2->matrix->m10 + matrix1->matrix->m3 * matrix2->matrix->m14
resultmatrix->matrix->m3 = matrix1->matrix->m0 * matrix2->matrix->m3 + matrix1->matrix->m1 * matrix2->matrix->m7 + matrix1->matrix->m2 * matrix2->matrix->m11 + matrix1->matrix->m3 * matrix2->matrix->m15
resultmatrix->matrix->m4 = matrix1->matrix->m4 * matrix2->matrix->m0 + matrix1->matrix->m5 * matrix2->matrix->m4 + matrix1->matrix->m6 * matrix2->matrix->m8 + matrix1->matrix->m7 * matrix2->matrix->m12
resultmatrix->matrix->m5 = matrix1->matrix->m4 * matrix2->matrix->m1 + matrix1->matrix->m5 * matrix2->matrix->m5 + matrix1->matrix->m6 * matrix2->matrix->m9 + matrix1->matrix->m7 * matrix2->matrix->m13
resultmatrix->matrix->m6 = matrix1->matrix->m4 * matrix2->matrix->m2 + matrix1->matrix->m5 * matrix2->matrix->m6 + matrix1->matrix->m6 * matrix2->matrix->m10 + matrix1->matrix->m7 * matrix2->matrix->m14
resultmatrix->matrix->m7 = matrix1->matrix->m4 * matrix2->matrix->m3 + matrix1->matrix->m5 * matrix2->matrix->m7 + matrix1->matrix->m6 * matrix2->matrix->m11 + matrix1->matrix->m7 * matrix2->matrix->m15
resultmatrix->matrix->m8 = matrix1->matrix->m8 * matrix2->matrix->m0 + matrix1->matrix->m9 * matrix2->matrix->m4 + matrix1->matrix->m10 * matrix2->matrix->m8 + matrix1->matrix->m11 * matrix2->matrix->m12
resultmatrix->matrix->m9 = matrix1->matrix->m8 * matrix2->matrix->m1 + matrix1->matrix->m9 * matrix2->matrix->m5 + matrix1->matrix->m10 * matrix2->matrix->m9 + matrix1->matrix->m11 * matrix2->matrix->m13
resultmatrix->matrix->m10 = matrix1->matrix->m8 * matrix2->matrix->m2 + matrix1->matrix->m9 * matrix2->matrix->m6 + matrix1->matrix->m10 * matrix2->matrix->m10 + matrix1->matrix->m11 * matrix2->matrix->m14
resultmatrix->matrix->m11 = matrix1->matrix->m8 * matrix2->matrix->m3 + matrix1->matrix->m9 * matrix2->matrix->m7 + matrix1->matrix->m10 * matrix2->matrix->m11 + matrix1->matrix->m11 * matrix2->matrix->m15
resultmatrix->matrix->m12 = matrix1->matrix->m12 * matrix2->matrix->m0 + matrix1->matrix->m13 * matrix2->matrix->m4 + matrix1->matrix->m14 * matrix2->matrix->m8 + matrix1->matrix->m15 * matrix2->matrix->m12
resultmatrix->matrix->m13 = matrix1->matrix->m12 * matrix2->matrix->m1 + matrix1->matrix->m13 * matrix2->matrix->m5 + matrix1->matrix->m14 * matrix2->matrix->m9 + matrix1->matrix->m15 * matrix2->matrix->m13
resultmatrix->matrix->m14 = matrix1->matrix->m12 * matrix2->matrix->m2 + matrix1->matrix->m13 * matrix2->matrix->m6 + matrix1->matrix->m14 * matrix2->matrix->m10 + matrix1->matrix->m15 * matrix2->matrix->m14
resultmatrix->matrix->m15 = matrix1->matrix->m12 * matrix2->matrix->m3 + matrix1->matrix->m13 * matrix2->matrix->m7 + matrix1->matrix->m14 * matrix2->matrix->m11 + matrix1->matrix->m15 * matrix2->matrix->m15
end sub
Sub UpdateStars()
Dim Update
For Update=0 To MAXSTARS-1
StarX( Update )=StarX( Update )+StarS( Update )
If StarX( Update )>XRES-1 Then
StarX( Update ) = - xres
StarY( Update ) = Randd( -YRES , YRES )
StarZ( Update ) = Randd( -65 , 65 )
StarC( Update ) = Randd( &H646464 , &HFFFFFF )
End If
FeedPixels( StarX( Update ) , StarY( Update ) , StarZ( Update ) , StarC( Update ) )
Next
End Sub
Function Randd(ByVal lower As double, ByVal upper As double) As double
Dim As double temp, value, dist
If upper < lower Then
temp=upper
upper=lower
lower=temp
End If
value=lower
dist = abs(lower-upper)
Return ( value + ( Rnd(1)*dist ) )
End Function
type PFNW as sub ( byval my_var as integer )
function setVsync(byval inte as integer)
dim wglSwapInterval as sub ( byval my_var as integer )
wglSwapInterval = cast( sub ( byval my_var as integer ) , wglGetProcAddress("wglSwapIntervalEXT") )
wglSwapInterval(inte)
return 0
end function