BlitzTiles

Übersicht Sonstiges Projekte

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Wie findet Ihr BlitzTiles?
Super. Damit kann man Ziegenpisse in Benzin verwandeln 74% 74% 63 Stimmen
Prima. Genau danach habe ich seit langem gesucht 21% 21% 18 Stimmen
Geht so. Hab mir mehr davon versprochen. 4% 4% 4 Stimmen
Nicht doll. Hätte man viel besser machen können 0% 0% 0 Stimmen
Insgesamt 85 Stimmen
 

Krischan

Betreff: BlitzTiles

BeitragDo, Mai 21, 2009 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
user posted image

Ich stelle Euch hier mein Projekt "BlitzTiles" vor, welches aus dem mittlerweile eingestellten Projekt "TerraTiles" hervorgegangen ist. Vom Prinzip her ist es zwar noch dasselbe (grosse Outdoor 3D Landschaft, Charaktersteuerung, Tag/Nachwechsel), allerdings wurde alles von Grund auf neu designed und basiert nun auf einem Quadtree anstatt einem unoptimierten Mesh (sorry für den Doppelpost aber das ist was völlig neues hier).

Ich hebe hier noch einmal kurz die Features heraus:

Arrow Schulter-Perspektive und Freiflug-Modus
Arrow liest Terragen Höhenkarten mit 16bit Genauigkeit
Arrow realistische Grössendarstellung anhand der Terragen-Dateiskala
Arrow erzeugt ein aufgeteiltes, Quadtree-optimiertes Mesh mit nahtlosen Übergängen (benutzt QTS)
Arrow zerteilt eine grosse Textur und passt diese den kleineren Patches an
Arrow berechnet die Vertexnormalen aus der Terragenkarte
Arrow simuliert einen nahtlosen Tag/Nachtwechsel
Arrow animiertes Wasser / Ozean
Arrow bewegte und veränderliche Wolken
Arrow sternenklare Nacht mit Sternenflimmern
Arrow ansteigende Sonnenhelligkeit
Arrow Mondphasen
Arrow Inselmodus
Arrow Ladebalken
Arrow viele Einstellungen über INI Textfiles durchführbar
Arrow es ist kostenlos!

Mit im Paket sind drei Demokarten, an denen ich lange gefeilt habe und die diese Features ganz gut zeigen, ausserdem eine Hilfedatei im CHM-Format (Windows Hilfe) mit kompletter Dokumentation aller INI-Einstellungen und sämtlichen Media-Dateien sowie dem Sourcecode. Ausserdem beschreibe ich darin, wie man mit L3DT eigene Maps erstellen kann. Für interessierte habe ich den Source von TerraTiles noch hinzugefügt, dort sind noch ein paar nette Funktionen verbaut, die man auch so verwenden kann.

Hier die Screenshots der drei Karten:

user posted image

user posted image

user posted image

Man kann es für vielerlei Projekte verwenden, für Rollenspiele, Egoshooter oder einfach 3D-Spiele die "draussen" spielen. Sicherlich kann einiges noch optimiert werden aber ich stosse derzeit an die Grenzen meiner Fähigkeiten (doch es läuft schon sehr gut, im Schnitt mit 300-400FPS, teilweise auch 700-800). Wenn Ihr irgendetwas daran verbessern wollt oder könnt dann tut es, denn der Code ist frei da ich ihn unter einer modifizierten BSD-Lizenz veröffentlicht habe!

Eine Verbesserung wäre z.B. eine fraktale Subdivision auf dem Terrain um den Spieler herum, um noch mehr Terraindetails in dessen Nähe zu haben oder sogar Texture Splatting in diesem Bereich und das eigentliche BlitzTiles nur noch für mittlere bis weite Entfernungen zu verwenden. Oder ihr lasst es so wie es ist nehmt es gleich als Basis für euer eigenes Projekt.

Ich habe jetzt über einen Monat daran gesessen und immer noch das Gefühl, dass es noch nicht fertig ist. Allerdings wollte ich Euch nicht länger auf die Folter spannen. Das Thema "grosses Outdoor-Terrain" hat mich jetzt seit über zweieinhalb Jahren beschäftigt (seitdem ich mit Blitz3D angefangen habe) und das hier ist meine Ersatzlösung zum Thema "Blitzterrain". Ich hoffe, dass sie gelungen ist und Euch gefällt.

Und hier nun endlich der Download von Version 1.01 [7zip SFX Archiv, 17.7MB]: blitztiles101.exe

Bitte beachtet, dass Ihr noch zwei Zusatzkomponenten zum Betrieb von BlitzTiles benötigt, das liegt an einem Lizenzwechsel zwischen Version 1.00 und 1.01:

1) eole's QTS Quadtree Terrain System, von mir verändert (die qts.bb muss in den "inc" folder von BlitzTiles)
siehe http://www.blitzbasic.com/Comm...opic=84809 im Einstiegspost. oder hier direkt:

