BlitzTiles
Übersicht

Wie findet Ihr BlitzTiles? | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||||
Insgesamt 85 Stimmen |
KrischanBetreff: BlitzTiles |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
![]() 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: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 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: ![]() ![]() ![]() 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: ![]() |
||
- Zuletzt bearbeitet von Krischan am Di, Dez 07, 2010 18:38, insgesamt 5-mal bearbeitet
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Mach weiter! lg MD |
||
.... |
vanjolo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das ist einfach nur "unbelivable" ![]() Danke. |
||
***************************
in Entwicklung: Tank Battles - Panzeraction Pacific Battles - Rundenstrategie abgeschlossenes Projekt: Harrier Assault |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also ich finde es prima und kann es sicherlich auch brauchen:)
Top ![]() |
||
![]() |
TrikkieMikkie |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() (Unable to set graphics mode) Gabs da nicht mal 'ne Begrenzung in Blitz3D? Oder wars bei Gamestudio? ![]() |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
TrikkieMikkie |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das spielt keine Geige. ![]() Bei anderen Anwendungen (auch meinen eigenen DX-basierten) funktionierts ja auch. Wird ein Teil des Backbuffers einfach abgeschnitten bzw. nicht angezeigt. |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Na, ich hoffe es klappt mit dem Lizenzierungsmodel!
Will das Teil!! ![]() |
||
(no comment) -> Google Search Bot!! |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also zur DualMontior geschichte, bei 3200x1080 bekomm ich nen Unable 2 create 3d scene
Aber welches Game unterstütz schon so was exotisches? ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Prost Krischan, du hast es dir verdient, das Zeug ist 1A. ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
UND hiermit (Code von Diedel)
https://www.blitzforum.de/foru...ht=treelib Noch ein wenig "Leben" einhauchen !! ![]() ![]() |
||
(no comment) -> Google Search Bot!! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group