"Licht"-Oval, RGB Funktionen

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: "Licht"-Oval, RGB Funktionen

BeitragSo, Jan 10, 2010 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieser Code zeichnet ein Oval das eine Lichtquelle darstellen könnte.

NewOval( Xpos, Ypos, RadiusX, RadiusY, Modus, Stärke#, Bufferbreite, Bufferhöhe )

Die Grünen Parameter müssen immer angegeben werden. *pos bezeichnet den Mittelpunkt des Ovals, Radius* sind die Radien die das Oval in die jeweilige Richtung hat.
Die orangen Parameter sind dann anzugeben, wenn man andere RGB Modi haben möchte. Mit Stärke könnt ihr dann die Stärke der RGB-Modi einstellen(nur Modus 1 und 2).
Modus 0: Nicht transparentes Oval, Fadet zu Schwarz
Modus 1: Teiltransparentes Oval, wird nicht addiert
Modus 2: Transparentes Oval, wird addiert, Kanäle mit Overflow werden zu den anderen addiert.
Die Roten Parameter müsst ihr dann angeben, wenn ihr nicht auf den Backbuffer() oder FrontBuffer() zeichnet.

MixRGB( RGBA1, RGBA2, Stärke# )
Hiermit kann man zwei RGBA Werte mixen. Stärke bestimmt wie dominierend RGBA1 über RGBA2 ist.

AddRGB( RGBA1, Stärke#, RGBA2 )
Hiermit kann man zwei RGBA Werte addieren. Stärke bestimmt wie stark RGBA1 zu RGBA2 addiert wird.
Überschuss in einem der RGB Kanäle führt dazu, dass der Überschuss zu den anderen Kanälen addiert wird. Ausgeschlossen vom Überschuss ist der Alpha-Kanal

BlitzBasic: [AUSKLAPPEN]
Function NewOval(X,Y,RX,RY,Mode=0,Strength#=1,BW=-1,BH=-1)
R = ColorRed():G = ColorGreen():B = ColorBlue()
If BW=-1 Then BW=GraphicsWidth()
If BH=-1 Then BH=GraphicsHeight()

If X-RX > BW Then Return
If Y-RY > BH Then Return

LockBuffer

For NX = -RX To RX
PX = NX+X
If PX >= 0 And PX < BW
For NY = -RY To RY
PY = NY+Y
If PY >= 0 And PY < BH
Dist# = 1-Distance2(0,0,NX/Float(RX),NY/Float(RY))

If Dist# >= 0
If Mode = 1
RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY)
RGB = MixRGB(RGB,BRGB,Dist#*Strength)
ElseIf Mode = 2
RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY)
RGB = AddRGB(RGB,Dist#*Strength,BRGB)
Else
RGB = R*Dist Shl 16 + G*Dist Shl 8 + B*Dist
EndIf

WritePixelFast PX,PY,RGB
EndIf
EndIf
Next
EndIf
Next

UnlockBuffer
End Function

Function Distance2#(x1#,y1#,x2#,y2#)
Return Sqr((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
End Function

Function MixRGB(I1,I2,D#)
Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24
Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24

If D < 0 Then D = 0
If D > 1 Then D = 1

A3 = (A1*D+A2*(1-D)):R3 = (R1*D+R2*(1-D)):G3 = (G1*D+G2*(1-D)):B3 = (B1*D+B2*(1-D))
Return A3 Shl 24 + R3 Shl 16 + G3 Shl 8 + B3
End Function

Function AddRGB(I1,D#,I2)
Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24
Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24

If D < 0 Then D = 0
If D > 1 Then D = 1

Local A3 = A1*D+A2 ,R3 = R1*D+R2 ,G3 = G1*D+G2 ,B3 = B1*D+B2
Local T41 = Abs(A3-255) ,T42 = Min(R3-255,0) ,T43 = Min(G3-255,0) ,T44 = Min(B3-255,0)
Local A4 = Max(A3,255) ,R4 = Max(R3,255) ,G4 = Max(G3,255) ,B4 = Max(B3,255)
R4 = Max(R4+T43+T44,255)
G4 = Max(G4+T42+T44,255)
B4 = Max(B4+T42+T43,255)

Return A4 Shl 24 + R4 Shl 16 + G4 Shl 8 + B4
End Function

Function Max(Cr#,Mx#)
If Cr > Mx Then Return Mx
Return Cr
End Function
Function Min(Cr#,Mn#)
If Cr < Mn Then Return Mn
Return Cr
End Function


So kann es dann aussehen:
Modus 0:user posted image
Modus 1:user posted image
Modus 2:user posted image

Beispielcode:
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Timer = CreateTimer(60)
Cls

Local X# = 0, Y# = 0, XVel# = 2, YVel# = 0
Color Rand(0,255),Rand(0,255),Rand(0,255)

While Not KeyHit(1)
X = X + XVel#
Y = Y - YVel#
If Y+50 > GraphicsHeight()
YVel# = -YVel*0.99
XVel# = XVel#*1.01
;Y = Y - YVel#
Color Rand(0,255),Rand(0,255),Rand(0,255)
Else
YVel# = YVel# - 0.25
EndIf
If X-50 > GraphicsWidth()
X = 0
Y = 0
YVel = 0
XVel# = Rnd(1,5)
Mode = Rand(0,2)
Color Rand(0,255),Rand(0,255),Rand(0,255)
EndIf

NewOval(X,Y,50,50,Mode,0.25)
NewOval(800-X,Y,50,50,Mode,0.25)
NewOval(X,600-Y,50,50,Mode,0.25)
NewOval(800-X,600-Y,50,50,Mode,0.25)


Flip 0
WaitTimer Timer
Wend

Function NewOval(X,Y,RX,RY,Mode=0,Strength#=1,BW=-1,BH=-1)
R = ColorRed():G = ColorGreen():B = ColorBlue()
If BW=-1 Then BW=GraphicsWidth()
If BH=-1 Then BH=GraphicsHeight()

If X-RX > BW Then Return
If Y-RY > BH Then Return

LockBuffer

For NX = -RX To RX
PX = NX+X
If PX >= 0 And PX < BW
For NY = -RY To RY
PY = NY+Y
If PY >= 0 And PY < BH
Dist# = 1-Distance2(0,0,NX/Float(RX),NY/Float(RY))

If Dist# >= 0
If Mode = 1
RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY)
RGB = MixRGB(RGB,BRGB,Dist#*Strength)
ElseIf Mode = 2
RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY)
RGB = AddRGB(RGB,Dist#*Strength,BRGB)
Else
RGB = R*Dist Shl 16 + G*Dist Shl 8 + B*Dist
EndIf

WritePixelFast PX,PY,RGB
EndIf
EndIf
Next
EndIf
Next

UnlockBuffer
End Function

Function Distance2#(x1#,y1#,x2#,y2#)
Return Sqr((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
End Function

Function MixRGB(I1,I2,D#)
Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24
Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24

If D < 0 Then D = 0
If D > 1 Then D = 1

A3 = (A1*D+A2*(1-D)):R3 = (R1*D+R2*(1-D)):G3 = (G1*D+G2*(1-D)):B3 = (B1*D+B2*(1-D))
Return A3 Shl 24 + R3 Shl 16 + G3 Shl 8 + B3
End Function

Function AddRGB(I1,D#,I2)
Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24
Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24

If D < 0 Then D = 0
If D > 1 Then D = 1

Local A3 = A1*D+A2 ,R3 = R1*D+R2 ,G3 = G1*D+G2 ,B3 = B1*D+B2
Local T41 = Abs(A3-255) ,T42 = Min(R3-255,0) ,T43 = Min(G3-255,0) ,T44 = Min(B3-255,0)
Local A4 = Max(A3,255) ,R4 = Max(R3,255) ,G4 = Max(G3,255) ,B4 = Max(B3,255)
R4 = Max(R4+T43+T44,255)
G4 = Max(G4+T42+T44,255)
B4 = Max(B4+T42+T43,255)

Return A4 Shl 24 + R4 Shl 16 + G4 Shl 8 + B4
End Function

Function Max(Cr#,Mx#)
If Cr > Mx Then Return Mx
Return Cr
End Function
Function Min(Cr#,Mn#)
If Cr < Mn Then Return Mn
Return Cr
End Function


Noch ein Beispielcode:
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Timer = CreateTimer(60)
Cls

While Not KeyHit(1)
A# = (A# + 5)

Color 0,0,255:NewOval(A Mod 800,300+Cos(a)*200,100,100,2,0.1)
Color 255,0,0:NewOval((A-50) Mod 800,300+Cos(a)*200,100,100,2,0.1)
Color 0,255,0:NewOval((A-100) Mod 800,300+Cos(a)*200,100,100,2,0.1)


Flip 0
WaitTimer Timer
Wend

Function NewOval(X,Y,RX,RY,Mode=0,Strength#=1,BW=-1,BH=-1)
R = ColorRed():G = ColorGreen():B = ColorBlue()
If BW=-1 Then BW=GraphicsWidth()
If BH=-1 Then BH=GraphicsHeight()

If X-RX > BW Then Return
If Y-RY > BH Then Return

LockBuffer

For NX = -RX To RX
PX = NX+X
If PX >= 0 And PX < BW
For NY = -RY To RY
PY = NY+Y
If PY >= 0 And PY < BH
Dist# = 1-Distance2(0,0,NX/Float(RX),NY/Float(RY))

If Dist# >= 0
If Mode = 1
RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY)
RGB = MixRGB(RGB,BRGB,Dist#*Strength)
ElseIf Mode = 2
RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY)
RGB = AddRGB(RGB,Dist#*Strength,BRGB)
Else
RGB = R*Dist Shl 16 + G*Dist Shl 8 + B*Dist
EndIf

WritePixelFast PX,PY,RGB
EndIf
EndIf
Next
EndIf
Next

UnlockBuffer
End Function

Function Distance2#(x1#,y1#,x2#,y2#)
Return Sqr((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
End Function

Function MixRGB(I1,I2,D#)
Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24
Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24

If D < 0 Then D = 0
If D > 1 Then D = 1

A3 = (A1*D+A2*(1-D)):R3 = (R1*D+R2*(1-D)):G3 = (G1*D+G2*(1-D)):B3 = (B1*D+B2*(1-D))
Return A3 Shl 24 + R3 Shl 16 + G3 Shl 8 + B3
End Function

Function AddRGB(I1,D#,I2)
Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24
Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24

If D < 0 Then D = 0
If D > 1 Then D = 1

Local A3 = A1*D+A2 ,R3 = R1*D+R2 ,G3 = G1*D+G2 ,B3 = B1*D+B2
Local T41 = Abs(A3-255) ,T42 = Min(R3-255,0) ,T43 = Min(G3-255,0) ,T44 = Min(B3-255,0)
Local A4 = Max(A3,255) ,R4 = Max(R3,255) ,G4 = Max(G3,255) ,B4 = Max(B3,255)
R4 = Max(R4+T43+T44,255)
G4 = Max(G4+T42+T44,255)
B4 = Max(B4+T42+T43,255)

Return A4 Shl 24 + R4 Shl 16 + G4 Shl 8 + B4
End Function

Function Max(Cr#,Mx#)
If Cr > Mx Then Return Mx
Return Cr
End Function
Function Min(Cr#,Mn#)
If Cr < Mn Then Return Mn
Return Cr
End Function


Dritter Beispielcode, wie sowas im fullscreen aussehen könnte(Mit Mesh/Surface/Vertex modification seid ihr da besser dran):
BlitzBasic: [AUSKLAPPEN]
Graphics3D 1024,768,32,2
Graphics3D 200,150,32,3
SetBuffer BackBuffer()
SeedRnd MilliSecs()


cam = CreateCamera():light = CreateLight(1,cam)

ter = CreateTerrain(64):PositionEntity ter,-128,0,-128
For Z = 0 To 16
For X = 0 To 63
For Y = 0 To 63
ModifyTerrain ter,X,Y,TerrainHeight(ter,X,Y)+Rand(-51,51)
Next
Next
Next

For Z = 0 To 3
For X = 0 To 63
For Y = 0 To 63
ModifyTerrain ter,X,Y,(TerrainHeight(ter,X-1,Y)+TerrainHeight(ter,X,Y-1)+TerrainHeight(ter,X+1,Y)+TerrainHeight(ter,X,Y+1)+TerrainHeight(ter,X,Y))/5.0
Next
Next
Next

TerrainDetail ter,24000,1
TerrainShading ter,True
ScaleEntity ter,4,64,4

Tex = CreateTexture(128,128,8)
SetBuffer TextureBuffer(tex)
LockBuffer
For X = 0 To 127
For Y = 0 To 127
WritePixelFast X,Y,Rand(0,127) Shl 16 + Rand(127,255) Shl 8 + Rand(0,127)
Next
Next
UnlockBuffer
SetBuffer BackBuffer()

EntityTexture ter,tex
ScaleTexture tex,2,2
cube = CreateSphere(32):PositionEntity cube,0,TerrainY(ter,0,0,0),0
ScaleEntity cube,2,1,2
t = CreateCube(cube):ScaleEntity t,0.5,1,0.5
CameraClsColor cam,255,127,0

t = CreateSphere(16,cube):MoveEntity t,5,5,0:HideEntity t

t2 = CreateCube()
Timer = CreateTimer(60)

Dither 1
AntiAlias 1

While Not KeyHit(1)
Cls
TurnEntity cube,.1,1,.5
PositionEntity t2,EntityX(t,1),TerrainY(ter,EntityX(t,1),EntityY(t,1),EntityZ(t,1)),EntityZ(t,1)

RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam)-MouseXSpeed(),0
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

If KeyDown(17) Then MoveEntity cam,0,0,1
If KeyDown(31) Then MoveEntity cam,0,0,-1

PositionEntity cam,EntityX(cam),TerrainY(ter,EntityX(cam),0,EntityZ(cam))+6,EntityZ(cam)

If MouseHit(1) Then bloom=1-bloom
WireFrame MouseDown(2)
RenderWorld
If bloom = 1 Then BloomBuffer()
Flip 0
WaitTimer Timer
Wend

Function BloomBuffer(BW=-1,BH=-1)
If BW=-1 Then BW=GraphicsWidth()
If BH=-1 Then BH=GraphicsHeight()

LockBuffer
For X = 0 To BW+8 Step 8
For Y = 0 To BH+6 Step 6
RGB = ReadPixelFast(X,Y)
R = RGB Shl 8 Shr 24:G = RGB Shl 16 Shr 24:B = RGB Shl 24 Shr 24
If R > 153 Or G > 153 Or B > 153
RBloom = Min(R-153,0):GBloom = Min(G-153,0):BBloom = Min(B-153,0)
Color RBloom,GBloom,BBloom
NewOval(X,Y,8,6,2,0.25,BW,BH)
EndIf
Next
Next
UnlockBuffer
End Function

Function NewOval(X,Y,RX,RY,Mode=0,Strength#=1,BW=-1,BH=-1)
R = ColorRed():G = ColorGreen():B = ColorBlue()
If BW=-1 Then BW=GraphicsWidth()
If BH=-1 Then BH=GraphicsHeight()

If X-RX > BW Then Return
If Y-RY > BH Then Return

;LockBuffer

For NX = -RX To RX
PX = NX+X
If PX >= 0 And PX < BW
For NY = -RY To RY
PY = NY+Y
If PY >= 0 And PY < BH
Dist# = 1-Distance2(0,0,NX/Float(RX),NY/Float(RY))

If Dist# >= 0
If Mode = 1
RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY)
RGB = MixRGB(RGB,BRGB,Dist#*Strength)
ElseIf Mode = 2
RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY)
RGB = AddRGB(RGB,Dist#*Strength,BRGB)
Else
RGB = R*Dist Shl 16 + G*Dist Shl 8 + B*Dist
EndIf

WritePixelFast PX,PY,RGB
EndIf
EndIf
Next
EndIf
Next

;UnlockBuffer
End Function

Function Distance2#(x1#,y1#,x2#,y2#)
Return Sqr((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
End Function

Function MixRGB(I1,I2,D#)
Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24
Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24

If D < 0 Then D = 0
If D > 1 Then D = 1

A3 = (A1*D+A2*(1-D)):R3 = (R1*D+R2*(1-D)):G3 = (G1*D+G2*(1-D)):B3 = (B1*D+B2*(1-D))
Return A3 Shl 24 + R3 Shl 16 + G3 Shl 8 + B3
End Function

Function AddRGB(I1,D#,I2)
Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24
Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24

If D < 0 Then D = 0
If D > 1 Then D = 1

Local A3 = A1*D+A2 ,R3 = R1*D+R2 ,G3 = G1*D+G2 ,B3 = B1*D+B2
Local T41 = Abs(A3-255) ,T42 = Min(R3-255,0) ,T43 = Min(G3-255,0) ,T44 = Min(B3-255,0)
Local A4 = Max(A3,255) ,R4 = Max(R3,255) ,G4 = Max(G3,255) ,B4 = Max(B3,255)
R4 = Max(R4+T43+T44,255)
G4 = Max(G4+T42+T44,255)
B4 = Max(B4+T42+T43,255)

Return A4 Shl 24 + R4 Shl 16 + G4 Shl 8 + B4
End Function

Function Max(Cr#,Mx#)
If Cr > Mx Then Return Mx
Return Cr
End Function
Function Min(Cr#,Mn#)
If Cr < Mn Then Return Mn
Return Cr
End Function
Warbseite

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group