REM. Direct3D Rotating Globe in BBC BASIC for Windows
REM (C) R.T.Russell 2013, http://www.rtrussell.co.uk/
MODE 8
DIM l%(0), b%(0), n%(0), f%(0), s%(0), m%(0), t%(0), y(0), p(0), r(0), X(0), Y(0), Z(0), e(2), a(2)
INSTALL @lib$+"D3DLIB"
ON CLOSE PROCcleanup:QUIT
ON ERROR PROCcleanup:PRINT REPORT$:END
d% = FN_initd3d(@hwnd%, 1, 0)
IF d% = 0 ERROR 100, "Can't initialise Direct3D"
b%(0) = FN_load3d(d%, @dir$+"SPHERE.B3D", n%(0), f%(0), s%(0))
IF b%(0) = 0 ERROR 100, "Can't load SPHERE.B3D"
t%(0) = FN_loadtexture(d%, @dir$+"WORLD.JPG")
IF t%(0) = 0 ERROR 100, "Can't load WORLD.JPG"
e() = 0, 0, -9
a() = 0, 0, 0
REPEAT
y() = -TIME/200
PROC_render(d%, &FF000040, 0, l%(), 1, m%(), t%(), b%(), n%(), f%(), s%(), y(), p(), r(), X(), Y(), Z(), e(), a(), 0.4, 5/4, 1, 1000)
UNTIL INKEY(1)=0
END
DEF PROCcleanup
b%(0) += 0:IF b%(0) PROC_release(b%(0))
d% += 0 :IF d% PROC_release(d%)
ENDPROC
REM. Direct3D Rotating Globe in BBC BASIC for Windows
REM (C) R.T.Russell 2013, http://www.rtrussell.co.uk/
MODE 8 : OFF
DIM l%(0), b%(0), n%(0), f%(0), s%(0), m%(0), t%(0), y(0), p(0), r(0), X(0), Y(0), Z(0), e(2), a(2)
INSTALL @lib$+"D3DLIB"
ON CLOSE PROCcleanup:QUIT
ON ERROR PROCcleanup:PRINT REPORT$:END
d% = FN_initd3d(@hwnd%, 1, 1)
IF d% = 0 ERROR 100, "Can't initialise Direct3D"
file% = OPENOUT(@tmp$+"SPHERE.B3D")
PROC4(file%, 6144) : REM vertex count
PROC4(file%, &00240152) : REM vertex format and size
PROCtriangulate(5, file%, 1, 0, 0, 0, 0, 1, 0, 1, 0)
PROCtriangulate(5, file%, 0, 1, 0, 0, 0, 1, -1, 0, 0)
PROCtriangulate(5, file%, -1, 0, 0, 0, 0, 1, 0, -1, 0)
PROCtriangulate(5, file%, 0, -1, 0, 0, 0, 1, 1, 0, 0)
PROCtriangulate(5, file%, 1, 0, 0, 0, 1, 0, 0, 0, -1)
PROCtriangulate(5, file%, 0, 1, 0, -1, 0, 0, 0, 0, -1)
PROCtriangulate(5, file%, -1, 0, 0, 0, -1, 0, 0, 0, -1)
PROCtriangulate(5, file%, 0, -1, 0, 1, 0, 0, 0, 0, -1)
CLOSE #file%
b%(0) = FN_load3d(d%, @tmp$+"SPHERE.B3D", n%(0), f%(0), s%(0))
IF b%(0) = 0 ERROR 100, "Can't load SPHERE.B3D"
t%(0) = FN_loadtexture(d%, @dir$+"WORLD.JPG")
IF t%(0) = 0 ERROR 100, "Can't load WORLD.JPG"
DIM D3Dlight8{Type%, Diffuse{r%,g%,b%,a%}, Specular{r%,g%,b%,a%}, \
\ Ambient{r%,g%,b%,a%}, Position{x%,y%,z%}, Direction{x%,y%,z%}, \
\ Range%, Falloff%, Attenuation0%, Attenuation1%, Attenuation2%, \
\ Theta%, Phi% }
D3Dlight8.Type% = 1 : REM point source
D3Dlight8.Diffuse.r% = FN_f4(1)
D3Dlight8.Diffuse.g% = FN_f4(1)
D3Dlight8.Diffuse.b% = FN_f4(1)
D3Dlight8.Position.x% = FN_f4(-20)
D3Dlight8.Position.z% = FN_f4(-20)
D3Dlight8.Range% = FN_f4(200)
D3Dlight8.Attenuation0% = FN_f4(0.2)
l%(0) = D3Dlight8{}
e() = 0, 0, -9
a() = 0, 0, 0
REPEAT
y() = -TIME/200
r() = -0.4 * COS(y(0))
p() = 0.4 * SIN(y(0))
PROC_render(d%, &00000030, 1, l%(), 1, m%(), t%(), b%(), n%(), f%(), s%(), y(), p(), r(), X(), Y(), Z(), e(), a(), 0.4, 5/4, 1, 1000)
UNTIL INKEY(1)=0
END
DEF PROCcleanup
b%(0) += 0:IF b%(0) PROC_release(b%(0))
d% += 0 :IF d% PROC_release(d%)
ENDPROC
DEF PROCtriangulate(L%, F%, x0, y0, z0, x1, y1, z1, x2, y2, z2)
L% -= 1
IF L% THEN
LOCAL a(), b(), c() : DIM a(2), b(2), c(2)
a(0) = x0 + x2 : a(1) = y0 + y2 : a(2) = z0 + z2 : a() /= MOD(a())
b(0) = x0 + x1 : b(1) = y0 + y1 : b(2) = z0 + z1 : b() /= MOD(b())
c(0) = x1 + x2 : c(1) = y1 + y2 : c(2) = z1 + z2 : c() /= MOD(c())
PROCtriangulate(L%, F%, x0, y0, z0, b(0), b(1), b(2), a(0), a(1), a(2))
PROCtriangulate(L%, F%, b(0), b(1), b(2), x1, y1, z1, c(0), c(1), c(2))
PROCtriangulate(L%, F%, a(0), a(1), a(2), b(0), b(1), b(2), c(0), c(1), c(2))
PROCtriangulate(L%, F%, a(0), a(1), a(2), c(0), c(1), c(2), x2, y2, z2)
ELSE
LOCAL u0, u1, u2, v0, v1, v2
PROCvertex(x0, y0, z0, u0, v0)
PROCvertex(x1, y1, z1, u1, v1)
PROCvertex(x2, y2, z2, u2, v2)
IF (u1 - u0) > 0.5 u0 += 1.0
IF (u0 - u1) > 0.5 u1 += 1.0
IF (u2 - u1) > 0.5 u1 += 1.0
IF (u1 - u2) > 0.5 u2 += 1.0
IF (u0 - u2) > 0.5 u2 += 1.0
IF (u2 - u0) > 0.5 u0 += 1.0
PROC4(F%, FN_f4(-x0)) : PROC4(F%, FN_f4(z0)) : PROC4(F%, FN_f4(y0))
PROC4(F%, FN_f4(-x0)) : PROC4(F%, FN_f4(z0)) : PROC4(F%, FN_f4(y0))
PROC4(F%, &FFFFFF) : PROC4(F%, FN_f4(u0)) : PROC4(F%, FN_f4(v0))
PROC4(F%, FN_f4(-x1)) : PROC4(F%, FN_f4(z1)) : PROC4(F%, FN_f4(y1))
PROC4(F%, FN_f4(-x1)) : PROC4(F%, FN_f4(z1)) : PROC4(F%, FN_f4(y1))
PROC4(F%, &FFFFFF) : PROC4(F%, FN_f4(u1)) : PROC4(F%, FN_f4(v1))
PROC4(F%, FN_f4(-x2)) : PROC4(F%, FN_f4(z2)) : PROC4(F%, FN_f4(y2))
PROC4(F%, FN_f4(-x2)) : PROC4(F%, FN_f4(z2)) : PROC4(F%, FN_f4(y2))
PROC4(F%, &FFFFFF) : PROC4(F%, FN_f4(u2)) : PROC4(F%, FN_f4(v2))
ENDIF
ENDPROC
DEF PROCvertex(x, y, z, RETURN u, RETURN v)
u = FNatan2(x, y) / PI / 2 + 0.5
v = FNatan2(z, SQR(x^2 + y^2)) / PI + 0.5
IF u < 0 OR v < 0 OR u > 1 OR v > 1 STOP
ENDPROC
DEF FNatan2(y,x) : ON ERROR LOCAL = SGN(y)*PI/2
IF x>0 THEN = ATN(y/x) ELSE IF y>0 THEN = ATN(y/x)+PI ELSE = ATN(y/x)-PI
DEF PROC4(F%, A%)
BPUT#F%,A% : BPUT#F%,A%>>8 : BPUT#F%,A%>>16 : BPUT#F%,A%>>24
ENDPROC