Als qts.bb in den Unterordner inc/ speichern
Code: [AUSKLAPPEN]
; -------------------------------------------------------------------------------------------------
; Project Title    : QTS : Quadtree Terrain System
; -------------------------------------------------------------------------------------------------
;
; Author        : Poursin Nicolas
; Email            : Nicolas.poursin(at)3dgametool.com
;
; Version        : 1.1.1         
; Date            : 23.05.2009
;
; -------------------------------------------------------------------------------------------------
;
; Updated by Krischan on 23.05.2009 for use with "BlitzTiles"
;
; - cleaned out unnecessary functions
; - fixed some errors
; - added Terragen loader
; - added tilebased UV-Coordinates, Vertexcolors and Vertexnormals calculation
;
; -------------------------------------------------------------------------------------------------


; -------------------------------------------------------------------------------------------------
; Terms of Use License
; -------------------------------------------------------------------------------------------------
;
; This is a legal agreement ("License Agreement") between you And Poursin Nicolas.
;
;    You are permitted To:
;   - Create For free or commercial games
;   - Free Tool
;     
;    You are Not permitted To:
;    1) Sell, resell it
;    2) Use it, in commercial tool
;    3) Modify the products And sell it                   
;
; -------------------------------------------------------------------------------------------------


; -------------------------------------------------------------------------------------------------
; Types
; -------------------------------------------------------------------------------------------------
Type QTS_TPatch
   
    Field mesh%
    Field surf%
    Field x#
    Field y#
    Field z#
    Field xtab%
    Field ztab%
   
End Type


; -------------------------------------------------------------------------------------------------
; Globals
; -------------------------------------------------------------------------------------------------
Global QTS_Terrain%,QTS_QuadTree%,QTS_HeightMap%,QTS_Vertex%,QTS_Tile%,QTS_BlockSize%
Global QTS_Size%,QTS_XPTS%,QTS_XSCALE#,QTS_YSCALE#,QTS_HSCALE#,QTS_HBASE#
Global QTS_MinHeight#,QTS_MaxHeight#,QTS_HeightMapSize%


