UpdateWorld/LinePick Probleme

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

N0X

Betreff: UpdateWorld/LinePick Probleme

BeitragMo, Jan 13, 2014 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,
Ich habe im Moment ein wirklich nerviges Problem mit LinePick..
Ich suche über LinePick den Y-Wert eines Meshterrains anhand der X-, und Z-Koordinaten.
Hierbei kommt es häufig zu Totalausfällen von LinePick.
Mal wirft die Funktion nur Nullen aus und mal startet mein Programm erst garnicht und gibt mir einen "EXCEPTION_ACCESS_VIOLATION".
Das ist natürlich sehr ärgerlich und will sich mir einfach nicht erklären lassen, da die Funktion manchmal auch einwandfrei funktioniert.

Könnt ihr mir helfen? Ist das Problem euch sogar bekannt?

Hier noch meine benutzte Funktion
BlitzMax: [AUSKLAPPEN]
Function getmeshterrainy:Float(ent:TEntity,x:Float,z:Float)
Local pick:TEntity = LinePick(x,200,z,0,-800,0)
Return(PickedY())
End Function


Mit besten Grüßen,
N0X
  • Zuletzt bearbeitet von N0X am Mi, Jan 15, 2014 15:16, insgesamt einmal bearbeitet

DAK

BeitragMo, Jan 13, 2014 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst du die Exception abfangen und anzeigen lassen?
Gewinner der 6. und der 68. BlitzCodeCompo

N0X

BeitragDi, Jan 14, 2014 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Da es eine Windows-Exception ist, kann ich diese nur mit Assert abfangen.
Fehler tritt tatsächlich bei dem LinePick-Aufruf auf.

BlitzMax: [AUSKLAPPEN]
Function getmeshterrainy:Float(ent:TEntity,x:Float,z:Float)
Local pick:TEntity = LinePick(x,200,z,0,-800,0)
Assert pick,"Exception tritt auf!"
Return(PickedY())
End Function


Gruß,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

DAK

BeitragDi, Jan 14, 2014 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Da du in BlitzMax unterwegs bist: welches Modul verwendest du für dein 3D?
Welche Version des Moduls und von BlitzMax hast du?

An deinem Aufruf finde ich jetzt nichts falsches, schaut mir nach einem Bug im Modul aus.
Gewinner der 6. und der 68. BlitzCodeCompo

N0X

BeitragDi, Jan 14, 2014 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
MaxIDE 1.42
BCC Version: BlitzMax Release Version 1.48
FASM Version: 1.70.03
GCC Version: 4.81
G++ Version: 4.81

miniB3D v0.54
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

ZEVS

BeitragDi, Jan 14, 2014 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe schon einige nervige Erfahrungen mit dem Wechselspiel Garbage Collector und MiniB3D gemacht. Probiere am Anfang des Programms GCSuspend und dann regelmäßig (z.B. einmal in der Hauptschleife) GCCollect aufzurufen.

ZEVS

N0X

BeitragMi, Jan 15, 2014 11:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, hab ich mal eingebaut, ändert nur leider nichts.
Ich hab aber irgendwie so den Verdacht das es an der Importierung von Krischan's TextureSplatting-Terrain liegt. Ich habe mir damals einfach mal den gesamten Code auf BlitzMax umgeschrieben.

Kann es daran liegen? Habe ich hier irgendwelche groben Fehler drin?
BlitzMax: [AUSKLAPPEN]
Type triangle
Global list:TList = New TList

Field v:Int[3]
Field alpha:Float

Method New()
list.addLast(Self)
EndMethod
End Type

Global alphavertex:Float[65536]

Global map01:TMesh = LoadTMF("rendir",0,-120,0,50,20,50)
map01.EntityPickMode(2)

Function LoadTMF:TMesh(tmpPX:Float,tmpPY:Float, tmpPZ:Float,tmpSX:Float, tmpSY:Float,tmpSZ:Float)
Local hm:TImage = LoadImage("hm.png")
Local cm:TImage = LoadImage("cm.png")
Local lm:TImage = LoadImage("lm.png")
Local alpha_grass:TImage = LoadImage("a_grass.png")
Local alpha_rock:TImage = LoadImage("a_rock.png")
Local alpha_snow:TImage = LoadImage("a_snow.png")

