; ; Author: Krischan ; Date: 2010-08-08 07:08:10 ; Title: Interplanetary travel ; Description: Calculates and shows interplanetary ship travel between two moving celestial bodies in 3D ; ; Adaptations: Rick Nasher ; Date: 2014-09-10 23:11 ; ; ; AppTitle "Interplanetary Travel" dxGraphics3D 1280,800,32,2 ;Include "2622(homekeeping).bb" ;Include "include\DXIncludes.bb" ;Include "milkyway.bb" ;Global MILKYWAY%=InitMilkyway(5000 ,0.5 ,5 ,90 ,5 ,0 ,0 ,0 ,1 ,255 ,192 ,255 ,1 ,0 ,0 ,0 ,1) ; Example 1: Milkyway with 500 fixed stars, 80% up to 10° and 20% from 10° to 40°, red style, normal brightnessGlobal ;Global MILKYWAY1=InitMilkyway(500,0.2,10,40,500,0,0,0,0,255,255,255,1,0,0,0,0) dxSeedRnd MilliSecs() .vars ; sun obstacle demo ;SeedRnd 6 Const GLSC=10, GLSCO=200 , GLSCM=1 ;Global Scale *GLSC Const MOONS = 29 ; number of moons to read Const PLANETS = 9 ; number of planets to read Const RANDOMIZE% = True ; random positions on/off Const DAYINC# = 1.0/60/60 ; time increment per cycle Const YEAR# = 365.256 ; earth year in days Const AVOIDSUNCROSS%= True ; avoid sun crossing trajectory yes/no Const AVOIDINCDAYS% = 10 ; days increment for new trajectory Const START$ = "Moon" ; object to start at ;Const TARGET$ = "Pluto" ; object to target Const TARGET$ = "Jupiter" ; object to target Const SHIPSPEED# = 20*GLSC ; ship speed (Mio. km/Day) (normal = 20 / hispeed = 40 / c=1079.9) Global WIDTH%=dxGraphicsWidth() ; screen width Global HEIGHT%=dxGraphicsHeight() ; screen height Global SPEED#=DAYINC*SHIPSPEED ; calculated ship speed Global TIMER%=CreateTimer(60) ; timer Global INFO%=True ; Text info flag Global STOPPER%=False ; Ship arrival flag Global S.System=New System Global DAYS#,MAXDIST#,CALCTIME#,ZOOM# Global CAM%,PLANETORBITS%,SUN%,SUN0%,SUN1%,SUN2%,SUN3%,TRACER%,SHIP%,STARTOBJECT%,TARGETOBJECT% Global MASTERPIVOT%,SOLIDPIVOT%,WIREDPIVOT%,TARGETPIVOT% Global REQOBJ$ ="Ship",REQSIZ#, camz2obj#=100,camy2obj#=7, CAMTARGET%, cam2ship=False, SHCAMPIV%, TEST%, Monolith%, firsttime=True Type Moon Field id%,parent%,name$,radius#,period#,size#,r%,g%,b%,mnt$,rtp#,SPEED#,random%,entity%,orbit% End Type Type Planet Field id%,parent%,name$,radius#,period#,size#,r%,g%,b%,plt$,rtp#,atmosphere#,MOONS%,moon.Moon[MOONS],SPEED#,random%,entity% End Type Type System Field planet.Planet[PLANETS] End Type ; init scene InitScene() ; init planet and moon objects and update once Initialize() UpdateObjects() ; set ship start position InitShipPosition(SHIP,AVOIDSUNCROSS,AVOIDINCDAYS) dxMoveMouse WIDTH/2,HEIGHT/2 CAMTARGET=SHIP Global slowspeed=False , highspeed=False Local multi#=1 .main ;=========================================================================== ; main loop ;=========================================================================== While Not dxKeyHit(1) ZOOM=1.0 ScreenshotTaker() Local oldx#,oldy#,oldz#,l#=5.0 ;,multi#=1 Local f#=Sqr(dxEntityDistance(CAM,MASTERPIVOT)/1000.0) Local d#=dxEntityDistance(SHIP,TARGETPIVOT) ; store current ship position oldx=dxEntityX(SHIP,False) oldy=dxEntityY(SHIP,False) oldz=dxEntityZ(SHIP,False) ; LMB = advance time ;If MouseDown(1) And (Not STOPPER) Then ;If (Not MouseDown(1)) Then ;And (Not STOPPER) Then DAYS=DAYS+DAYINC If (Not STOPPER) Then ; near target? stop it If d<=SPEED*2 Then UpdateObjects() STOPPER=True dxPositionEntity SHIP,dxEntityX(TARGETOBJECT,False),dxEntityY(TARGETOBJECT,False),dxEntityZ(TARGETOBJECT,False),False CreateLine(TRACER,oldx,oldy,oldz,dxEntityX(SHIP,False),dxEntityY(SHIP,False),dxEntityZ(SHIP,False),0,255,0,1) Else ; move ship to target dxPointEntity SHIP,TARGETPIVOT,0 dxMoveEntity SHIP,0,0,SPEED CreateLine(TRACER,oldx,oldy,oldz,dxEntityX(SHIP,False),dxEntityY(SHIP,False),dxEntityZ(SHIP,False),0,255,0,1) EndIf EndIf ; LSHIFT = 10x slower, RSHIFT = 10x faster cam flight If dxKeyHit(42) Then slowspeed=1-slowspeed : highspeed=False If dxKeyHit(54) Then highspeed=1-highspeed: slowspeed=False If slowspeed=True multi=.05 EndIf If highspeed=True multi=5 EndIf If highspeed=False And slowspeed=False multi=1 EndIf ; RMB = Zoom If dxMouseDown(2) Then ZOOM=20 : l=50.0 ; SPACE = show/hide text info If dxKeyHit(57) Then INFO=1-INFO ; camera movement Cam2Object() If dxKeyHit(31) Then ; key s cam2ship=1-cam2ship ; firsttime=True EndIf If cam2ship ; follow cam,lock cam to ship ; position object to start object position ;PointEntity CAM,SHIP;,90 ;RotateEntity CAM,90,0,0 ;PositionEntity CAM,EntityX(SHCAMPIV),EntityY(SHCAMPIV),EntityZ(SHCAMPIV)-10 ;MoveEntity CAM,(KeyDown(205)-KeyDown(203))*f*multi,0,(KeyDown(200)-KeyDown(208))*f*multi ;PointEntity CAM,SHIP;,90 ;CAMTARGET=SHCAMPIV dxPositionEntity CAM, dxEntityX(SHCAMPIV,True), dxEntityY(SHCAMPIV,True), dxEntityZ(SHCAMPIV,True),False ; ; If firsttime dxPointEntity CAM,SHIP,0 ; firsttime=False ; EndIf ;RotateEntity CAM,EntityPitch(CAM)+(MouseYSpeed()/l),EntityYaw(CAM)-(MouseXSpeed()/l),0 ;MoveEntity CAM,(KeyDown(205)-KeyDown(203))*f*multi,0,(KeyDown(200)-KeyDown(208))*f*multi ;MoveMouse WIDTH/2,HEIGHT/2 ;CameraZoom CAM,ZOOM CAMTARGET=SHIP Else dxRotateEntity CAM,dxEntityPitch(CAM,False)+(dxMouseYSpeed()/l),dxEntityYaw(CAM,False)-(dxMouseXSpeed()/l),0,False dxMoveEntity CAM,(dxKeyDown(205)-dxKeyDown(203))*f*multi,0,(dxKeyDown(200)-dxKeyDown(208))*f*multi dxMoveMouse WIDTH/2,HEIGHT/2 dxCameraZoom CAM,ZOOM ;If CAMTARGET=0 EndIf ; sun quads always point to cam dxPointEntity SUN0,CAM,0 dxPointEntity SUN1,CAM,0 dxPointEntity SUN2,CAM,0 dxPointEntity SUN3,CAM,0 ;localx=EntityX(player) ;localy=EntityY(player) ;localz=EntityZ(player) ;homeKeeping(SHIP,MASTERPIVOT,1000) ; wireframe render pass If INFO dxWireframe 1 EndIf dxShowEntity WIREDPIVOT dxHideEntity SOLIDPIVOT ; HideEntity MilkyWay dxHideEntity Monolith dxCameraClsMode CAM,1,1 dxRenderWorld 1 ; solid object render pass dxWireframe 0 dxHideEntity WIREDPIVOT dxShowEntity SOLIDPIVOT ; ShowEntity MilkyWay ; PositionEntity MilkyWay,EntityX(CAM),EntityY(CAM),EntityZ(CAM) dxShowEntity Monolith dxTurnEntity Monolith,.1,0,0,False ; rotate Monolith dxCameraClsMode CAM,0,0 dxRenderWorld 1 ;update Object positions UpdateObjects() ;MAXDIST2#=EntityDistance(SHIP,TARGETOBJECT) MAXDIST#=dxEntityDistance(CAM,CAMTARGET) ; text info dxText 0, 0,"Source > Target.........: "+START+" > "+TARGET,0,0 dxText 0, 15,"Distance Ship to Object.: "+Round(d)+" Mio. km [total "+Round(MAXDIST)+" Mio. km]",0,0 dxText 0, 30,"Ship Speed..............: "+Round(SPEED/DAYINC)+" Mio. km/Day ["+Round(SPEED/DAYINC/3600*1000000)+"km/sec.]",0,0 dxText 0, 45,"Flight time.............: "+Round(DAYS)+" Days ["+Round(CALCTIME)+" total]",0,0 dxText 0, 60,"Cam speed...............: "+multi,0,0 dxText 0, 75,"Cam 2 Ship..............: "+cam2ship,0,0 dxText 0, 90,"Object in View..........: "+REQOBJ,0,0 dxText 340,90,"Object size.: "+REQSIZ+" KM.",0,0 dxText 0,120,"Distance Cam to Object..: "+MAXDIST#+" KM.",0,0 dxText 800, 0,"Spacebar(toggle)......: Trajectories & Objectnames",0,0 dxText 800, 15,"Cursor Keys & Mouse...: Control Cam",0,0 dxText 800, 30,"Left Shift(toggle)...: Low CamSpeed",0,0 dxText 800, 45,"Right Shift(toggle)...: High CamSpeed" ,0,0 dxText 800, 60,"Select(toggle) object for FollowCam using:",0,0 dxText 800, 75,"S = Ship , Planets = 1 to 0 ",0,0 WaitTimer TIMER dxFlip 0 Wend End ;=========================================================================== ; init scene objects ;=========================================================================== Function InitScene() Local size#=13.92 *GLSC ,suntex% ; pivots MASTERPIVOT=dxCreatePivot(0) SOLIDPIVOT=dxCreatePivot(MASTERPIVOT) WIREDPIVOT=dxCreatePivot(MASTERPIVOT) ; cam CAM=dxCreateCamera(0) dxCameraRange CAM,0.1,32768*10 ; orbit wireframe PLANETORBITS=dxCreateMesh(WIREDPIVOT) dxCreateSurface(PLANETORBITS) dxEntityFX PLANETORBITS,1+2+16+32 ; ship tracer wireframe TRACER=dxCreateMesh(0) dxCreateSurface(TRACER) dxEntityFX TRACER,1+2+16+32 ; ship ;SHIP=CreateCone(16,1,SOLIDPIVOT) ;SHIP=LoadMesh("GFX\286428main_shuttle-hi-res\shutD2.b3d",SOLIDPIVOT) ;SHIP=LoadMesh("GFX\286428main_shuttle-hi-res\shutD2B.b3d",SOLIDPIVOT) SHIP=dxLoadMesh("GFX\286428main_shuttle-hi-res\shutD2F3.b3d",SOLIDPIVOT) xx#=dxEntityPitch(ship,False) ;Stop ;RotateMesh SHIP,90,0,0` ;RotateMesh SHIP,-90,270,0 dxEntityFX SHIP,1 ; EntityColor SHIP,255,0,255 ;ScaleEntity SHIP,0.2,0.2,0.2 ; ScaleEntity SHIP,0.001,0.001,0.001 ; ScaleEntity SHIP,0.00025,0.00025,0.00025 dxScaleEntity SHIP,0.01,0.01,0.01,False ; SHCAMPIV=CreatePivot(SHIP) ; MoveEntity SHCAMPIV,0,.5,-1670 ; MoveEntity SHCAMPIV,0,0,-10 ; TEST=CreateCone(14,True,SHCAMPIV) ; EntityColor TEST,255,0,255 ; RotateMesh TEST,90,0,0 ; ScaleEntity TEST,1,1,1,1 ;Create the Monolith. Monolith=dxCreateCube(0) ; sun SUN=dxCreateSphere(8,0) dxScaleEntity SUN,size,size,size,False dxEntityRadius SUN,size/2.0,size/2.0 dxEntityPickMode SUN,1,0 dxEntityAlpha SUN,0 ; sun flares suntex=CreateSunTexture() SUN0=CreateQuad(SOLIDPIVOT,size*1.0,suntex,3,1+8,255,255,255,1.00) SUN1=CreateQuad(SOLIDPIVOT,size*1.5,suntex,3,1+8,255,192,128,1.00) SUN2=CreateQuad(SOLIDPIVOT,size*3.0,suntex,3,1+8,255,255,224,0.75) SUN3=CreateQuad(SOLIDPIVOT,size*6.0,suntex,3,1+8,255,255,224,0.50) End Function ;=========================================================================== ; calculate ship trajectory from start object to target object ;=========================================================================== Function CalculateTrajectory(add#=0.0,avoidsun%=True) Local pick% ; create ship target pivot TARGETPIVOT=dxCreatePivot(MASTERPIVOT) ; calculate distance and estimated time to reach target position MAXDIST#=dxEntityDistance(SHIP,TARGETOBJECT) CALCTIME#=(MAXDIST/SPEED*DAYINC)+add ; calculate approximate future position of target object DAYS=DAYS+CALCTIME UpdateObjects() ; get ship position Local sx#=dxEntityX(SHIP,False) Local sy#=dxEntityY(SHIP,False) Local sz#=dxEntityZ(SHIP,False) ; get target position Local tx#=dxEntityX(TARGETOBJECT,False) Local ty#=dxEntityY(TARGETOBJECT,False) Local tz#=dxEntityZ(TARGETOBJECT,False) ; place target pivot to target object position and calc distance dxPositionEntity TARGETPIVOT,tx,ty,tz,False MAXDIST#=dxEntityDistance(SHIP,TARGETOBJECT) ; reset scene to initial position DAYS=DAYS-CALCTIME UpdateObjects() ; check free path avoiding sun crossing If avoidsun Then ; check if sun is blocking pick=dxLinePick(sx,sy,sz,tx-sx,ty-sy,tz-sz,10) ; free path? If (Not pick) Then ; create a blue line and calculate the constant ship speed (should be slower than max ship speed) CreateLine(TRACER,sx,sy,sz,tx,ty,tz,0,0,128,1) SPEED#=(dxEntityDistance(SHIP,TARGETPIVOT)/(CALCTIME-DAYS)*DAYINC) ; position cam dxPositionEntity CAM,sx,sy+20,sz-20,False dxPointEntity CAM,SHIP,0 Else ; create a red line if occupied space (for debugging only) CreateLine(TRACER,sx,sy,sz,tx,ty,tz,255,0,0,0.2) EndIf Else ; create a blue line CreateLine(TRACER,sx,sy,sz,tx,ty,tz,0,0,128,1) SPEED#=(dxEntityDistance(SHIP,TARGETPIVOT)/(CALCTIME-DAYS)*DAYINC) ; position cam dxPositionEntity CAM,sx,sy+20,sz-20,False dxPointEntity CAM,SHIP,0 EndIf Return pick End Function ;=========================================================================== ; set a given object to start object position ;=========================================================================== Function InitShipPosition(obj%,avoidsun%=True,avoidinc%=1,addx#=0.0,addy#=0.0,addz#=0.0) Local i%,pick%,c%,p.Planet,m.Moon ; check all planets For p.Planet = Each Planet ; start or target found? store entity information If p\name=START Then STARTOBJECT=p\entity If p\name=TARGET Then TARGETOBJECT=p\entity ; check all moons For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) ; start or target found? store entity information If m\name=START Then STARTOBJECT=m\entity If m\name=TARGET Then TARGETOBJECT=m\entity Next Next ;set initial position dxPositionEntity obj, 0,0,0,False ;Create and position cam pivot. SHCAMPIV=dxCreatePivot(obj) dxPositionEntity SHCAMPIV,dxEntityX(obj,False)-50,dxEntityY(obj,False)+1000,dxEntityZ(obj,False)-750,False; ;PositionEntity SHCAMPIV,EntityX(obj)-500,EntityY(obj)+1000,EntityZ(obj)-2000 dxPositionEntity SHCAMPIV,dxEntityX(obj,False)-00,dxEntityY(obj,False)+1000,dxEntityZ(obj,False)-2000,False ;TEST=CreateCone(64,True,SHCAMPIV) ;EntityColor TEST,255,255,128 ;RotateMesh TEST,-90,0,0 ;ScaleEntity TEST,100,100,100;,1 ;PositionEntity TEST,EntityX(SHCAMPIV)+20,EntityY(SHCAMPIV)+1000,EntityZ(SHCAMPIV)-750 ; position object to start object position dxPositionEntity obj,dxEntityX(STARTOBJECT,False)+addx,dxEntityY(STARTOBJECT,False),dxEntityZ(STARTOBJECT,False)+addz,False dxPointEntity obj, TARGETOBJECT,0 ; calculate direct trajectory (with optional avoiding sun crossing) Repeat pick=CalculateTrajectory(c,avoidsun) : c=c+avoidinc : Until Not pick ;Position Monolith at jupiter ; check all planets For p.Planet = Each Planet ; enitity name found? store entity information If p\name="Jupiter" Then prnt=p\entity Next dxEntityColor Monolith,0,0,0 dxEntityFX Monolith,1 dxPositionEntity Monolith,dxEntityX(prnt,False )+00,dxEntityY(prnt,False),dxEntityZ(prnt,False)+600,False dxPointEntity Monolith,prnt ,0 dxScaleEntity Monolith, 2*5,5*5,.5*5 ,False End Function ;=========================================================================== ; read planet/moon data and create objects, fill types ;=========================================================================== Function Initialize() Local p%,m% Local parent%,name$,radius#,period#,size#,r%,g%,b%,plt$,mnt$,rtp# Local speed#,entity%,random%,orbit%,atmosphere# ; read planet data Restore PLANETDATA For p=1 To PLANETS Read parent,name,radius,period,size,r,g,b,plt$,rtp#,atmosphere# ; calc speed and initial position speed=YEAR/Float(period) If RANDOMIZE Then random=dxRnd(0,2^16) ; create sphere object ;entity=CreateSphere(16,SOLIDPIVOT) entity=dxCreateSphere(64,SOLIDPIVOT) dxEntityFX entity,1 ;EntityColor entity,r,g,b ;ScaleEntity entity,0.5*GLSC ,0.5*GLSC ,0.5*GLSC dxScaleEntity entity,size ,size,size,False dxEntityTexture entity,dxLoadTexture(plt$,9),0,0 ; add orbit ;CreateOrbit(360,PLANETORBITS,radius ,radius ,255,255,255,0.1,0,0,0) CreateOrbit(360*GLSC,PLANETORBITS,radius*GLSC ,radius*GLSC ,255,255,255,0.1,0,0,0) If atmosphere#<>0 atmoentity=dxCreateSphere(64,entity) dxPositionEntity atmoentity,dxEntityX(entity,False),dxEntityY(entity,False),dxEntityZ(entity,False),False dxScaleEntity atmoentity,size*atmosphere,size*atmosphere,size*atmosphere,False dxEntityColor atmoentity,0,0,100 dxEntityAlpha atmoentity,0.5 EndIf ; add planet (to solidpivot? ) S\planet[p]=PLANETcreate(p,parent%,name$,radius#*GLSC ,period#,size#,r%,g%,b%,plt$,rtp#,atmosphere#,speed,entity,random) Next ; read moon data Restore MOONDATA For m=1 To MOONS Read parent,name,radius,period,size,r,g,b,mnt$,rtp# ; calc speed and initial position speed=YEAR/Float(period) If RANDOMIZE Then random=Rnd(0,2^16) ; create sphere object entity=dxCreateSphere(64,SOLIDPIVOT) dxEntityFX entity,1 ;EntityColor entity,r,g,b dxEntityTexture entity,dxLoadTexture(mnt$,9) ,0,0 ;ScaleEntity entity,0.125*GLSC ,0.125*GLSC ,0.125*GLSC dxScaleEntity entity,size,size,size,False ; add orbit ;orbit=CreateOrbit(360*GLSC,0,radius,radius,255,255,255,0.1) orbit=CreateOrbit(360*GLSC,0,radius*GLSCO,radius*GLSCO,255,255,255,0.1) dxEntityFX orbit,1+16 dxEntityAlpha orbit,0.1 ;EntityAutoFade orbit,1,10000 ; increase planet's moon counter S\planet[parent]\MOONS=S\planet[parent]\MOONS+1 ; add moon S\planet[parent]\moon[S\planet[parent]\MOONS]=MOONcreate(S\planet[parent]\MOONS,parent%,name$,radius#*GLSCO,period#,size#,r%,g%,b%,mnt$,rtp#,speed,entity,random,orbit) Next End Function ;=========================================================================== ; update object positions ;=========================================================================== Function UpdateObjects() Local p.Planet,m.Moon,i% For p.Planet = Each Planet UpdatePlanet(p\id) dxTurnEntity p\entity,0,360/p\rtp#/24,0,False ; rotate planets ; only show text if object is in view or text flag enabled If dxEntityInView(p\entity,CAM) And INFO Then dxCameraProject CAM,dxEntityX(p\entity,False),dxEntityY(p\entity,False),dxEntityZ(p\entity,False) dxText dxProjectedX(),dxProjectedY(),p\name,1,0 EndIf For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) If m<>Null Then UpdateMoon(p\id,m\id) dxTurnEntity m\entity,0,360/m\rtp#/24,0,False ; rotate moons ; only show text if object is in view or text flag enabled If dxEntityInView(m\entity,CAM) And INFO And dxEntityDistance(CAM,m\entity)<100*ZOOM Then dxCameraProject CAM,dxEntityX(m\entity,False),dxEntityY(m\entity,False),dxEntityZ(m\entity,False) dxText dxProjectedX(),dxProjectedY(),m\name,1,0 EndIf EndIf Next Next End Function ;=========================================================================== ; create a planet object ;=========================================================================== Function PLANETcreate.Planet(id%,parent%,name$,radius#,period#,size#,r%,g%,b%,plt$,rtp#,atmosphere#,speed#,entity%,random%) Local p.Planet = New Planet p\id=id p\parent=parent p\name=name p\radius=radius p\period=period p\size=size p\r=r p\g=g p\b=b p\plt=plt p\SPEED=speed p\entity=entity p\random=random p\rtp=rtp# p\atmosphere=atmosphere Return p End Function ;=========================================================================== ; create a moon object ;=========================================================================== Function MOONcreate.Moon(id%,parent%,name$,radius#,period#,size#,r%,g%,b%,mnt$,rtp#,speed#,entity%,random%,orbit%) Local m.Moon = New Moon m\id=id m\parent=parent m\name=name m\radius=radius m\period=period m\size=size m\r=r m\g=g m\b=b m\mnt=mnt m\SPEED=speed m\entity=entity m\random=random m\orbit=orbit m\rtp=rtp Return m End Function ;=========================================================================== ; return a moon object handle ;=========================================================================== Function MOONdata.Moon(planet,moon) Return S\planet[planet]\moon[moon] End Function ;=========================================================================== ; return a planet object handle ;=========================================================================== Function PLANETdata.Planet(planet) Return S\planet[planet] End Function ;=========================================================================== ; update a single planet object position according to time ;=========================================================================== Function UpdatePlanet(id%) Local radiusx#,radiusy# Local xcos#=Cos(360) Local xsin#=Sin(360) Local tmpx#,tmpy# Local p.Planet= PLANETdata(id) radiusx=p\radius radiusy=p\radius tmpx#=(Cos((DAYS*(360.0/YEAR)*p\SPEED)+p\random)*radiusx#) tmpy#=(Sin((DAYS*(360.0/YEAR)*p\SPEED)+p\random)*radiusy#) dxPositionEntity p\entity,tmpx#*xcos#+tmpy*-xsin#,0,tmpx#*xsin#+tmpy*xcos#,False ;use moveentity p\entity from old position to new? ;MoveEntity End Function ;=========================================================================== ; update a single moon object position according to time ;=========================================================================== Function UpdateMoon(planet%,id%) Local radiusx#,radiusy# Local xcos#=Cos(360) Local xsin#=Sin(360) Local tmpx#,tmpy#,addx#,addy#,addz# Local p.Planet = PLANETdata(planet) Local m.Moon= MOONdata(planet,id) radiusx=m\radius radiusy=m\radius addx=dxEntityX(p\entity,False) addy=dxEntityY(p\entity,False) addz=dxEntityZ(p\entity,False) tmpx#=(Cos((DAYS*(360.0/YEAR)*m\SPEED)+m\random)*radiusx#)+addx tmpy#=(Sin((DAYS*(360.0/YEAR)*m\SPEED)+m\random)*radiusy#)+addz dxPositionEntity m\entity,tmpx#*xcos#+tmpy*-xsin#,addy,tmpx#*xsin#+tmpy*xcos#,False dxPositionEntity m\orbit,addx,addy,addz,False End Function ;=========================================================================== ; round cut a value for better display ;=========================================================================== Function Round$(value$,digits%=1) Local midpoint%=Instr(value,".") Local prefix$,suffix$,zero%,i% If midpoint Then prefix=Mid(value,1,midpoint-1) suffix=Mid(value,midpoint+1,Len(value)) suffix=Mid(suffix,1,digits) zero=digits-Len(suffix) For i=1 To zero : suffix=suffix+"0" : Next Else prefix=Int(value) For i=1 To digits : suffix=suffix+"0" : Next EndIf Return prefix+"."+suffix End Function ;=========================================================================== ; create a wireframe orbit mesh ;=========================================================================== Function CreateOrbit(segments%,mesh=0,r1#=1,r2#=1.5,r%=255,g%=255,b%=255,a#=1.0,sx#=0.0,sy#=0.0,sz#=0.0) Local la#,na#,i% For i = 1 To segments na=la+(360.0/segments) mesh=CreateLine(mesh,(Cos(la)*r1)+sx,sy,(Sin(la)*r2)+sz,(Cos(na)*r1)+sx,sy,(Sin(na)*r2)+sz,r,g,b,a) la=na Next Return mesh End Function ;=========================================================================== ; create a single wireframe line ;=========================================================================== Function CreateLine(mesh,x0#,y0#,z0#,x1#,y1#,z1#,r%=255,g%=255,b%=255,a#=1.0) Local surf%,v1%,v2% If mesh Then surf=dxGetSurface(mesh,1) Else mesh = dxCreateMesh(0) surf = dxCreateSurface(mesh) dxEntityFX mesh,1+2+16+32 End If v1=dxAddVertex(surf,x1,y1,z1,0,0,0) v2=dxAddVertex(surf,x0,y0,z0,0,0,0) dxAddTriangle surf,v1,v1,v2 dxVertexColor surf,v1,r,g,b,a dxVertexColor surf,v2,r,g,b,a Return mesh End Function ;========================================================================== ; create a quad ;=========================================================================== Function CreateQuad(parent%=False,scale#=1.0,tex%=False,blend%=False,fx%=False,r%=255,g%=255,b%=255,a#=1.0) Local mesh%=dxCreateMesh(0) Local surf%=dxCreateSurface(mesh) Local v0%=dxAddVertex(surf, 1, 1,0,0,0,0) Local v1%=dxAddVertex(surf,-1, 1,0,1,0,0) Local v2%=dxAddVertex(surf,-1,-1,0,1,1,0) Local v3%=dxAddVertex(surf, 1,-1,0,0,1,0) dxAddTriangle surf,v0,v1,v2 dxAddTriangle surf,v0,v2,v3 If parent Then dxEntityParent mesh,parent If fx Then dxEntityFX mesh,fx If tex Then dxEntityTexture mesh,tex,0,0 If blend Then dxEntityBlend mesh,blend dxEntityColor mesh,r,g,b dxEntityAlpha mesh,a dxVertexColor surf,v0,r,g,b,a dxVertexColor surf,v1,r,g,b,a dxVertexColor surf,v2,r,g,b,a dxVertexColor surf,v3,r,g,b,a dxScaleEntity mesh,scale,scale,scale,False Return mesh End Function ;========================================================================== ; create sun texture ;=========================================================================== Function CreateSunTexture() Local tex%=dxCreateTexture(512,512,3,0) Local tb%=dxTextureBuffer(tex) Local i#,j%,col%,rgb% dxSetBuffer tb dxLockBuffer tb For j=0 To 255 col=255-j If col>255 Then col=255 rgb=col*$1000000+col*$10000+col*$100+col For i=0 To 360 Step 0.1 dxWritePixelFast 256+(Sin(i)*j),256+(Cos(i)*j),rgb,tb Next Next dxUnLockBuffer tb dxSetBuffer dxBackBuffer() Return tex End Function .PLANETDATA ;========================================================================== Rotation Diameter ; Parent Name (orbit)Radius Period Size R G B in hrs. (km) ;========================================================================== Data 0 , "Mercury" , 57.909 , 87.989 , 4.878 , 255 , 128 , 0 , "GFX\Mercury\mercurycyl2(large).jpg" , 1407.6 ,0 ; , 4880 ; , Data 0 , "Venus" , 108.160 , 224.701 , 5.000 , 255 , 255 , 0 , "GFX\Venus\venuscyl2(large).jpg" , -5832.5 ,0 ; , 12104 ; , Data 0 , "Earth" , 149.600 , 365.256 , 12.756 , 0 , 0 , 255 , "GFX\Earth\earthcyl3.jpg" , 23.9 ,.08 ; , 12742 ; , Data 0 , "Mars" , 227.990 , 686.980 , 6.794 , 255 , 0 , 0 , "GFX\Mars\marscyl1(large).jpg" , 24.6 ,0 ; , 6780 ; , Data 0 , "Jupiter" , 778.360 , 4331.936 , 142.984 , 255 , 192 , 0 , "GFX\Jupiter\jupitercyl2(large).jpg" , 9.9 ,0; , 139822 ; , Data 0 , "Saturn" , 1433.400 , 10759.346 , 120.536 , 255 , 224 , 0 , "GFX\Saturn\saturncyl1.jpg" , 10.7 ,0 ; , 116464 ; , Data 0 , "Uranus" , 2872.400 , 30685.522 , 51.118 , 0 , 128 , 255 , "GFX\Uranus\uranuscyl1.jpg" , -17.2 ,0 ; , 50724 ; , Data 0 , "Neptune" , 4495.000 , 60190.536 , 49.528 , 0 , 255 , 255 , "GFX\Neptune\neptunecyl1.jpg" , 16.1 ,0 ; , 49248 ; , Data 0 , "Pluto" , 5906.400 , 90466.606 , 2.390 , 255 , 255 , 255 , "GFX\Pluto\plu1rss1.jpg" , -153.3 ,0 ; , 2274 ; , ;==========================================================================rk ; Parent Name Radius Period Size R G B ;========================================================================== .MOONDATA Data 3 , "Moon" , 1.000/2 , 1.000 , 3.476 *1.1 , 255 , 255 , 255 , "GFX\Earth\moonmap.jpg" , 655.728 ; , 3476 ; , Data 4 , "Phobos" , 1.000/2 , 1.000 , 0.027 *50 , 255 , 255 , 255 , "GFX\Mars\phoboscyl1(large).jpg" , 7.656 ; , 560 ; , Data 4 , "Deimos" , 2.000/2 , 2.000 , 0.015 *50 , 255 , 255 , 255 , "GFX\Mars\deimoscyl4.jpg" , 30.312 ; , 8 ; , Data 5 , "Amalthea" , 1.000 , 1.000 , 0.167 *1 , 255 , 255 , 255 , "GFX\Jupiter\amalthea.jpg" , 11.952 ; , 262 ; , Data 5 , "Io" , 2.000 , 2.000 , 3.643 *1, 255 , 255 , 255 , "GFX\Jupiter\iocyl2(large).jpg" , 42.456 ; , 3629 ; , Data 5 , "Europa" , 3.000 , 4.000 , 3.122 *1, 255 , 255 , 255 , "GFX\Jupiter\europacyl2(large).jpg" , 85.224 ; , 3126 ; , Data 5 , "Ganymede" , 4.000 , 8.000 , 5.262 *1, 255 , 255 , 255 , "GFX\Jupiter\ganymedecyl2(large).jpg" , 171.72 ; , 5276 ; , Data 5 , "Callisto" , 5.000 , 16.000 , 4.821 *1, 255 , 255 , 255 , "GFX\Jupiter\callistocyl2(Large).jpg" , 400.536 ; , 4800 ; , Data 5 , "Leda" , 6.000 , 32.000 , 0.020 *5, 255 , 255 , 255 , "GFX\Earth\moonmap.jpg" , 5729.28 ; , 10 ; , Data 5 , "Himalia" , 7.000 , 64.000 , 0.170 *1, 255 , 255 , 255 , "GFX\Earth\moonmap.jpg" , 6013.68 ; , 170 ; , Data 5 , "Elara" , 8.000 , 128.000 , 0.086 *5, 255 , 255 , 255 , "GFX\Earth\moonmap.jpg" , 6231.6 ; , 80 ; , Data 5 , "Pasiphae" , 9.000 , 256.000 , 0.056 *5, 255 , 255 , 255 , "GFX\Earth\moonmap.jpg" , 17640.0 ; , 36 ; , Data 6 , "Mimas" , 1.000 , 1.000 , 0.397 *1, 255 , 255 , 255 , "GFX\Saturn\mimascyl2(large).jpg" , 22.608 ; , 398 ; , Data 6 , "Enceladus" , 2.000 , 2.000 , 0.504 *1, 255 , 255 , 255 , "GFX\Saturn\enceladuscyl2(large0.jpg" , 32880.0 ; , 498 ; , Data 6 , "Tethys" , 3.000 , 4.000 , 1.060 *1, 255 , 255 , 255 , "GFX\Saturn\tethyscyl2(large).jpg" , 45312.0 ; , 1060 ; , Data 6 , "Dione" , 4.000 , 8.000 , 1.127 *1, 255 , 255 , 255 , "GFX\Saturn\dionecyl2(large).jpg" , 65688.0 ; , 1120 ; , Data 6 , "Rhea" , 5.000 , 16.000 , 1.528 *1, 255 , 255 , 255 , "GFX\Saturn\rheacyl2(large).jpg" ,108432.0 ; , 1528 ; , Data 6 , "Titan" , 6.000 , 32.000 , 5.150 *1, 255 , 255 , 255 , "GFX\Saturn\titancyl1.jpg" , 382.68 ; , 5150 ; , Data 6 , "Hyperion" , 7.000 , 64.000 , 0.266 *1, 255 , 255 , 255 , "GFX\Saturn\hyperion.jpg" , 510.648 ; , 360 ; , Data 6 , "Iapetus" , 8.000 , 128.000 , 1.436 *1, 255 , 255 , 255 , "GFX\Saturn\iapetuscyl2(large).jpg" , 1903.716 ; , 1436 ; , Data 6 , "Phoebe" , 9.000 , 256.000 , 0.220 *1, 255 , 255 , 255 , "GFX\Uranus\Phoebe.jpg" , 13211.52 ; , 220 ; , Data 7 , "Miranda" , 1.000 , 1.00 , 0.472 *1, 255 , 255 , 255 , "GFX\Uranus\mirandacyl1(large).jpg" , 33936.0 ; , 472 ; , Data 7 , "Ariel" , 2.000 , 2.00 , 1.158 *1, 255 , 255 , 255 , "GFX\Uranus\arielcyl1(large).jpg" , 60.48 ; , 1160 ; , Data 7 , "Umbriel" , 3.000 , 4.00 , 1.169 *1, 255 , 255 , 255 , "GFX\Uranus\umbrielcyl1(large).jpg" , 99.456 ; , 1190 ; , Data 7 , "Titania" , 4.000 , 8.00 , 1.578 *1, 255 , 255 , 255 , "GFX\Uranus\titaniacyl1(large).jpg" , 208.944 ; , 1578 ; , Data 7 , "Oberon" , 5.000 , 16.00 , 1.523 *1, 255 , 255 , 255 , "GFX\Uranus\oberoncyl1(large).jpg" , 323.112 ; , 1526 ; , Data 8 , "Triton" , 1.000 , 1.00 , 2.707 *1, 255 , 255 , 255 , "GFX\Neptune\tritoncyl1(large).jpg" , 141.048 ; , 2705 ; , Data 8 , "Nereid" , 2.000 , 2.00 , 0.340 *1, 255 , 255 , 255 , "GFX\Earth\moonmap.jpg" , 8643.84 ; , 340 ; , Data 9 , "Charon" , 1.000 , 1.00 , 1.212 *1, 255 , 255 , 255 , "GFX\Pluto\Charon.jpg" , 153.288 ; , 1207 ; , Function Cam2Object() Local i%,c%,p.Planet,m.Moon If dxKeyDown(2) Then ; key 1 REQOBJ="Mercury" camz2obj=500 ; 25 ; check all planets ;p.Planet = First Planet For p.Planet = Each Planet ; start or target found? store entity information If p\name=REQOBJ$ Then CAMTARGET=p\entity REQSIZ#=p\size EndIf ; check all moons For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) ; start or target found? store entity information If m\name=REQOBJ$ Then CAMTARGET=m\entity Next Next dxPointEntity CAM, CAMTARGET,0; dxPositionEntity CAM, dxEntityX(CAMTARGET,False), dxEntityY(CAMTARGET,False)+camy2obj, dxEntityZ(CAMTARGET,False)+camz2obj,False ; EndIf If dxKeyDown(3) Then ; key 2 REQOBJ="Venus" camz2obj=500;25 ; check all planets ;p.Planet = First Planet ;reset pointer For p.Planet = Each Planet ; start or target found? store entity information If p\name=REQOBJ$ Then CAMTARGET=p\entity REQSIZ#=p\size EndIf ; check all moons For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) ; start or target found? store entity information If m\name=REQOBJ$ Then CAMTARGET=m\entity Next Next dxPointEntity CAM, CAMTARGET,0; dxPositionEntity CAM, dxEntityX(CAMTARGET,False), dxEntityY(CAMTARGET,False)+camy2obj, dxEntityZ(CAMTARGET,False)+camz2obj,False ; EndIf If dxKeyDown(4) Then ; key 3 REQOBJ="Earth" camz2obj= 500 ;50 ; check all planets ;p.Planet = First Planet ;reset pointer For p.Planet = Each Planet ; start or target found? store entity information If p\name=REQOBJ Then CAMTARGET=p\entity REQSIZ#=p\size EndIf ; check all moons For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) ; start or target found? store entity information If m\name=REQOBJ Then CAMTARGET=m\entity Next Next dxPointEntity CAM, CAMTARGET,0; dxPositionEntity CAM, dxEntityX(CAMTARGET,False), dxEntityY(CAMTARGET,False)+camy2obj, dxEntityZ(CAMTARGET,False)+camz2obj,False ; EndIf If dxKeyDown(5) Then ; key 4 REQOBJ="Mars" camz2obj=500 ;25; Mars ; check all planets ;p.Planet = First Planet ;reset pointer For p.Planet = Each Planet ; start or target found? store entity information If p\name=REQOBJ Then CAMTARGET=p\entity REQSIZ#=p\size EndIf ; check all moons For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) ; start or target found? store entity information If m\name=REQOBJ Then CAMTARGET=m\entity Next Next dxPointEntity CAM, CAMTARGET,0; dxPositionEntity CAM, dxEntityX(CAMTARGET,False), dxEntityY(CAMTARGET,False)+camy2obj, dxEntityZ(CAMTARGET,False)+camz2obj,False ; EndIf If dxKeyDown(6) Then ; key 5 REQOBJ="Jupiter" camz2obj=500 ; check all planets ;p.Planet = First Planet ;reset pointer For p.Planet = Each Planet ; start or target found? store entity information If p\name=REQOBJ Then CAMTARGET=p\entity REQSIZ#=p\size EndIf ; check all moons For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) ; start or target found? store entity information If m\name=REQOBJ Then CAMTARGET=m\entity Next Next dxPointEntity CAM, CAMTARGET,0; dxPositionEntity CAM, dxEntityX(CAMTARGET,False), dxEntityY(CAMTARGET,False)+camy2obj*GLSC , dxEntityZ(CAMTARGET,False)+camz2obj,False ; EndIf If dxKeyDown(7) Then ; key 6 REQOBJ="Saturn" camz2obj=500 ; check all planets ;p.Planet = First Planet ;reset pointer For p.Planet = Each Planet ; start or target found? store entity information If p\name=REQOBJ Then CAMTARGET=p\entity REQSIZ#=p\size EndIf ; check all moons For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) ; start or target found? store entity information If m\name=REQOBJ Then CAMTARGET=m\entity Next Next dxPointEntity CAM, CAMTARGET,0; dxPositionEntity CAM, dxEntityX(CAMTARGET,False), dxEntityY(CAMTARGET,False)+camy2obj*GLSC, dxEntityZ(CAMTARGET,False)+camz2obj,False ; EndIf If dxKeyDown(8) Then ; key 7 REQOBJ="Uranus" camz2obj=500;400 ; check all planets ;p.Planet = First Planet ;reset pointer For p.Planet = Each Planet ; start or target found? store entity information If p\name=REQOBJ Then CAMTARGET=p\entity REQSIZ#=p\size EndIf ; check all moons For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) ; start or target found? store entity information If m\name=REQOBJ Then CAMTARGET=m\entity Next Next dxPointEntity CAM, CAMTARGET,0; dxPositionEntity CAM, dxEntityX(CAMTARGET,False), dxEntityY(CAMTARGET,False)+camy2obj*GLSC, dxEntityZ(CAMTARGET,False)+camz2obj,False ; EndIf If dxKeyDown(9) Then ; key 8 REQOBJ="Neptune" camz2obj=500 ; check all planets ;p.Planet = First Planet ;reset pointer For p.Planet = Each Planet ; start or target found? store entity information If p\name=REQOBJ Then CAMTARGET=p\entity REQSIZ#=p\size EndIf ; check all moons For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) ; start or target found? store entity information If m\name=REQOBJ Then CAMTARGET=m\entity Next Next dxPointEntity CAM, CAMTARGET,0; dxPositionEntity CAM, dxEntityX(CAMTARGET,False), dxEntityY(CAMTARGET,False)+camy2obj*GLSC, dxEntityZ(CAMTARGET,False)+camz2obj,False ; EndIf If dxKeyDown(10) Then ; key 9 REQOBJ="Pluto" camz2obj=500;25 ; check all planets ;p.Planet = First Planet ;reset pointer For p.Planet = Each Planet ; start or target found? store entity information If p\name=REQOBJ Then CAMTARGET=p\entity REQSIZ#=p\size EndIf ; check all moons For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) ; start or target found? store entity information If m\name=REQOBJ Then CAMTARGET=m\entity Next Next dxPointEntity CAM, CAMTARGET,0; dxPositionEntity CAM, dxEntityX(CAMTARGET,False), dxEntityY(CAMTARGET,False)+camy2obj, dxEntityZ(CAMTARGET,False)+camz2obj,False ; EndIf If dxKeyDown(11) Then ; key 0 camz2obj=500 dxPointEntity CAM, Sun,0 dxPositionEntity CAM, dxEntityX(Sun,False), dxEntityY(Sun,False)+camy2obj, dxEntityZ(Sun,False)+camz2obj ,False CAMTARGET=SUN EndIf End Function Function ScreenshotTaker() If KeyHit(14) = 1;Backspace For w = 1 To 100 nme$ = "screenshot" + w + ".bmp" If FileType(nme$) = 0 If done = 0 ;dxSaveBuffer(FrontBuffer(), nme$) done = 1 EndIf EndIf Next EndIf done = 0 End Function