Mal wieder etwas von mir, ein weiterer Prototyp von etwas was nun vollständig in meinem Spiel eingebaut ist. Vielleicht kann es jemand als basis gebrauchen, oder will es für seinen Prototypen in Blitz3D verwenden.
TSpriteBuilder
Diese Type wird genutzt um TSprite_Create zu sagen, was es tun soll. Funktioniert soweit es geht, ein paar Sachen werden direkt erledigt anstatt in TSprite_Create, was eigentlich nicht schlimm sein sollte, außer man will diese dynamisch erstellen.
TSprite
Das eigentliche TiledSprite. Dies kann man mit TSprite_Fill dann zeichnen lassen, inklusive verschiedener füll-modi.
Das Beispiel am Ende des Posts sagt wahrscheinlich mehr aus als ich zusammenfassen kann.
Download (inkl. Resourcen): TiledSprite (Library).7z
Library:
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN]
Const TSPRITE_BORDER_LFT% = 1 Const TSPRITE_BORDER_RGT% = 2 Const TSPRITE_BORDER_TOP% = 4 Const TSPRITE_BORDER_BTM% = 8 Const TSPRITE_BORDEROUT_LFT% = 16 Const TSPRITE_BORDEROUT_RGT% = 32 Const TSPRITE_BORDEROUT_TOP% = 64 Const TSPRITE_BORDEROUT_BTM% = 128 Const TSPRITE_ROUNDDOWN_HORZ% = 256 Const TSPRITE_ROUNDDOWN_VERT% = 512 Const TSPRITE_PARTIAL_HORZ% = 1024 Const TSPRITE_PARTIAL_VERT% = 2048 Const TSPRITE_PARTIALCUT_HORZ% = 4096 Const TSPRITE_PARTIALCUT_VERT% = 8192 Const TSPRITE_FORCESINGLE_HORZ% = 16384 Const TSPRITE_FORCESINGLE_VERT% = 32768
Const HINT_LEFT% = 0 Const HINT_TOP% = 1 Const HINT_RIGHT% = 2 Const HINT_BOTTOM% = 3
Type TSprite Field mTexture% = 0 Field mTextureBrush% = 0 Field mMesh% = 0 Field mSurface% = 0 Field mShareSurface% = False Field mPadding%[4] Field mBorder%[4] Field mOuter%[4] Field mInner%[4] Field mOuterUV#[4] Field mInnerUV#[4] Field mScale#[2] Field mBorderScale#[2] End Type
Type TSpriteBuilder Field Width% = 0 Field Height% = 0 Field TextureBrush% = 0 Field Mesh% = 0 Field MeshSurface% = 0 Field SharedSurface% = False Field PaddingLeft% = 0 Field PaddingTop% = 0 Field PaddingRight% = 0 Field PaddingBottom% = 0 Field BorderLeft% = 0 Field BorderTop% = 0 Field BorderRight% = 0 Field BorderBottom% = 0 Field ScaleX# = 1 Field ScaleY# = 1 Field BorderScaleX# = 1 Field BorderScaleY# = 1 Field OwnBrush% = True Field OwnMesh% = True Field OwnMeshSurface% = True End Type
Function TSpriteBuilder_Create.TSpriteBuilder() Local SpriteBuilder.TSpriteBuilder = New TSpriteBuilder SpriteBuilder\TextureBrush = CreateBrush(1.0, 1.0, 1.0) SpriteBuilder\Mesh = CreateMesh() SpriteBuilder\MeshSurface = CreateSurface(SpriteBuilder\Mesh) Return SpriteBuilder End Function
Function TSpriteBuilder_Padding.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, PaddingLeft%, PaddingTop%, PaddingRight%, PaddingBottom%) If SpriteBuilder <> Null Then SpriteBuilder\PaddingLeft = PaddingLeft SpriteBuilder\PaddingTop = PaddingTop SpriteBuilder\PaddingRight = PaddingRight SpriteBuilder\PaddingBottom = PaddingBottom Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_Scale.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, ScaleX#, ScaleY#) If SpriteBuilder <> Null Then SpriteBuilder\ScaleX = ScaleX SpriteBuilder\ScaleY = ScaleY Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_Border.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, BorderLeft%, BorderTop%, BorderRight%, BorderBottom%) If SpriteBuilder <> Null Then SpriteBuilder\BorderLeft = BorderLeft SpriteBuilder\BorderTop = BorderTop SpriteBuilder\BorderRight = BorderRight SpriteBuilder\BorderBottom = BorderBottom Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_BorderScale.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, BorderScaleX#, BorderScaleY#) If SpriteBuilder <> Null Then SpriteBuilder\BorderScaleX = BorderScaleX SpriteBuilder\BorderScaleY = BorderScaleY Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_Brush.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, Brush%) If SpriteBuilder <> Null And Brush <> 0 Then If SpriteBuilder\OwnBrush = True And SpriteBuilder\TextureBrush <> 0 Then FreeBrush SpriteBuilder\TextureBrush SpriteBuilder\TextureBrush = Brush If SpriteBuilder\MeshSurface <> 0 Then PaintSurface SpriteBuilder\MeshSurface, SpriteBuilder\TextureBrush Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_BrushSize.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, BrushW%, BrushH%) If SpriteBuilder <> Null And SpriteBuilder\TextureBrush <> 0 Then SpriteBuilder\Width = BrushW SpriteBuilder\Height = BrushH Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_BrushAlpha.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, Alpha#) If SpriteBuilder <> Null And SpriteBuilder\TextureBrush <> 0 Then BrushAlpha SpriteBuilder\TextureBrush, Alpha Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_BrushBlend.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, Blend%) If SpriteBuilder <> Null And SpriteBuilder\TextureBrush <> 0 Then BrushBlend SpriteBuilder\TextureBrush, Blend Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_BrushColor.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, Red#, Green#, Blue#) If SpriteBuilder <> Null And SpriteBuilder\TextureBrush <> 0 Then BrushColor SpriteBuilder\TextureBrush, Red, Green, Blue Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_BrushFX.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, FX%) If SpriteBuilder <> Null And SpriteBuilder\TextureBrush <> 0 Then BrushFX SpriteBuilder\TextureBrush, FX Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_BrushShininess.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, Shininess#) If SpriteBuilder <> Null And SpriteBuilder\TextureBrush <> 0 Then BrushShininess SpriteBuilder\TextureBrush, Shininess Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_BrushTexture.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, Texture%, Frame% = 0, Index% = 0) If SpriteBuilder <> Null And Texture <> 0 Then BrushTexture SpriteBuilder\TextureBrush, Texture, Frame, Index SpriteBuilder\Width = TextureWidth(Texture) SpriteBuilder\Height = TextureHeight(Texture) Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_Mesh.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, Mesh% = 0, MeshSurface% = 0, ShareSurface = False) If SpriteBuilder <> Null Then If SpriteBuilder\OwnMesh Then FreeEntity SpriteBuilder\Mesh If Mesh = 0 Then SpriteBuilder\Mesh = CreateMesh() SpriteBuilder\OwnMesh = True Else SpriteBuilder\Mesh = Mesh SpriteBuilder\OwnMesh = False EndIf TSpriteBuilder_MeshSurface(SpriteBuilder, MeshSurface, ShareSurface) Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_MeshSurface.TSpriteBuilder(SpriteBuilder.TSpriteBuilder, MeshSurface% = 0, ShareSurface% = False) If SpriteBuilder <> Null And SpriteBuilder\Mesh <> 0 Then If MeshSurface = 0 Then If SpriteBuilder\OwnMeshSurface = False Then SpriteBuilder\MeshSurface = CreateSurface(SpriteBuilder\Mesh, SpriteBuilder\TextureBrush) SpriteBuilder\OwnMeshSurface = True ElseIf MeshSurface <> 0 Then SpriteBuilder\MeshSurface = MeshSurface SpriteBuilder\OwnMeshSurface = False EndIf If SpriteBuilder\TextureBrush <> 0 Then PaintSurface SpriteBuilder\MeshSurface, SpriteBuilder\TextureBrush SpriteBuilder\SharedSurface = ShareSurface Return SpriteBuilder EndIf Return Null End Function
Function TSpriteBuilder_Reset.TSpriteBuilder(SpriteBuilder.TSpriteBuilder) If SpriteBuilder <> Null Then If SpriteBuilder\OwnMesh Then FreeEntity SpriteBuilder\Mesh If SpriteBuilder\OwnBrush Then FreeBrush SpriteBuilder\TextureBrush Delete SpriteBuilder Return New TSpriteBuilder EndIf End Function
Function TSprite_Create.TSprite(SpriteBuilder.TSpriteBuilder) If SpriteBuilder <> Null And SpriteBuilder\Mesh <> 0 And SpriteBuilder\MeshSurface <> 0 And SpriteBuilder\TextureBrush <> 0 Then Local Sprite.TSprite = New TSprite Local Width# = SpriteBuilder\Width Local Height# = SpriteBuilder\Height Sprite\mMesh = SpriteBuilder\Mesh Sprite\mSurface = SpriteBuilder\MeshSurface Sprite\mShareSurface = SpriteBuilder\SharedSurface Sprite\mTextureBrush = SpriteBuilder\TextureBrush Sprite\mPadding[0] = SpriteBuilder\PaddingLeft Sprite\mPadding[1] = SpriteBuilder\PaddingTop Sprite\mPadding[2] = SpriteBuilder\PaddingRight Sprite\mPadding[3] = SpriteBuilder\PaddingBottom Sprite\mBorder[0] = SpriteBuilder\BorderLeft Sprite\mBorder[1] = SpriteBuilder\BorderTop Sprite\mBorder[2] = SpriteBuilder\BorderRight Sprite\mBorder[3] = SpriteBuilder\BorderBottom Sprite\mScale[0] = SpriteBuilder\ScaleX Sprite\mScale[1] = SpriteBuilder\ScaleY Sprite\mBorderScale[0] = SpriteBuilder\BorderScaleX Sprite\mBorderScale[1] = SpriteBuilder\BorderScaleY Sprite\mOuter[0] = Sprite\mPadding[0] Sprite\mOuter[1] = Sprite\mPadding[1] Sprite\mOuter[2] = Width - Sprite\mPadding[2] Sprite\mOuter[3] = Height - Sprite\mPadding[3] Sprite\mInner[0] = Sprite\mOuter[0] + Sprite\mBorder[0] Sprite\mInner[1] = Sprite\mOuter[1] + Sprite\mBorder[1] Sprite\mInner[2] = Sprite\mOuter[2] - Sprite\mBorder[2] Sprite\mInner[3] = Sprite\mOuter[3] - Sprite\mBorder[3] Sprite\mOuterUV[0] = Sprite\mOuter[0] / Width Sprite\mOuterUV[1] = Sprite\mOuter[1] / Height Sprite\mOuterUV[2] = Sprite\mOuter[2] / Width Sprite\mOuterUV[3] = Sprite\mOuter[3] / Height Sprite\mInnerUV[0] = Sprite\mInner[0] / Width Sprite\mInnerUV[1] = Sprite\mInner[1] / Height Sprite\mInnerUV[2] = Sprite\mInner[2] / Width Sprite\mInnerUV[3] = Sprite\mInner[3] / Height Return Sprite EndIf Return Null End Function
Function TSprite_Fill(Sprite.TSprite, X#, Y#, Width#, Height#, Z#=0, Modes%=0) Local TileX%, TileXPos#, TileXPosE#, TileWidth#, TileHMult#, TileCountH#, TileCountH2, TempHMult#, TileUVLeft#, TileUVRight# Local TileY%, TileYPos#, TileYPosE#, TileHeight#, TileVMult#, TileCountV#, TileCountV2, TempVMult#, TileUVTop#, TileUVBottom# If Sprite <> Null And Sprite\mSurface <> 0 And Width > 0 And Height > 0 Then If Sprite\mShareSurface = False Then ClearSurface(Sprite\mSurface) Local BorderLft = ((Modes And TSPRITE_BORDER_LFT) > 0) Local BorderRgt = ((Modes And TSPRITE_BORDER_RGT) > 0) Local BorderTop = ((Modes And TSPRITE_BORDER_TOP) > 0) Local BorderBtm = ((Modes And TSPRITE_BORDER_BTM) > 0) Local BorderOutLft = (-1 + ((Modes And TSPRITE_BORDEROUT_LFT) > 0)) Local BorderOutRgt = (-1 + ((Modes And TSPRITE_BORDEROUT_RGT) > 0)) Local BorderOutTop = (-1 + ((Modes And TSPRITE_BORDEROUT_TOP) > 0)) Local BorderOutBtm = (-1 + ((Modes And TSPRITE_BORDEROUT_BTM) > 0)) Local RoundDownH = ((Modes And TSPRITE_ROUNDDOWN_HORZ) > 0) Local RoundDownV = ((Modes And TSPRITE_ROUNDDOWN_VERT) > 0) Local PartialH = ((Modes And TSPRITE_PARTIAL_HORZ) > 0) Local PartialV = ((Modes And TSPRITE_PARTIAL_VERT) > 0) Local PartialCutH = ((Modes And TSPRITE_PARTIALCUT_HORZ) > 0) Local PartialCutV = ((Modes And TSPRITE_PARTIALCUT_VERT) > 0) Local ForceSingleH = ((Modes And TSPRITE_FORCESINGLE_HORZ) > 0) Local ForceSingleV = ((Modes And TSPRITE_FORCESINGLE_VERT) > 0) Local SpriteBorder#[4] SpriteBorder[0] = (Sprite\mBorder[0] * Sprite\mBorderScale[0]) * BorderLft SpriteBorder[2] = (Sprite\mBorder[2] * Sprite\mBorderScale[0]) * BorderRgt SpriteBorder[1] = (Sprite\mBorder[1] * Sprite\mBorderScale[0]) * BorderTop SpriteBorder[3] = (Sprite\mBorder[3] * Sprite\mBorderScale[0]) * BorderBtm Local SpriteSize#[2] SpriteSize[0] = (Sprite\mInner[2]-Sprite\mInner[0])*Sprite\mScale[0] SpriteSize[1] = (Sprite\mInner[3]-Sprite\mInner[1])*Sprite\mScale[1] Local RealWidth# = Width + (SpriteBorder[0] * BorderOutLft) + (SpriteBorder[2] * BorderOutRgt) Local RealHeight# = Height + (SpriteBorder[1] * BorderOutTop) + (SpriteBorder[3] * BorderOutBtm) Local BorderScale#[4], BorderMaximum#[2], SizeScale#[2] BorderMaximum[0] = ((SpriteBorder[0] * -BorderOutLft) + (SpriteBorder[2] * -BorderOutRgt)) BorderMaximum[1] = ((SpriteBorder[1] * -BorderOutTop) + (SpriteBorder[3] * -BorderOutBtm)) If Width < BorderMaximum[0] Then SizeScale[0] = (Width / BorderMaximum[0]) SpriteBorder[0] = SpriteBorder[0] * SizeScale[0] SpriteBorder[2] = SpriteBorder[2] * SizeScale[0] RealWidth = 0 EndIf If Height < BorderMaximum[1] Then SizeScale[1] = (Height / BorderMaximum[1]) SpriteBorder[1] = SpriteBorder[1] * SizeScale[1] SpriteBorder[3] = SpriteBorder[3] * SizeScale[1] RealHeight = 0 EndIf Local RealX# = X - (SpriteBorder[0] * BorderOutLft) Local RealY# = -(Y - (SpriteBorder[1] * BorderOutTop)) If ForceSingleH = 0 Then If RealWidth > 0 Then TileCountH = RealWidth / SpriteSize[0] Else TileCountH = 0 Else TileCountH = 1 EndIf If ForceSingleV = 0 Then If RealHeight > 0 Then TileCountV = RealHeight / SpriteSize[1] Else TileCountV = 0 Else TileCountV = 1 EndIf If PartialH = 1 Or RoundDownH = 0 Then TileCountH2 = Ceil(TileCountH) Else TileCountH2 = Floor(TileCountH) If PartialV = 1 Or RoundDownV = 0 Then TileCountV2 = Ceil(TileCountV) Else TileCountV2 = Floor(TileCountV) If PartialH = 1 Then TileWidth = (RealWidth / TileCountH) Else TileWidth = (RealWidth / TileCountH2) If PartialV = 1 Then TileHeight = (RealHeight / TileCountV) Else TileHeight = (RealHeight / TileCountV2) If (TileCountH2 < 0) Then TileCountH2 = 0 Else TileCountH2 = TileCountH2 - 1 If (TileCountV2 < 0) Then TileCountV2 = 0 Else TileCountV2 = TileCountV2 - 1 If PartialH = 1 Then TileHMult = TileCountH - TileCountH2 If PartialV = 1 Then TileVMult = TileCountV - TileCountV2 If SpriteBorder[1] > 0 Then If (BorderTop And BorderLft And SpriteBorder[0] > 0) Then TSprite_CreateQuad(Sprite\mSurface, RealX - SpriteBorder[0], RealX, RealY + SpriteBorder[1], RealY, 0, 0, Sprite\mOuterUV[0], Sprite\mInnerUV[0], Sprite\mOuterUV[1], Sprite\mInnerUV[1]) If (BorderTop And BorderRgt And SpriteBorder[2] > 0) Then TSprite_CreateQuad(Sprite\mSurface, RealX + RealWidth, RealX + RealWidth + SpriteBorder[2], RealY + SpriteBorder[1], RealY, Z, Z, Sprite\mInnerUV[2], Sprite\mOuterUV[2], Sprite\mOuterUV[1], Sprite\mInnerUV[1]) EndIf If SpriteBorder[3] > 0 Then If (BorderBtm And BorderLft And SpriteBorder[0] > 0) Then TSprite_CreateQuad(Sprite\mSurface, RealX - SpriteBorder[0], RealX, RealY - RealHeight, RealY - RealHeight - SpriteBorder[3], Z, Z, Sprite\mOuterUV[0], Sprite\mInnerUV[0], Sprite\mInnerUV[3], Sprite\mOuterUV[3]) If (BorderBtm And BorderRgt And SpriteBorder[2] > 0) Then TSprite_CreateQuad(Sprite\mSurface, RealX + RealWidth, RealX + RealWidth + SpriteBorder[2], RealY - RealHeight, RealY - RealHeight - SpriteBorder[1], Z, Z, Sprite\mInnerUV[2], Sprite\mOuterUV[2], Sprite\mInnerUV[3], Sprite\mOuterUV[3]) EndIf For TileX% = 0 To TileCountH2 TileXPos = RealX + (TileX * TileWidth) TileXPosE = TileXPos + TileWidth TileUVLeft = Sprite\mInnerUV[0] TileUVRight = Sprite\mInnerUV[2] If PartialH And TileX = TileCountH2 Then TileXPosE = TileXPos + (TileWidth * TileHMult) If PartialCutH Then TileUVRight = (TileUVLeft * (1-TileHMult)) + (TileUVRight * TileHMult) EndIf For TileY% = 0 To TileCountV2 TileYPos = RealY - (TileY * TileHeight) TileYPosE = TileYPos - TileHeight TileUVTop = Sprite\mInnerUV[1] TileUVBottom = Sprite\mInnerUV[3] If PartialV And TileY = TileCountV2 Then TileYPosE = TileYPos - (TileHeight * TileVMult) If PartialCutV Then TileUVBottom = (TileUVTop * (1-TileVMult)) + (TileUVBottom * TileVMult) EndIf TSprite_CreateQuad(Sprite\mSurface, TileXPos, TileXPosE, TileYPos, TileYPosE, Z, Z, TileUVLeft, TileUVRight, TileUVTop, TileUVBottom) Next If (BorderTop) Then TSprite_CreateQuad(Sprite\mSurface, TileXPos, TileXPosE, RealY + SpriteBorder[1], RealY, Z, Z, TileUVLeft, TileUVRight, Sprite\mOuterUV[1], Sprite\mInnerUV[1]) If (BorderBtm) Then TSprite_CreateQuad(Sprite\mSurface, TileXPos, TileXPosE, RealY - RealHeight, RealY - RealHeight - SpriteBorder[3], Z, Z, TileUVLeft, TileUVRight, Sprite\mInnerUV[3], Sprite\mOuterUV[3]) Next For TileY% = 0 To TileCountV2 TileYPos = RealY - (TileY * TileHeight) TileYPosE = TileYPos - TileHeight TileUVTop = Sprite\mInnerUV[1] TileUVBottom = Sprite\mInnerUV[3] If PartialV And TileY = TileCountV2 Then TileYPosE = TileYPos - (TileHeight * TileVMult) If PartialCutV Then TileUVBottom = (TileUVTop * (1-TileVMult)) + (TileUVBottom * TileVMult) EndIf If (BorderLft) Then TSprite_CreateQuad(Sprite\mSurface, RealX - SpriteBorder[0], RealX, TileYPos, TileYPosE, Z, Z, Sprite\mOuterUV[0], Sprite\mInnerUV[0], TileUVTop, TileUVBottom) If (BorderRgt) Then TSprite_CreateQuad(Sprite\mSurface, RealX + RealWidth, RealX + RealWidth + SpriteBorder[2], TileYPos, TileYPosE, Z, Z, Sprite\mInnerUV[2], Sprite\mOuterUV[2], TileUVTop, TileUVBottom) Next EndIf End Function
Function TSprite_CreateQuad(Surface%, X0#, X1#, Y0#, Y1#, Z0#, Z1#, U0# = 0, U1# = 0, V0# = 0, V1# = 0, W0# = 0, W1# = 0, TurnOrder% = 0, ShareVertices% = True) Local TrisOut% = 0 Local vTL, vBL, vTR, vBR vTL = AddVertex(Surface, X0, Y0, Z0, U0, V0, W0) vTR = AddVertex(Surface, X1, Y0, (Z0+Z1)/2, U1, V0, (W0+W1)/2) vBL = AddVertex(Surface, X0, Y1, (Z0+Z1)/2, U0, V1, (W0+W1)/2) vBR = AddVertex(Surface, X1, Y1, Z1, U1, V1, W1) If ShareVertices Then If (TurnOrder) Then TrisOut = TrisOut + AddTriangle(Surface, vBL, vTL, vTR) Shl 16 TrisOut = TrisOut + AddTriangle(Surface, vBL, vTR, vBR) Else TrisOut = TrisOut + AddTriangle(Surface, vTL, vTR, vBR) Shl 16 TrisOut = TrisOut + AddTriangle(Surface, vTL, vBR, vBL) EndIf Else If TurnOrder Then Local vTR2, vBL2 vTR2 = AddVertex(Surface, X1, Y0, (Z0+Z1)/2, U1, V0, (W0+W1)/2) vBL2 = AddVertex(Surface, X0, Y1, (Z0+Z1)/2, U0, V1, (W0+W1)/2) TrisOut = TrisOut + AddTriangle(Surface, vBL, vTL, vTR) Shl 16 TrisOut = TrisOut + AddTriangle(Surface, vBL2, vTR2, vBR) Else Local vTL2, vBR2 vTL2 = AddVertex(Surface, X0, Y0, Z0, U0, V0, W0) vBR2 = AddVertex(Surface, X1, Y1, Z1, U1, V1, W1) TrisOut = TrisOut + AddTriangle(Surface, vTL, vTR, vBR) Shl 16 TrisOut = TrisOut + AddTriangle(Surface, vTL2, vBR2, vBL) EndIf EndIf Return TrisOut End Function
Function TSprite_CreateQuadEx(Surface%, X0#, X1#, Y0#, Y1#, Z0#, Z1#, U0# = 0, U1# = 0, V0# = 0, V1# = 0, W0# = 0, W1# = 0, ShareVertices% = True) Local vTL, vTR, vCC, vBL, vBR vTL = AddVertex(Surface, X0, Y0, Z0, U0, V0, W0) vTR = AddVertex(Surface, X1, Y0, (Z0+Z1)/2, U1, V0, (W0+W1)/2) vCC = AddVertex(Surface, (X0+X1)/2, (Y0+Y1)/2, (Z0+Z1)/2, (U0+U1)/2, (V0+V1)/2, (W0+W1)/2) vBL = AddVertex(Surface, X0, Y1, (Z0+Z1)/2, U0, V1, (W0+W1)/2) vBR = AddVertex(Surface, X1, Y1, Z1, U1, V1, W1) If ShareVertices Then AddTriangle(Surface, vTL, vTR, vCC) AddTriangle(Surface, vBL, vTL, vCC) AddTriangle(Surface, vTR, vBR, vCC) AddTriangle(Surface, vBL, vBR, vCC) Else Local vTL2, vTR2, vBL2, vBR2, vCC2, vCC3, vCC4 vTL2 = AddVertex(Surface, X0, Y0, Z0, U0, V0, W0) vTR2 = AddVertex(Surface, X1, Y0, (Z0+Z1)/2, U1, V0, (W0+W1)/2) vBL2 = AddVertex(Surface, X0, Y1, (Z0+Z1)/2, U0, V1, (W0+W1)/2) vBR2 = AddVertex(Surface, X1, Y1, Z1, U1, V1, W1) vCC2 = AddVertex(Surface, (X0+X1)/2, (Y0+Y1)/2, (Z0+Z1)/2, (U0+U1)/2, (V0+V1)/2, (W0+W1)/2) vCC3 = AddVertex(Surface, (X0+X1)/2, (Y0+Y1)/2, (Z0+Z1)/2, (U0+U1)/2, (V0+V1)/2, (W0+W1)/2) vCC4 = AddVertex(Surface, (X0+X1)/2, (Y0+Y1)/2, (Z0+Z1)/2, (U0+U1)/2, (V0+V1)/2, (W0+W1)/2) AddTriangle(Surface, vTL, vTR, vCC) AddTriangle(Surface, vBL, vTL2, vCC2) AddTriangle(Surface, vTR2, vBR, vCC3) AddTriangle(Surface, vBL2, vBR2, vCC4) EndIf End Function
Beispiel: (Vollbild-GUI)
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN]
Include "../Advanced Text (Library)/AdvText.bb"
Graphics3D 1280,720,32,2 SetBuffer BackBuffer()
Local FPlane = CreatePlane(16) RotateEntity FPlane, 270, 0, 0 PositionEntity FPlane, 0, 0, 256, True EntityColor FPlane, 128, 128, 128
Local BPlane = CreatePlane(16) RotateEntity BPlane, 90, 0, 0 PositionEntity BPlane, 0, 0, -256, True EntityColor BPlane, 0, 128, 190
Local LPlane = CreatePlane(16) RotateEntity LPlane, 90, 90, 0 PositionEntity LPlane, 256, 0, 0, True EntityColor LPlane, 0, 128, 190
Local RPlane = CreatePlane(16) RotateEntity RPlane, 90, 270, 0 PositionEntity RPlane, -256, 0, 0, True EntityColor RPlane, 0, 128, 190
Local DPlane = CreatePlane(16) RotateEntity DPlane, 0, 0, 0 PositionEntity DPlane, 0, -256, 0, True EntityColor DPlane, 0, 128, 0
Local UPlane = CreatePlane(16) RotateEntity UPlane, 180, 0, 0 PositionEntity UPlane, 0, 256, 0, True EntityColor UPlane, 0, 128, 190
Local eCameraPitch# = 0 Local eCameraYaw# = 0 Local eCameraZoom# = 1 Local eCameraFOV# = 90.0 Local eCameraFOVValue# = Tan( eCameraFOV / 2.0 )
Local eCameraCenter = CreatePivot() Local eCamera = CreateCamera(eCameraCenter) Local eCameraLight = CreateLight(3, eCamera)
PositionEntity eCamera, 0, 0, -eCameraZoom, False CameraRange eCamera, 0.1, 1024 CameraZoom eCamera, 1.0 / eCameraFOVValue LightConeAngles eCameraLight, 10, 60 LightColor eCameraLight, 64, 128, 255
Global InvTex = LoadTexture("TiledSprite_Test01.fw.png", 1+2+8+16+32+256) Global InvBrush = CreateBrush(255.0, 255.0, 255.0) BrushTexture InvBrush, InvTex, 0, 0 BrushFX InvBrush, 1+4+8
Global InvMesh = CreateMesh(eCamera) PositionEntity InvMesh, 0, 0, 1 EntityFX InvMesh, 1+4+8
Local InvMeshScale# = (1 / (GraphicsWidth()/2.0)) * eCameraFOVValue ScaleEntity InvMesh, InvMeshScale, InvMeshScale, 1, True
Local InvFGSpriteBuilder.TSpriteBuilder = TSpriteBuilder_Create() TSpriteBuilder_Mesh(InvFGSpriteBuilder, InvMesh) TSpriteBuilder_Brush(InvFGSpriteBuilder, InvBrush) TSpriteBuilder_BrushSize(InvFGSpriteBuilder, 256, 256) TSpriteBuilder_Scale(InvFGSpriteBuilder, 0.5, 0.5) TSpriteBuilder_Padding(InvFGSpriteBuilder, 0, 0, 128, 128) TSpriteBuilder_Border(InvFGSpriteBuilder, 32, 32, 32, 32) TSpriteBuilder_BorderScale(InvFGSpriteBuilder, 0.5, 0.5) Local InvFGSprite.TSprite = TSprite_Create(InvFGSpriteBuilder)
Local InvGradientSpriteBuilder.TSpriteBuilder = TSpriteBuilder_Create() TSpriteBuilder_Mesh(InvGradientSpriteBuilder, InvMesh) TSpriteBuilder_Brush(InvGradientSpriteBuilder, InvBrush) TSpriteBuilder_BrushSize(InvGradientSpriteBuilder, 256, 256) TSpriteBuilder_Scale(InvGradientSpriteBuilder, 0.5, 0.5) TSpriteBuilder_Padding(InvGradientSpriteBuilder, 128, 128, 0, 0) TSpriteBuilder_Border(InvGradientSpriteBuilder, 32, 32, 32, 32) TSpriteBuilder_BorderScale(InvGradientSpriteBuilder, 0.5, 0.5) Local InvGradientSprite.TSprite = TSprite_Create(InvGradientSpriteBuilder)
Local GradientSpriteBuilder.TSpriteBuilder = TSpriteBuilder_Create() TSpriteBuilder_Mesh(GradientSpriteBuilder, InvMesh) TSpriteBuilder_Brush(GradientSpriteBuilder, InvBrush) TSpriteBuilder_BrushSize(GradientSpriteBuilder, 256, 256) TSpriteBuilder_Scale(GradientSpriteBuilder, 0.5, 0.5) TSpriteBuilder_Padding(GradientSpriteBuilder, 0, 128, 128, 0) TSpriteBuilder_Border(GradientSpriteBuilder, 32, 32, 32, 32) TSpriteBuilder_BorderScale(GradientSpriteBuilder, 0.5, 0.5) Local GradientSprite.TSprite = TSprite_Create(GradientSpriteBuilder)
Local InvBGSpriteBuilder.TSpriteBuilder = TSpriteBuilder_Create() TSpriteBuilder_Mesh(InvBGSpriteBuilder, InvMesh, 0, True) TSpriteBuilder_Brush(InvBGSpriteBuilder, InvBrush) TSpriteBuilder_BrushSize(InvBGSpriteBuilder, 256, 256) TSpriteBuilder_Scale(InvBGSpriteBuilder, 0.5, 0.5) TSpriteBuilder_Padding(InvBGSpriteBuilder, 128, 0, 0, 128) TSpriteBuilder_Border(InvBGSpriteBuilder, 16, 16, 16, 16) TSpriteBuilder_BorderScale(InvBGSpriteBuilder, 0.5, 0.5) Local InvBGSprite.TSprite = TSprite_Create(InvBGSpriteBuilder)
Global FPSTimer = CreateTimer(30) Local SpriteFillFlags = TSPRITE_BORDER_LFT + TSPRITE_BORDER_RGT + TSPRITE_BORDER_TOP + TSPRITE_BORDER_BTM Local X#=256,Y#=256,W#=128,H#=128, Change = True
While Not KeyHit(1) Local MsX = MouseX(), MsY = MouseY(), MsZ = MouseZ() Cls If Change = True Then TSprite_Fill(GradientSprite, -GraphicsWidth()/2 + X, -GraphicsHeight()/2 +Y, W, H, 0, SpriteFillFlags) TSprite_Fill(InvGradientSprite, -GraphicsWidth()/2 + X + 4, -GraphicsHeight()/2 +Y + 4, W - 8, H - 8, 0, SpriteFillFlags) Change = False EndIf WireFrame KeyDown(31) RenderWorld If MouseDown(1) If MouseHit(1) Then MoveMouse GraphicsWidth()/2, GraphicsHeight()/2 Else eCameraPitch = eCameraPitch + (MouseYSpeed()/4.0) eCameraYaw = eCameraYaw - (MouseXSpeed()/4.0) EndIf RotateEntity eCameraCenter, eCameraPitch, eCameraYaw, 0, True EndIf If MouseDown(2) If MouseHit(2) Then MoveMouse GraphicsWidth()/2, GraphicsHeight()/2 Else eCameraZoom = eCameraZoom + (MouseYSpeed()/4.0) + (MouseXSpeed()/4.0) If eCameraZoom < 1.0 Then eCameraZoom = 1.0 EndIf PositionEntity eCamera, 0, 0, -eCameraZoom, False EndIf If KeyDown(30) Then X = MsX Y = MsY Change = True EndIf If KeyDown(32) Then If MsX < X+8 Then X = MsX-8 If MsY < Y+8 Then Y = MsY-8 W = MsX - X H = MsY - Y If W < 16 Then W = 16 If H < 16 Then H = 16 Change = True EndIf If KeyHit(2) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_BORDER_LFT:Change = True If KeyHit(3) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_BORDER_RGT:Change = True If KeyHit(4) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_BORDER_TOP:Change = True If KeyHit(5) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_BORDER_BTM:Change = True If KeyHit(16) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_BORDEROUT_LFT:Change = True If KeyHit(17) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_BORDEROUT_RGT:Change = True If KeyHit(18) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_BORDEROUT_TOP:Change = True If KeyHit(19) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_BORDEROUT_BTM:Change = True If KeyHit(6) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_ROUNDDOWN_HORZ:Change = True If KeyHit(7) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_ROUNDDOWN_VERT:Change = True If KeyHit(20) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_PARTIAL_HORZ:Change = True If KeyHit(21) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_PARTIAL_VERT:Change = True If KeyHit(34) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_PARTIALCUT_HORZ:Change = True If KeyHit(35) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_PARTIALCUT_VERT:Change = True If KeyHit(47) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_FORCESINGLE_HORZ:Change = True If KeyHit(48) Then SpriteFillFlags = SpriteFillFlags Xor TSPRITE_FORCESINGLE_VERT:Change = True If KeyDown(57) Color 255,128,0 Rect X, Y, W, H, 0 Color 0,128,255 Rect X+8,Y+8,W-16,H-16,0 Color 255,255,255 EndIf Viewport X+8, Y+8, W-16, H-16 Local GUIText$ = "This simple technique allows you to fast transparent backgrounds." + Chr(10) GUIText = GUIText + "I saw this being used in Unity3D to reduce drawcalls made and " + Chr(10) GUIText = GUIText + "thought it would be a good idea to enhance it in a prototype " + Chr(10) GUIText = GUIText + "before i reimplement it using new features." + Chr(10) + Chr(10) GUIText = GUIText + "Maybe this is already used in Draw3D or will be integrated now." + Chr(10) GUIText = GUIText + "Doesn't matter to me, have fun with this piece of code!" + Chr(10) AdvText(X+8, Y+8, GUIText) Viewport 0, 0, GraphicsWidth(), GraphicsHeight() If KeyDown(59) Then Local HelpText$ = "Key Function Status" + Chr(10) HelpText = HelpText + "-------------------------------" + Chr(10) HelpText = HelpText + "LMB Move Camera: " + RSet(Int(eCameraPitch*10)/10.0, 8) + ", " + RSet(Int(eCameraYaw*10)/10.0, 8) + Chr(10) HelpText = HelpText + "RMB Zoom Camera: " + RSet(Int(eCameraZoom*10)/10.0, 8) + Chr(10) HelpText = HelpText + "Spc Show Boundaries" + Chr(10) HelpText = HelpText + "A Set Position" + Chr(10) HelpText = HelpText + "D Set Size" + Chr(10) HelpText = HelpText + "S Show Wireframe" + Chr(10) HelpText = HelpText + "1 Border-Lft: " If SpriteFillFlags And TSPRITE_BORDER_LFT Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "2 Border-Rgt: " If SpriteFillFlags And TSPRITE_BORDER_RGT Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "3 Border-Top: " If SpriteFillFlags And TSPRITE_BORDER_TOP Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "4 Border-Btm: " If SpriteFillFlags And TSPRITE_BORDER_BTM Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "Q BorderOut-Lft: " If SpriteFillFlags And TSPRITE_BORDEROUT_LFT Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "W BorderOut-Rgt: " If SpriteFillFlags And TSPRITE_BORDEROUT_RGT Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "E BorderOut-Top: " If SpriteFillFlags And TSPRITE_BORDEROUT_TOP Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "R BorderOut-Btm: " If SpriteFillFlags And TSPRITE_BORDEROUT_BTM Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "5 RoundDown-Horz: " If SpriteFillFlags And TSPRITE_ROUNDDOWN_HORZ Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "6 RoundDown-Vert: " If SpriteFillFlags And TSPRITE_ROUNDDOWN_VERT Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "T Partial-Horz: " If SpriteFillFlags And TSPRITE_PARTIAL_HORZ Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "Z Partial-Vert: " If SpriteFillFlags And TSPRITE_PARTIAL_VERT Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "G PartialCut-Horz: " If SpriteFillFlags And TSPRITE_PARTIALCUT_HORZ Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "H PartialCut-Vert: " If SpriteFillFlags And TSPRITE_PARTIALCUT_VERT Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "V ForceSingle-Horz: " If SpriteFillFlags And TSPRITE_FORCESINGLE_HORZ Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) HelpText = HelpText + "B ForceSingle-Vert: " If SpriteFillFlags And TSPRITE_FORCESINGLE_VERT Then HelpText = HelpText + "|f00FF00On|f-1-1-1" + Chr(10) Else HelpText = HelpText + "|fFF0000Off|f-1-1-1" + Chr(10) AdvText(10, 0, HelpText) Else Text 0, 0, "F1 to show Help" EndIf WaitTimer FPSTimer:Flip 0 Wend
|