Local m1:TMesh = CreateMesh()
mZum = CreateMesh()
EntityBlend mZum,2

Local Terrain1:TSurface = LoadMeshTerrain(m1,hm,16,cm,1.0,alpha_grass,False,False,False,True)
Local Terrain2:TSurface = LoadMeshTerrain(m1,hm,16,lm ,1.0,alpha_rock)
Local Terrain3:TSurface = LoadMeshTerrain(m1,hm,16,Null,0.0,alpha_snow,255,255,255)
Local bump:TSurface = LoadMeshTerrain(mZum,hm,16,Null,1.0,Null)

Local detail:TTexture = MyLoadTexture("detail.png",0,1.0/ 64,1.0/ 64,5)

ApplyTexture("grass.png",0,2.0/ 32,1.0/ 32,5,Null,Terrain1,2)
ApplyTexture("rock.png",0,1.0/ 32,1.0/ 32,2,Null,Terrain2,2+32)
ApplyTexture("snow.png",0,1.0/ 16,1.0/ 16,2,Null,Terrain3,2+32)
ApplyTexture("bump.png",0,1.0/ 1,1.0/ 1,4,Null,bump,1)

EntityTexture mZum,detail,0,2

m1.ScaleMesh(tmpSX,tmpSY,tmpSZ)
mZum.ScaleMesh(tmpSX,tmpSY,tmpSZ)
m1.PositionMesh(tmpPX,tmpPY,tmpPZ)
mZum.PositionMesh(tmpPX,tmpPY,tmpPZ)

EntityType mZum,CMAP
EntityType m1,CMAP

Return(m1)
End Function

' Normalize a value
Function Normalize:Float(value:Float=128.0, value_min:Float=0.0,value_max:Float=255.0,norm_min:Float=0.0, norm_max:Float=1.0)
Return ((value-value_min)/(value_max-value_min))*(norm_max-norm_min)+norm_min
End Function

Function MyLoadTexture:TTexture(filename:String, flags:Int,uscale:Float=1.0,vscale:Float=1.0,blendmode:Int=False, entity:TMesh=Null,layer:Int=0,frame:Int=0)
Local tex:TTexture = LoadTexture(filename:String,flags)
ScaleTexture tex,uscale,vscale
If blendmode Then TextureBlend tex,blendmode
If entity Then
EntityTexture entity,tex,frame,layer
EndIf
Return tex
End Function

Function ApplyTexture:TTexture(filename:String,flags:Int, uscale:Float=1.0,vscale:Float=1.0,blendmode:Int=False, mesh:TMesh=Null,surf:TSurface=Null,fx:Int=0)
Local tex:TTexture = LoadTexture(filename:String,flags)
ScaleTexture tex,uscale,vscale
If blendmode Then TextureBlend tex,blendmode

Local brush:TBrush = CreateBrush(255,255,255)
If tex Then BrushTexture brush,tex
If fx Then BrushFX brush,fx

If surf Then
PaintSurface surf,brush
Else
surf = CreateSurface(mesh)
PaintSurface surf,brush
EndIf

FreeBrush brush

Return tex
End Function

'Create Meshterrain
Function LoadMeshTerrain:TSurface(mesh:TMesh,hmap:TImage,vscale:Float=16.0, cmap:TImage=Null,cscale:Float=1.0,amap:TImage,r1:Int=False, g1:Int=False,b1:Int=False,base:Int=False)
Local rgb:Int,r:Int,g:Int,b:Int,a:Float
Local h:Float,x:Int,y:Int,vertex:Int
Local vx:Float,vz:Float,u:Float,v:Float
Local v0:Int,v1:Int,v2:Int,v3:Int

Local hbuf:TPixmap,size:Int,verts:Int
Local cbuf:TPixmap,cwidth:Int,cfactor:Float
Local abuf:TPixmap

' Heightmap
If hmap<>Null Then
hbuf = hmap.pixmaps[0]
size = ImageWidth(hmap) - 1
verts = size + 1
EndIf