; -------------------------------------------------------------------------------------------------
; Initial Function
; -------------------------------------------------------------------------------------------------
Function QTS_CreateTerrain(filename$,tiles%,edgeerror#,calcnormals%,normalsfactor#,switchnormals%,usevertexcolors%,vertexintensity#,colormap%)
   
    QTS_LoadHeightMap(filename)
    QTS_BlockSize=(QTS_HeightMapSize-1)/16/tiles
    QTS_Terrain=CreateMesh()
    QTS_Tile=CreateBank(64*64*4)
    QTS_Roughness(edgeerror)
    QTS_CreatePatch(QTS_BlockSize)
    QTS_Texture(tiles,calcnormals,normalsfactor,switchnormals,usevertexcolors,vertexintensity,colormap)
   
    FreeBank QTS_QuadTree
    FreeBank QTS_HeightMap
    FreeBank QTS_Vertex
   
End Function


; -------------------------------------------------------------------------------------------------
; Terrain Roughness
; -------------------------------------------------------------------------------------------------
Function QTS_Roughness(error#=1.0)
   
    Local edgelength%=3,morph#
    Local x%,z%,node%,kill%
    Local edgeoffset%,childoffset%
   
    While edgelength<=17
       
        edgeoffset=(edgelength-1)/2
        childoffset=(edgelength-1)/4
       
        z=edgeoffset
       
        While z<QTS_HeightMapSize
           
            If edgelength=3 Then BT_UpdateBar("Calculating Quadtree",z,QTS_HeightMapSize,10,40)
           
            x= edgeoffset
            While x<QTS_HeightMapSize
               
                node = 0
                kill=0
               
                If edgelength>3 Then
                    node=QTS_GetMV(x-childoffset,z-childoffset)
                    node=QTS_Max(node,QTS_GetMV(x+childoffset,z-childoffset))
                    node=QTS_Max(node,QTS_GetMV(x+childoffset,z+childoffset))
                    node=QTS_Max(node,QTS_GetMV(x-childoffset,z+childoffset))
                EndIf
               
                If edgelength=3 Or node=0 Then
                   
                    QTS_SetMV(x-edgeoffset,z-edgeoffset,1)
                    QTS_SetMV(x+edgeoffset,z-edgeoffset,1)
                    QTS_SetMV(x+edgeoffset,z+edgeoffset,1)
                    QTS_SetMV(x-edgeoffset,z+edgeoffset,1)
                   
                    morph=Abs(QTS_GetHeight(x,z-edgeoffset)-((QTS_GetHeight(x-edgeoffset,z-edgeoffset)+QTS_GetHeight(x+edgeoffset,z-edgeoffset))/2))
                   
                    If morph>error Then
                        QTS_SetMV(x,z-edgeoffset,1)
                    Else
                        If edgelength>3 Then QTS_SetMV(x,z-edgeoffset,0)
                        kill=kill +1
                    EndIf
                   
                    morph=Abs(QTS_GetHeight(x+edgeoffset,z)-((QTS_GetHeight(x+edgeoffset,z-edgeoffset)+QTS_GetHeight(x+edgeoffset,z+edgeoffset))/2))
                   
                    If morph>error Then
                        QTS_SetMV(x+edgeoffset,z,1)
                    Else
                        If edgelength>3 Then QTS_SetMV(x+edgeoffset,z,0)
                        kill=kill +1
                    EndIf
                   
                    morph=Abs(QTS_GetHeight(x,z+edgeoffset)-((QTS_GetHeight(x+edgeoffset,z+edgeoffset)+QTS_GetHeight(x-edgeoffset,z+edgeoffset))/2))
                   
                    If morph>error Then
                        QTS_SetMV(x,z+edgeoffset,1)
                    Else
                        If edgelength>3 Then QTS_SetMV(x,z+edgeoffset,0)
                        kill=kill+1
                    EndIf                   
                   
                    morph=Abs(QTS_GetHeight(x-edgeoffset,z)-((QTS_GetHeight(x-edgeoffset,z+edgeoffset)+QTS_GetHeight(x-edgeoffset,z-edgeoffset))/2))
                   
                    If morph>error Then
                        QTS_SetMV(x-edgeoffset,z,1)
                    Else
                        If edgelength>3 Then QTS_SetMV(x-edgeoffset,z,0)
                        kill = kill +1
                    EndIf
                   
                    QTS_SetMV(x,z,1)
                   
                    If kill=4 Then   
                        morph=Abs(QTS_GetHeight(x,z)-((QTS_GetHeight(x-edgeoffset,z-edgeoffset)+QTS_GetHeight(x+edgeoffset,z+edgeoffset))/2))
                        If morph<=error Then
                            morph=Abs(QTS_GetHeight(x,z)-((QTS_GetHeight(x+edgeoffset,z-edgeoffset)+QTS_GetHeight(x-edgeoffset,z+edgeoffset))/2))
                            If morph<=error Then QTS_SetMV(x,z,0)
                        EndIf
                    EndIf
                   
                Else If edgelength>3
                   
                    QTS_SetMV(x,z-edgeoffset,1)
                    QTS_SetMV(x+edgeoffset,z,1)
                    QTS_SetMV(x,z+edgeoffset,1)
                    QTS_SetMV(x-edgeoffset,z,1)   
                   
                EndIf
               
                x=x+edgelength-1
               
            Wend
           
            z=z+edgelength-1
           
        Wend
       
        edgelength=(edgelength Shl 1 )-1
       
    Wend
   
    For z=16 To QTS_HeightMapSize-1 Step 32
        For x=16 To QTS_HeightMapSize-1 Step 32
            QTS_ProcessNode(x,z,33,False,False)
        Next
    Next
   
End Function


; -------------------------------------------------------------------------------------------------
; Renders a node
; -------------------------------------------------------------------------------------------------
Function QTS_RenderNode(x%,z%,edgelength%,edgeoffset%,surf%,brender%)
   
    Local VC%,V1%,V2%,VE%
    Local xx%,xstart%,xend%
    Local zz%,zstart%,zend%
   
    If brender Then
        VC = QTS_AddVertex( x,z,surf)
        V1 = QTS_AddVertex( x-edgeoffset , z-edgeoffset ,surf)
        VE = QTS_AddVertex( x+edgeoffset , z-edgeoffset , surf)
    Else
        QTS_SetMV( x-edgeoffset , z-edgeoffset)
        QTS_SetMV( x+edgeoffset , z-edgeoffset )
    EndIf
   
    zz=z-edgeoffset
    xstart=x-edgeoffset+1
    xend=x-edgeoffset+edgelength-2
   
    For xx=xstart To xend
       
        If QTS_GetMV(xx,zz)>0 Then
           
            If brender Then
                V2=QTS_AddVertex(xx,zz,surf)
                AddTriangle surf,V1,V2,VC
            Else
                QTS_SetMV(xx,zz)
            EndIf
           
            V1=V2
           
        EndIf
       
    Next
   
    If brender Then
        AddTriangle surf,V1,VE,VC
        VC=QTS_AddVertex(x,z,surf)
        V1=QTS_AddVertex(x-edgeoffset,z+edgeoffset,surf)
        VE=QTS_AddVertex(x+edgeoffset,z+edgeoffset,surf)
    Else
        QTS_SetMV(x-edgeoffset,z+edgeoffset)
        QTS_SetMV(x+edgeoffset,z+edgeoffset)
    EndIf
   
    zz=z+edgeoffset
    xstart=x-edgeoffset+1
    xend=x-edgeoffset+edgelength-2
   
    For xx=xstart To xend
       
        If QTS_GetMV(xx,zz)>0 Then
           
            If brender Then
                V2=QTS_AddVertex(xx,zz,surf)
                AddTriangle surf,V2,V1,VC
            Else
                QTS_SetMV(xx,zz)
            EndIf
           
            V1=V2
           
        EndIf
       
    Next
   
    If brender Then
        AddTriangle surf,VE,V1,VC
        VC=QTS_AddVertex(x,z,surf)
        V1=QTS_AddVertex(x+edgeoffset,z-edgeoffset,surf)
        VE=QTS_AddVertex(x+edgeoffset,z+edgeoffset,surf)
    Else
        QTS_SetMV(x+edgeoffset,z-edgeoffset)
        QTS_SetMV(x+edgeoffset,z+edgeoffset)
    EndIf
   
    xx=x+edgeoffset
    zstart=z-edgeoffset+1
    zend=z-edgeoffset+edgelength-2
   
    For zz=zstart To zend
       
        If QTS_GetMV(xx,zz)>0 Then
           
            If brender Then
                V2=QTS_AddVertex(xx,zz,surf)
                AddTriangle surf,V1,V2,VC
            Else
                QTS_SetMV(xx,zz)
            EndIf
           
            V1=V2
           
        EndIf
       
    Next
   
    If brender Then
        AddTriangle surf,V1,VE,VC
        VC=QTS_AddVertex(x,z,surf)
        V1=QTS_AddVertex(x-edgeoffset,z-edgeoffset,surf)
        VE=QTS_AddVertex(x-edgeoffset,z+edgeoffset,surf)
    Else
        QTS_SetMV(x-edgeoffset,z-edgeoffset)
        QTS_SetMV(x-edgeoffset,z+edgeoffset)
    EndIf
   
    xx=x-edgeoffset
    zstart=z-edgeoffset+1
    zend=z-edgeoffset+edgelength-2
   
    For zz=zstart To zend
       
        If QTS_GetMV(xx,zz)>0 Then
           
            If brender Then
                V2=QTS_AddVertex(xx,zz,surf)
                AddTriangle surf,V2,V1,VC
            Else
                QTS_SetMV(xx,zz)
            EndIf
           
            V1=V2
           
        EndIf
       
    Next
   
    If brender Then AddTriangle surf,VE,V1,VC
   
End Function


; -------------------------------------------------------------------------------------------------
; Creates a Tile patch
; -------------------------------------------------------------------------------------------------
Function QTS_CreatePatch(blocksize%)
   
    Local x%,z%
    Local xtab%,ztab%
    Local xx#,zz#
    Local mesh%,surf%
    Local bx%,bz%,cx%,cz%
   
    While z<=QTS_HeightMapSize
       
        BT_UpdateBar("Creating Terrain Patches",z,QTS_HeightMapSize,40,50)
       
        x=0
        xtab=0
       
        While x<=QTS_HeightMapSize
           
            xx=x+(blocksize*16/2)
            zz=z+(blocksize*16/2)
           
            mesh=CreateMesh()
            surf=CreateSurface(mesh)
           
            ; make tile pickable
            EntityPickMode mesh,2
           
            QTS_Vertex=CreateBank((QTS_HeightMapSize)*(QTS_HeightMapSize)*4)
           
            For bz=8 To blocksize*16 Step 16
               
                For bx=8 To blocksize*16 Step 16
                   
                    cx=x+bx
                    cz=z+bz
                    If cx<QTS_HeightMapSize And cz<QTS_HeightMapSize Then QTS_ProcessNode(cx,cz,17,surf,True)
                   
                Next
               
            Next
           
            FreeBank QTS_Vertex
           
            EntityParent mesh,QTS_Terrain
           
            t.QTS_TPatch = New QTS_TPatch
            t\mesh=mesh
            t\surf=surf
            t\x=xtab*(blocksize*16/2)*2
            t\y=MeshHeight(mesh)/2
            t\z=-ztab*(blocksize*16/2)*2
             t\xtab=xtab
            t\ztab=ztab
           
            PokeInt QTS_Tile,((ztab*64+xtab)*4),Handle(t)
           
            x=x+(blocksize*16)
           
            xtab=xtab+1
           
        Wend
       
        z=z+(blocksize*16)
        ztab=ztab+1
       
    Wend
   
End Function


; -------------------------------------------------------------------------------------------------
; Processes a Node
; -------------------------------------------------------------------------------------------------
Function QTS_ProcessNode(x,z,edgelength%,surf%,brender%)
   
    Local edgeoffset%=(edgelength-1)/2
    Local childoffset=(edgelength-1)/4
    Local node%=QTS_GetMV(x,z)
   
    If node=1 Then
       
        If  edgelength=3 Then
           
            QTS_RenderNode(x,z,edgelength,edgeoffset,surf,brender)
           
        Else
           
            If QTS_GetMV(x-childoffset,z-childoffset)>0 Then
               
                QTS_ProcessNode(x-childoffset,z-childoffset,edgelength-(edgelength/2),surf,brender)
               
            Else
               
                QTS_RenderNode(x-childoffset,z-childoffset,edgelength-(edgelength/2),edgeoffset-(edgeoffset/2),surf,brender)
               
            EndIf
           
            If QTS_GetMV(x+childoffset,z-childoffset)>0 Then
               
                QTS_ProcessNode(x+childoffset,z-childoffset,edgelength-(edgelength/2),surf,brender)
               
            Else
               
                QTS_RenderNode(x+childoffset,z-childoffset,edgelength-(edgelength/2),edgeoffset-(edgeoffset/2),surf,brender)
               
            EndIf
           
            If QTS_GetMV(x-childoffset,z+childoffset)>0 Then
               
                QTS_ProcessNode(x-childoffset,z+childoffset,edgelength-(edgelength/2),surf,brender)
               
            Else
               
                QTS_RenderNode(x-childoffset,z+childoffset,edgelength-(edgelength/2),edgeoffset-(edgeoffset/2),surf,brender)
               
            EndIf
           
            If QTS_GetMV(x+childoffset,z+childoffset)>0 Then
               
                QTS_ProcessNode(x+childoffset,z+childoffset,edgelength-(edgelength/2),surf,brender)
               
            Else
               
                QTS_RenderNode(x+childoffset,z+childoffset,edgelength-(edgelength/2),edgeoffset-(edgeoffset/2),surf,brender)
               
            EndIf
           
        EndIf
       
    Else
       
        QTS_RenderNode(x,z,edgelength,edgeoffset,surf,brender)
       
    EndIf
   
End Function


; -------------------------------------------------------------------------------------------------
; Central Addvertex function
; -------------------------------------------------------------------------------------------------
Function QTS_AddVertex(x%,z%,surf%)
   
    Local y#,v%
   
    If PeekInt(QTS_Vertex,QTS_MatrixIndex(x,z)*4)=0 Then
       
        y=QTS_GetHeight(x,z)
        v=AddVertex(surf,(-QTS_HeightMapSize/2.0)+x,y,(QTS_HeightMapSize/2.0)-z,0,0)
        PokeInt QTS_Vertex, QTS_MatrixIndex(x,z)*4,v+1
       
    Else
       
        v=PeekInt(QTS_Vertex,QTS_MatrixIndex(x,z)*4)-1
       
    EndIf
   
    Return v
   
End Function


; -------------------------------------------------------------------------------------------------
; Loads a Terragen File and its according RAW Colormap / Normalmap
; -------------------------------------------------------------------------------------------------
Function QTS_LoadHeightMap(filename$)
   
    Local xpt%,ypt%,h#
    Local file%=ReadFile(filename)
   
    ; read Terragen data
    SeekFile(file,20) : QTS_Size=ReadInt(file)
    SeekFile(file,28) : QTS_XPTS=ReadInt(file)
    SeekFile(file,44) : QTS_XSCALE=ReadFloat(file) : QTS_YSCALE=ReadFloat(file)
    SeekFile(file,60) : QTS_HSCALE=ReadShort(file) : QTS_HBASE=ReadShort(file)
   
    ; get the size of the map and create heightmap and quadtree banks
    QTS_HeightMapSize=QTS_XPTS
    QTS_HeightMap=CreateBank(QTS_XPTS*QTS_XPTS*2)
    QTS_QuadTree=CreateBank((QTS_HeightMapSize)*(QTS_HeightMapSize))
   
    ; write data to bank
    For ypt=QTS_XPTS To 1 Step -1
       
        If ypt Mod 32=0 Then BT_UpdateBar("Loading Terragen Data",(QTS_XPTS-ypt+1),QTS_XPTS,0,10)
       
        For xpt=1 To QTS_XPTS Step 1
            PokeShort QTS_HeightMap,((xpt-1)+(ypt-1)*QTS_XPTS)*2,ReadShort(file)-32768
            h=QTS_GetHeight(xpt-1,ypt-1)
            If h<QTS_MinHeight Then QTS_MinHeight=h
            If h>QTS_MaxHeight Then QTS_MaxHeight=h
        Next
    Next
   
    CloseFile(file)
   
End Function


; -------------------------------------------------------------------------------------------------
; Prepares UV-Coordinates, Vertexcolors and Vertexnormals of a tile
; -------------------------------------------------------------------------------------------------
Function QTS_Texture(tiles%,calcnormals%,normalsfactor#,switchnormals%,usevertexcolors%,vertexintensity#,colormap%)
   
    Local x%,z%,obj%,vx#,vz#
    Local surf%,vertices%,v%,rgb%,r%,g%,b%
    Local cbuf%=ImageBuffer(colormap)
    Local cfactor#=ImageWidth(colormap)*1.0/QTS_HeightMapSize
   
    LockBuffer cbuf
   
    For z=0 To tiles-1
       
        If z Mod 2=0 Then BT_UpdateBar("Calculating Vertex Normals",z,tiles-1,50,70)
       
        For x=0 To tiles-1
           
            obj=PeekInt(QTS_Tile,(z*64+x)*4)
           
            If obj>0 Then
               
                t.QTS_TPatch=Object.QTS_TPatch(obj)
               
                If t\mesh<>-1 Then
                   
                    surf = GetSurface(t\mesh,1)
                    vertices = CountVertices(surf)
                   
                    For v=0 To vertices-1
                       
                        ; calculate map position from vertex position
                        vx=VertexX(surf,v)+(QTS_HeightMapSize/2.0)
                        vz=-VertexZ(surf,v)+(QTS_HeightMapSize/2.0)
                       
                        ; Calculate Vertexcolors
                        If usevertexcolors Then
                            rgb=ReadPixelFast(Int(Floor(vx*cfactor)),Int(Floor(vz*cfactor)),cbuf)
                            r=Int(Floor(((rgb And $ff0000)/$10000)*vertexintensity))
                            g=Int(Floor(((rgb And $ff00)/$100)*vertexintensity))
                            b=Int(Floor(((rgb And $ff))*vertexintensity))
                        Else
                            r=255*vertexintensity
                            g=255*vertexintensity
                            b=255*vertexintensity
                        EndIf
                        r=Int(Floor(r)) : If r<0 Then r=0 Else If r>255 Then r=255
                        g=Int(Floor(g)) : If g<0 Then g=0 Else If g>255 Then g=255
                        b=Int(Floor(b)) : If b<0 Then b=0 Else If b>255 Then b=255
                       
                        ; Color the vertex
                        VertexColor surf,v,r,g,b,1
                       
                        ; calculate Normals by height and vertex
                        If calcnormals Then QTS_CalcNormal(surf,v,vx,vz,normalsfactor,switchnormals)
                       
                        ; Calculate UV-Coordinates
                        vx#=(vx/((QTS_HeightMapSize-1*1.0)/tiles))-t\xtab
                        vz#=(vz/((QTS_HeightMapSize-1*1.0)/tiles))-t\ztab
                        VertexTexCoords surf,v,vx,vz
                       
                    Next
                   
                EndIf
               
            EndIf
           
        Next
       
    Next
   
    UnlockBuffer cbuf
   
End Function


; -----------------------------------------------------------------------------
; Calculates the Vertex Normal at a given position
; -----------------------------------------------------------------------------
Function QTS_CalcNormal(surf%,v%,x%,y%,normalsfactor#,switchnormals%)
   
    Local xm1%,xp1%,ym1%,yp1%
    Local tl%,tm%,tr%,ml%,mm%,mr%,bl%,bm%,br%
    Local vx#,vy#,vz#
    Local isq2#,sum#
    Local al#,ar#,at#,ab#
    Local m#
   
    ; limit heightmap
    If x>0 Then xm1=x-1 Else xm1=0
    If x<QTS_HeightMapSize-1 Then xp1=x+1 Else xp1=QTS_HeightMapSize-1
    If y>0 Then ym1=y-1 Else ym1=0
    If y<QTS_HeightMapSize-1 Then yp1=y+1 Else yp1=QTS_HeightMapSize-1
   
    ; get the middle and the surrounding heights
    tl=QTS_Normalize(QTS_GetHeight(xm1,ym1),QTS_MinHeight,QTS_MaxHeight,0,65535)
    tm=QTS_Normalize(QTS_GetHeight(x  ,ym1),QTS_MinHeight,QTS_MaxHeight,0,65535)
    tr=QTS_Normalize(QTS_GetHeight(xp1,ym1),QTS_MinHeight,QTS_MaxHeight,0,65535)
    ml=QTS_Normalize(QTS_GetHeight(xm1,y  ),QTS_MinHeight,QTS_MaxHeight,0,65535)
    mm=QTS_Normalize(QTS_GetHeight(x  ,y  ),QTS_MinHeight,QTS_MaxHeight,0,65535)
    mr=QTS_Normalize(QTS_GetHeight(xp1,y  ),QTS_MinHeight,QTS_MaxHeight,0,65535)
    bl=QTS_Normalize(QTS_GetHeight(xm1,yp1),QTS_MinHeight,QTS_MaxHeight,0,65535)
    bm=QTS_Normalize(QTS_GetHeight(x  ,yp1),QTS_MinHeight,QTS_MaxHeight,0,65535)
    br=QTS_Normalize(QTS_GetHeight(xp1,yp1),QTS_MinHeight,QTS_MaxHeight,0,65535)
   
    vx=0.0
    vy=0.0
    vz=1.0
   
    isq2=1.0/Sqr(2.0)
    sum=1.0+isq2+isq2
   
    al=(tl*isq2+ml+bl*isq2)/sum
    ar=(tr*isq2+mr+br*isq2)/sum
    at=(tl*isq2+tm+tr*isq2)/sum
    ab=(bl*isq2+bm+br*isq2)/sum
   
    vx=(al-ar)/(65535.0)
    vy=(at-ab)/(65535.0)
   
    m=QTS_Max(0,vx*vx+vy*vy)
    m=QTS_Min(m,1.0)
   
    vz=Sqr(1.0-m)
   
    If normalsfactor<>0.0
        vz=vz/normalsfactor
        m#=Sqr(vx*vx+vy*vy+vz*vz)
        vx=vx/m
        vy=vy/m
        vz=vz/m
    EndIf
   
    If switchnormals Then VertexNormal surf,v,vx,vz,vy Else VertexNormal surf,v,vx,vy,vz
   
End Function


; -----------------------------------------------------------------------------
; Normalize a value
; -----------------------------------------------------------------------------
Function QTS_Normalize#(value#=128.0,value_min#=0.0,value_max#=255.0,norm_min#=0.0,norm_max#=1.0)
   
    Return ((value#-value_min#)/(value_max#-value_min#))*(norm_max#-norm_min#)+norm_min#
   
End Function


; -------------------------------------------------------------------------------------------------
; Gets a Matrix Value
; -------------------------------------------------------------------------------------------------
Function QTS_GetMV(x%,z%)
   
    Return PeekByte(QTS_QuadTree,QTS_MatrixIndex(x,z))
   
End Function


; -------------------------------------------------------------------------------------------------
; Sets a Matrix Value
; -------------------------------------------------------------------------------------------------
Function QTS_SetMV(x%,z%,value%=1)
   
    PokeByte QTS_QuadTree,QTS_MatrixIndex(x,z),value
   
End Function


; -------------------------------------------------------------------------------------------------
; Gets a Matrix Index
; -------------------------------------------------------------------------------------------------
Function QTS_MatrixIndex(x%,z%)
   
    Return ((z*QTS_HeightMapSize)+x)
   
End Function


; -------------------------------------------------------------------------------------------------
; Returns the minimum value of two values
; -------------------------------------------------------------------------------------------------
Function QTS_Min#(v1#,v2#)
   
    If v1<v2 Then Return v1 Else Return v2
   
End Function


; -------------------------------------------------------------------------------------------------
; Returns the maximum value of two values
; -------------------------------------------------------------------------------------------------
Function QTS_Max#(v1#,v2#)
   
    If v1>v2 Then Return v1 Else Return v2
   
End Function


; -------------------------------------------------------------------------------------------------
; Calculates the exact height at a given position
; -------------------------------------------------------------------------------------------------
Function QTS_GetHeight#(x#,z#)
   
    Local short%=PeekShort(QTS_HeightMap,((Int(Floor(z*QTS_HeightMapSize)))+Int(Floor(x)))*2)-32768
    Return QTS_HBASE+short*QTS_HSCALE/65536.0*QTS_YSCALE
   
End Function


2) Das 3D Zwerg Modell von "psionic", einfach das ZIP-File in den "models" Ordner von BlitzTiles extrahieren:
http://www.psionic3d.co.uk/wp-.../dwarf.zip



EDIT 15.01.2010: hab noch vergessen eine weitere Map hier einzutragen, der Grand Canyon. Einfach in den maps/ Ordner entpacken und einbinden, Download durch Klick auf das Bild:

user posted image
  • Zuletzt bearbeitet von Krischan am Di, Dez 07, 2010 18:38, insgesamt 5-mal bearbeitet

d-bug

BeitragDo, Mai 21, 2009 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Obwohl ich es total nicht gebrauchen kann, da ich weder viel mit 3D am Hut habe, noch mit Windows, bekommst du alleine schon für "Super. Damit kann man Ziegenpisse in Benzin verwandeln" eine Stimme, weil der Spruch mich zum lachen gebracht hat!

Goodjee

BeitragDo, Mai 21, 2009 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
die weitsicht ist genial, die details in der ferne, das terrain in der ferne, die tageszeiten sowieso, nur wenn man zu seinen füßen guckt ist es rigendwie zu eckig. vllt kann man da einfach ein paar triangles interpolieren in kameranähe. Dann ist es perfekt Wink
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Geeecko

BeitragDo, Mai 21, 2009 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finds klasse!
Und ich muss mich meinem Vorredner anschließen.
Die Weitsicht ist geil!
Ich habe zuerst gedacht, da gehört etwas nicht mehr zum Terrain. Dann bin ich gefühlte 3 Tage gelaufen und dann war ich da Smile. Genial.
Mach weiter!

lg MD
....
 

vanjolo

BeitragDo, Mai 21, 2009 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist einfach nur "unbelivable" Very Happy

Danke.
***************************
in Entwicklung:
Tank Battles - Panzeraction
Pacific Battles - Rundenstrategie
abgeschlossenes Projekt: Harrier Assault

Xaymar

ehemals "Cgamer"

BeitragDo, Mai 21, 2009 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein erster gedanke war:
ach ist ja nur nen mesh terrain mit skybox.

wunderte mich dann 1 stunde süäter wnn ich an der skybox ankomme^^

einfach genial...
mit interpolation(es wirkt manchmal zu eckig) wäre es ideal für spiele mit "endlos" terrain
Warbseite
 

mkorth

BeitragFr, Mai 22, 2009 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich finde es prima und kann es sicherlich auch brauchen:)

Top Smile

TrikkieMikkie

BeitragFr, Mai 22, 2009 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr gelungen und ausbaufähig (Pflanzen etc.)!

Etwas gestört hat mich die "schwammige" Steuerung im Freeflight-Mode.

Wie sieht es mit Antialias/Multisampling aus?
Ist das in Blitz3D bzw. deinem Prog implementiert?

Beim Versuch, eine Auflösung von 2960x1050 (DualMon) für eine Panorama-Tour einzustellen trat ein Fehler auf. Sad
(Unable to set graphics mode)

Gabs da nicht mal 'ne Begrenzung in Blitz3D?
Oder wars bei Gamestudio? Smile

Nicdel

BeitragFr, Mai 22, 2009 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Fehler tritt auf, wenn dein Bildschrim oder deine Grafikkarte die Auflösung nicht unterstützen.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

TrikkieMikkie

BeitragFr, Mai 22, 2009 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hätte es nicht gepostet, wenn ich nicht genau wüsste, dass sie es können.
GeForce 9800GTX, 2 TFT 1680x1050, 1280x1024

skey-z

BeitragFr, Mai 22, 2009 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn ich mir deinen 2. Monitor anschaue, kann es auch nicht funktionieren (1050<>1024)
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

TrikkieMikkie

BeitragFr, Mai 22, 2009 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Das spielt keine Geige. Wink
Bei anderen Anwendungen (auch meinen eigenen DX-basierten) funktionierts ja auch.
Wird ein Teil des Backbuffers einfach abgeschnitten bzw. nicht angezeigt.

Nicdel

BeitragFr, Mai 22, 2009 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht kann BB das nicht...
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

Krischan

BeitragSa, Mai 23, 2009 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Kurze Info: ich habe den Download erst einmal vom Netz genommen, da ich beabsichtige, Änderungen an den Lizenzbestimmungen vorzunehmen.

Meine Entscheidung die GPL-Lizenz für BlitzTiles zu nehmen stiess nicht gerade auf Gegenliebe in der englischen BlitzBasic-Community, gelinde gesagt. Ich habe mich daher entschieden, eine weniger restriktive Lizenz zu verwenden, bin mir aber nicht sicher, wie ich darin mit derzeit im Paket enthaltenen Teilen anderer Organisationen / Personen und deren Lizenzbestimmungen verfahren soll.

So ein Sch... kann einem den ganzen Spass am Programmieren verderben, sag ich euch...


Zu der hohen Auflösung: ich habe es nur mal an meinem "dicken" Notebook ausprobiert und da lief es noch mit 1920x1200, Dual Monitor kann ich nicht testen. Ich würde jetzt aber auch mal auf BB tippen...

CypressArt

BeitragSa, Mai 23, 2009 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Na, ich hoffe es klappt mit dem Lizenzierungsmodel!
Will das Teil!! Laughing
(no comment) -> Google Search Bot!!

ozzi789

BeitragSa, Mai 23, 2009 11:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Also zur DualMontior geschichte, bei 3200x1080 bekomm ich nen Unable 2 create 3d scene
Aber welches Game unterstütz schon so was exotisches? Very Happy
1920x1080 funktioniert jedoch problemslos(auch über 2 bildschirme)

Viel glück noch mit der Lizenz geschichte!
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Krischan

BeitragSa, Mai 23, 2009 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
So Mädels, ich habe das Paket nun verändert. Es wird nun unter einer modifizierten BSD-Lizenz vertrieben, d.h. ihr könnt es in Euren freien UND kommerziellen Projekten verwenden wie ihr lustig seid, es muss nur das Copyright angegeben werden. Eine Bitte habe ich nur zusätzlich: es wäre schön wenn ihr mitteilt, was Ihr mit BlitzTiles alles schönes gemacht habt und alle Verbesserungen an BlitzTiles mit der BlitzBasic Community teilen würdet, das sind aber keine Bedingungen! Es liegt an Euch!

Zudem habe ich die drei Fremdtexturen mit eigenen ersetzt, das Zwergmodell aus dem Paket genommen und die "qts.bb" mit der modifizierten Version von eole's QTS Quadtree Terrain System in den ersten Post zu BlitzTiles auf der blitzbasic.com hinterlegt. Mein Paket besteht nun nur noch aus meiner eigenen Arbeit und somit konnte ich die Lizenz abändern. Ich habe dafür zwei Textdateien mit Anweisungen in die beiden leeren Ordner "inc" und "models" hinterlegt damit Ihr wisst, wie man an die fehlenden Komponenten gelangt um blitztiles.bb oder terratiles_pre-quadtree.bb starten zu können.

Bitte löscht daher die erste Version "blitztiles100.exe" und all ihre Inhalte und benutzt zukünftig nur noch die Version 1.01 oder ihre Nachfolger oder überschreibt einfach alles mit dem Inhalt von 1.01. Es ist das gleiche Paket nur mit einer veränderten Lizenz und fehlenden Zusatzmedien (die Ihr aber woanders herunterladen könnt).

Viel Spass damit. Ich giesse mir jetzt einen hinter die Binde.
 

n-Halbleiter

BeitragSa, Mai 23, 2009 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Prost Krischan, du hast es dir verdient, das Zeug ist 1A. Smile Danke. ^^

Bezieht sich der Spruch "Super. Damit kann man Ziegenpisse in Benzin verwandeln" zufällig auf Blues Brothers? Daher kenne Ich ihn nämlich...
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)
 

Krischan

BeitragSa, Mai 23, 2009 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja klar.

Zitat:
JAKE: Du warst die Wirbelsäule, das Nervenzentrum einer großartigen Rhythm and Blues-Band. Und ich glaube, wir können das wieder zum Leben erwecken. Murph and the Magictones! Hmmpf. Seht euch doch mal an in euren labrigen Käsekuchenuniformen. Ha, und ich dachte im Knast ging's mir schlecht.

WILLIE: Wenigstens haben wir was anderes zum anziehen, du Klugscheißer. Und was hast du, immer noch dieselbe Kutte wie vor drei Jahren?

DUCK: Jake hat gar nicht so unrecht. Wir hatten 'ne Band, die war stark genug um Ziegenpisse in Benzin zu verwandeln.

CypressArt

BeitragSo, Mai 24, 2009 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
UND hiermit (Code von Diedel)

https://www.blitzforum.de/foru...ht=treelib

Noch ein wenig "Leben" einhauchen !! Laughing Laughing
(no comment) -> Google Search Bot!!

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group