demo raytracing (mais j y comprend rien)
Publié : ven. 03/mars/2006 18:17
j ai porté un programme de qbasic sur purebasic, une demo de raytracing.
resultat sympa, mais bon !! vu que j y comprend rien, j aurai du mal a faire evoler ce truc.
resultat sympa, mais bon !! vu que j y comprend rien, j aurai du mal a faire evoler ce truc.

Code : Tout sélectionner
objnum = 4
x0.f
y0.f
mv.f
md.f
ca.f
tn.f
tb.f
rz.f
x1.f
y1.f
z1.f
a2.f
b2.f
c2.f
tb.f
tmin.f
col.f
col2.f
cc.f
tb.f
rz.f
a0.f
b0.f
c0.f
nx.f
ny.f
nz.f
d.f
l.l
InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(1024,768,32, "")
addecr1 = DrawingBuffer()
StartDrawing(ScreenOutput())
addecr1 = DrawingBuffer()
StopDrawing()
FlipBuffers()
StartDrawing(ScreenOutput())
largecr=DrawingBufferPitch()
Dim OBJ(objnum)
Dim t(82000)
Dim t2(82000)
Dim A(objnum)
Dim B(objnum)
Dim C(objnum)
Dim R(objnum)
D = 230
l = 0
; 'four objects
OBJ(0) = 0: A(0) = -50 + l: B(0) = 0: C(0) = -100: R(0) = -55 * 55
OBJ(1) = 0: A(1) = 50 - l: B(1) = -25: C(1) = -120: R(1) = -55 * 55
OBJ(2) = 0: A(2) = 50: B(2) = 80: C(2) = -110: R(2) = -150 * 50
OBJ(3) = 1: A(3) = 60: B(3) = -35: C(3) = -30
For l = 0 To 100;199
A(0) = -50 + l
A(1) = 50 - l
posi = 400
mmmm = -1
; 'calculamos uno de cada 4 pixels a buffer t()
For Y = -40 To 139 Step 2
For X = -80 To 79 Step 2
X0 = X
Y0 = Y
Gosub raytrace
t(posi) = COL
posi = posi + 1
Next
Next
posi = 482
POS2 = 0
For YQ =6 To 143
For XQ = 2 To 77
If t2(posi) = t2(posi + 1) And t2(posi) = t2(posi + 80) And t2(posi) = t2(posi + 81)
ipos = ((YQ *largecr+(XQ *4))*4)
For YY = 0 To 3
For XX = 0 To 3
zzz=(YY * (t(posi + 80) * (4 - XX) + t(posi + 81) * XX) + (t(posi) * (4 - XX) + t(posi + 1) * XX) * (4 - YY)) / 15
zzz2=zzz*256
; zzz3=zzz*256*256
zzz4=zzz+zzz2+zzz3
PokeL(ipos+addecr1,zzz4)
ipos = ipos + 4
Next
ipos = ipos + largecr-16
Next
Else
mmmm = 0
For yy1 = 0 To 3
For xx1 = 0 To 3
X0 = (-160 + XQ * 4 + xx1) / 2
Y0 = (-100 + YQ * 4 + yy1) / 2
Gosub raytrace
sss=((YQ * 4 + yy1) * 1024+ XQ * 4 + xx1)*4
col=Int(col)
col22=col*256
; col33=col*256*256
col44=col+col22+col33
PokeL (sss+addecr1, COL44)
Next
Next
EndIf
posi = posi + 1
Next
posi = posi + 4
Next
Next
End
raytrace:
Z0 = 0
MD = 1 / Sqr(X0 * X0 + Y0 * Y0 + D * D)
X1 = X0 * MD
Y1 = Y0 * MD
Z1 = -(D + Z0) * MD
K = 0
COL = 0
OBJMIN = objnum
If mmmm < 0
t2(posi) = objnum
EndIf
Top:
TMIN = 327680
For n = 0 To 2
If OBJ(n) = 0 And (OBJ(n) <> OBJMIN)
A0 = A(n) - X0
B0 = B(n) - Y0
C0 = C(n) - Z0
TB = A0 * X1 + B0 * Y1 + C0 * Z1
RZ = TB * TB - A0 * A0 - B0 * B0 - C0 * C0
If RZ >= R(n)
TN = TB - Sqr(RZ - R(n))
If TN < TMIN And TN > 0
TMIN = TN
OBJMIN2 = n
EndIf
EndIf
EndIf
Next
OBJMIN = OBJMIN2
If TMIN < 327680 And (OBJ(OBJMIN) = 0)
If mmmm < 0
t2(posi) = t2(posi) * K * objnum * 3 + OBJMIN
EndIf
X0 = X0 + X1 * TMIN
Y0 = Y0 + Y1 * TMIN
Z0 = Z0 + Z1 * TMIN
NX = X0 - A(OBJMIN)
NY = Y0 - B(OBJMIN)
NZ = Z0 - C(OBJMIN)
CA = 2 * (NX * X1 + NY * Y1 + NZ * Z1) / (NX * NX + NY * NY + NZ * NZ + 1)
X1 = X1 - NX * CA
Y1 = Y1 - NY * CA
Z1 = Z1 - NZ * CA
A2 = A(3) - X0
B2 = B(3) - Y0
C2 = C(3) - Z0
MV = 1 / Sqr(A2 * A2 + B2 * B2 + C2 * C2)
A2 = A2 * MV
B2 = B2 * MV
C2 = C2 * MV
s = 0
For n = 0 To 2
If OBJ(n) = 0 And s = 0
A0 = X0 - A(n)
B0 = Y0 - B(n)
C0 = Z0 - C(n)
TB = A2 * A0 + B2 * B0 + C2 * C0
RZ = TB * TB - A0 * A0 - B0 * B0 - C0 * C0
If RZ >= R(n) And TB < 0
s = -1
EndIf
If mmmm < 0
t2(posi) = t2(posi) * 32
EndIf
EndIf
Next
If s = 0
t2(posi) = t2(posi) + 1
COL2 = X1 * A2 + Y1 * B2 + Z1 * C2
If COL2 < 0
COL2 = 0
EndIf
cc = COL2 * COL2
COL2 = cc * cc
MV = Sqr(NX * NX + NY * NY + NZ * NZ)
If COL2 < 0
COL2 = 0
EndIf
COL2 = COL2 + (NX * A2 + NY * B2 + NZ * C2) / MV
If COL2 < 0
COL2 = 0
EndIf
COL = COL + COL2 / ((K + 1) * (K + 1) * 2)
If COL > 1
COL = 1
EndIf
EndIf
K = K + 1
EndIf
If TMIN < 327680 And K <= 2
Goto Top
EndIf
If K = 0
COL = 150
Else
COL = COL * 255
If col>255
col=255
EndIf
EndIf
Return