' Colormap
If cmap<>Null Then
cbuf = cmap.pixmaps[0]
cwidth = ImageWidth(cmap)
cfactor = cwidth*1.0/verts
EndIf

' Alphamap
If amap<>Null Then abuf = amap.pixmaps[0]

' Create the Mesh
'Local mesh:TMesh = CreateMesh()
Local surf:TSurface = CreateSurface(mesh)

For y=0 To size
For x=0 To size
' read height (only red channel) And normalize it
Local tmpPtr:Byte Ptr = hbuf.PixelPtr(x,size-y)
Local tmpG:Int = tmpPtr[0]
h=Normalize(tmpG,0,255,0.0,vscale)

'Local rgb:Byte Ptr

' read vertexcolor from colormap (R,G,B)
If cmap<>Null Then
Local rgb:Byte Ptr = cbuf.PixelPtr(x*cfactor,(size-y)*cfactor)
r = Int((rgb[0])*cscale)
g = Int((rgb[1])*cscale)
b = Int((rgb[2])*cscale)
Else
r=128
g=128
b=128
EndIf

' read alpha value from alphamap (only red channel)
If amap Then
Local pix:Byte Ptr = abuf.PixelPtr(x,size-y)
Local tmpS:Int = pix[0]
a=Normalize(tmpS,0,255,0,1)
Else
a=1.0
EndIf

' use forced colors If used
If r1 Then r=r1
If g1 Then g=g1
If b1 Then b=b1

' calculate vertex coordinates / texture coordinates
vx=x-(size/2.0)
vz=y-(size/2.0)
u=x*1.0/size
v=(size-y)*1.0/size

' place vertex
vertex=AddVertex(surf,vx,h,vz,u,v)

' set vertex color And texture coordinates
VertexColor surf,vertex,r,g,b,a

' build alpha blitzarray For alpha check later
alphavertex[vertex]=a

' set triangles
If y<size And x<size Then
v0=x+((size+1)*y)
v1=x+((size+1)*y)+(size+1)
v2=(x+1)+((size+1)*y)
v3=(x+1)+((size+1)*y)+(size+1)

' add first triangle
Local t:triangle = New triangle
t.v[0]=v0
t.v[1]=v1
t.v[2]=v2

' add second triangle
Local t2:triangle = New triangle
t2.v[0]=v2
t2.v[1]=v1
t2.v[2]=v3
EndIf
Next
Next

' flag all 100% transparent triangles (just add transparency values, higher than 0 = Not transparent :-)
For Local t:triangle = EachIn triangle.list
t.alpha=alphavertex[t.v[0]]+alphavertex[t.v[1]]+alphavertex[t.v[2]]
Next

' Create triangles
For Local t:triangle = EachIn triangle.list
' base layer = draw ALL triangles
If base=True Then
AddTriangle surf,t.v[0],t.v[1],t.v[2]
Else
' If they are Not transparent
If t.alpha>0 Then
AddTriangle surf,t.v[0],t.v[1],t.v[2]
EndIf
EndIf

' Delete triangle from To do list
triangle.list.Remove(t)
Next

UpdateNormals mesh

Return surf
End Function


Ich hoffe ich erschlage euch nicht mit dem Code.

Beste Grüße,
N0X

//EDIT:
Ich habe gerade herausgefunden, dass die Windows-Exception anscheinend von EntityBlend kommt, da ich auf ein leeres Mesh, welches gerade mit CreateMesh() erstellt wurde einen Blendmode festlegen wollte.
Ich habe die BlendMode-Zuweisung jetzt ein paar Zeilen weiter unten angefügt und siehe da: Bisher keine einzige Exception mehr.
Die Aussetzer von LinePick bleiben jedoch. Jetzt gibt PickedY() von LinePick sogar immer 0 aus.
Ich hab da aber so einen Verdacht..

//EDIT2:
An LinePick liegt es wohl nicht. Die Windows-Exception ist wieder da, diesmal bei UpdateWorld() (ich habe die getmeshterrainy rausgenommen). Was läuft da schief? :/

~EDITIERT~

Leerzeichen hinzugefügt damit lange Zeilen nicht das Forenlayout sprengen.
Xeres.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group