CreateStaticGeometry() - Merkwürdiges Verhalten

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

CreateStaticGeometry() - Merkwürdiges Verhalten

Beitrag von Chimorin »

Hiho,

seit kurzem funktioniert mein Code nicht mehr (Liegt wieder mal an CreateStaticGeometry()).
Programmablauf:
1. Erstellung einiger Dateien
2. Schleife:
2.1 Erstellung Terrainstück
2.2 Erstellung StaticGeometry

Es wird in eine "neue" Variable geschrieben, trotzdem stürzt es immer, beim 2. Versuch eine statische Geometrie zu erstellen, ab. Create...() wird mit #PB_Any ausgeführt.
Im OGRE.log steht diese geheimnisvolle Nachricht:
OGRE EXCEPTION(4:ItemIdentityException): StaticGeometry with name 'STG_' already exists! in SceneManager::createStaticGeometry at OgreSceneManager.cpp (line 6421)
Vorher gibt es nichts Paranormales im Log. Ich habe absolut keine Ahnung, was das sein soll. Würde ich die selbe Nummer verwenden, müsste sich laut Hilfe die alte statische Geometrie "selbst" löschen...
Wenn zuvor eine andere statische Geometrie-Form mit der gleichen #StaticGeometry Nummer geladen wurde, dann wird diese ältere statische Geometrie-Form beim Erstellen der neuen automatisch freigegeben
Lauffähiges habe ich bisher nicht (Das Beispiel zu diesem Thema funktioniert). Ich schaue mal, ob man den Fehler irgendwie reproduzieren kann.

Ich könnte auf Wunsch noch die beteiligten Prozeduren posten... So ganz ohne Code ist es sicher schwer, irgendetwas hierzu zu sagen.

Gruß,

Banane
Bild

- formerly known as Bananenfreak -
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: CreateStaticGeometry() - Merkwürdiges Verhalten

Beitrag von STARGÅTE »

Hm, hast du vielleicht vergessen, die Geometrie zu schließen? BuildStaticGeometry()
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: CreateStaticGeometry() - Merkwürdiges Verhalten

Beitrag von Chimorin »

Selbst das dürfte keine Probleme machen, habe ich schon am Beispiel getestet. Aber vielleicht gibt es ja Probleme, wenn die Teile des StaticGeometry in unterschiedlichen Proceduren ausgeführt werden. Werde ich mal testen.

EDIT: Daran liegt es nicht.

Da ich kein Programm hinbekomme, in dem der Fehler auftaucht (Ich weiß ja nicht mal, an was es liegt?!), lösche ich von meinem für mich großen Code so weit Programmteile weg, bis ich den Fehler lokalisieren kann (Entweder, er ist plötzlich weg; Dann habe ich ja die Ursache im Kommentar oder es bleibt ein Testcode für euch).
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: CreateStaticGeometry() - Merkwürdiges Verhalten

Beitrag von Chimorin »

So,
beiliegend ist mein Code. Was ich noch vergessen habe einzubauen ist, dass das Programm die Engine3D.dll findet (Oder funktioniert es? Probiert es mal aus).
Der Code besitzt knapp über 250 Zeilen, das Meiste sind Strukturen :D
Wie schon mit Kommentaren angemerkt, muss man bei mir einfach den Teil der Terrainerstellung rausmachen, dann funktioniert es einwandfrei.

Code: Alles auswählen

EnableExplicit

Structure bound2D
  minX.d
  maxX.d
  minZ.d
  maxZ.d
EndStructure


Structure Vektor3
  x.d
  y.d
  z.d
EndStructure


Structure meshEnt
  entNr.i
  meshID.i
EndStructure


Structure meshEntZu Extends meshEnt
  typ.i
  zugehoer.i
EndStructure


Structure life
  max.i
  akt.i
EndStructure


Structure stufenLife Extends life
  stufe.i
EndStructure


Structure obVer Extends meshEntZu
  koord.Vektor3
  winkel.Vektor3
  leben.life
EndStructure


Structure baumGadget
  lebenZeit.stufenLife
  lebenPunkte.life
EndStructure


Structure treeVer Extends baumGadget
  typ.i       ;Baumtyp (Siehe ObjekteIndex.pb -> BaumIndex)
  aeste.meshEnt[12]       ;Array der Entitynummern und MeshIDs der Äste(0 = Ast nicht da, sonstiges schon.) / Hier anders, 12 Äste, keine 13!
  wurzel.i        ;Entitynummer der Wurzel.
  stamm.i        ;Entitynummer des Stamms.
  blaetter.i
EndStructure


Structure terVer
  terrainNr.i
  baumStatic.i       ;Nummer der statischen Geometry, welche für die Bäume dieses Terrains gilt.
  inVer.i
  List Objekte.obVer()
  List Baeume.treeVer()
EndStructure

Global Dim Meshes.i(100000)       ;Array für die Meshes, 100001 Objekte sind als Standart drin. (Geteilt)
Global Dim terrain.terVer(0, 0)        ;-Standartwert für das Terrainarray, eine Liste aus 1x1.

Global.i breite = 1920, hoehe = 1080, weltGroesse, sichtDistanz
Define.i Event
Global.s speicherPfad
#G_Welt = 512
#G_Heightmap = 513


;Kameras
Enumeration
  #kam_0
EndEnumeration


;Fenster
Enumeration
  #Window_Screen
EndEnumeration


;Menüs
Enumeration
  #Menu_0
EndEnumeration


;Menüitems
Enumeration
  #Item_0       ;Neu
EndEnumeration


;Lichter
Enumeration
  #Licht_0
EndEnumeration


Procedure.i TerrainTile(weltXZ.f, weltGroesse.i, groesseWE.i)       ;Berechnet in welchem Terrain das Event stattfindet.
  If weltXZ < 0
    ProcedureReturn 0
    
  ElseIf weltXZ > weltGroesse * groesseWE
    ProcedureReturn weltGroesse -1
    
  Else
    ProcedureReturn Int(weltXZ / groesseWE)
    
  EndIf
EndProcedure


Procedure CreateTerrainEnt(terrainX.i, terrainY.i)        ;Erstellt alle Entities, die zum angegebenen Terrain gehören.
  Protected.i groesse
  
  
  With terrain(terrainX, terrainY)
    Debug 1
    If IsStaticGeometry(terrain(terrainX, terrainY)\baumStatic)
      FreeStaticGeometry(terrain(terrainX, terrainY)\baumStatic)
    EndIf
    
    Debug "" + terrainX + "X" + terrainY
    groesse = #G_Welt * weltGroesse
    terrain(terrainX, terrainY)\baumStatic = CreateStaticGeometry(#PB_Any, groesse, 10000, groesse, #True)
    Debug 2
    
    BuildStaticGeometry(\baumStatic)
  EndWith
EndProcedure


Procedure ErneuerTerrain()        ;Erneuert das Terrain (Dessen Kacheln) auf die derzeitige Kameraposition. (Geteilt)
  Protected.bound2D terrains
  Protected.i terrainX, terrainZ
  
  terrains\maxX = TerrainTile(CameraX(#kam_0) + sichtDistanz, weltGroesse, #G_Welt)
  terrains\minX = TerrainTile(CameraX(#kam_0) - sichtDistanz, weltGroesse, #G_Welt)
  terrains\maxZ = TerrainTile(CameraZ(#kam_0) + sichtDistanz, weltGroesse, #G_Welt)
  terrains\minZ = TerrainTile(CameraZ(#kam_0) - sichtDistanz, weltGroesse, #G_Welt)
  
  For terrainX = terrains\minX To terrains\maxX
    For terrainZ = terrains\minZ To terrains\maxZ
      If terrain(terrainX, terrainZ)\inVer = 0
        terrain(terrainX, terrainZ)\terrainNr = CreateTerrain(#PB_Any, #G_Heightmap, #G_Welt, 1, 0, speicherPfad + "\terrain" + terrainX + "X" + terrainZ, "Dat")       ;-OOOOO Hier Kommentar Anfang
        TerrainLocate(terrain(terrainX, terrainZ)\terrainNr, #G_Welt / 2 + #G_Welt * terrainX, 0, #G_Welt / 2 + #G_Welt * terrainZ)        ;Gesamtes Terrain wird so positioniert, dass die linke untere Ecke auf 0/0 liegt.
        DefineTerrainTile(terrain(terrainX, terrainZ)\terrainNr, 0, 0, "heightmap.png", #False, #False)
        TerrainPhysicBody(terrain(terrainX, terrainZ)\terrainNr, 0.01, 0.3)
        BuildTerrain(terrain(terrainX, terrainZ)\terrainNr)       ;-OOOOO Hier Kommentar Ende
        
        CreateTerrainEnt(terrainX, terrainZ)        
      EndIf
      
      terrain(terrainX, terrainZ)\inVer = 2       ;2 bedeutet, dass dieser Terrainabschnitt aktuell ist.
    Next terrainZ
  Next terrainX
  
  For terrainX = 0 To weltGroesse -1
    For terrainZ = 0 To weltGroesse -1
      If terrain(terrainX, terrainZ)\inVer = 1
        terrain(terrainX, terrainZ)\inVer = 0
        
      ElseIf terrain(terrainX, terrainZ)\inVer = 2
        terrain(terrainX, terrainZ)\inVer = 1
      EndIf
    Next terrainZ
  Next terrainX
EndProcedure


Procedure Open_Window_Screen()
  Protected.i lz
  
  OpenWindow(#Window_Screen, 0, 0, breite, hoehe, "Test_000", #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
  CreateMenu(#Menu_0, WindowID(#Window_Screen))
  MenuTitle("Datei")
  MenuItem(#Item_0, "Neu")
  
  OpenWindowedScreen(WindowID(#Window_Screen), 10, 10, breite, hoehe, #True, 200, 10, #PB_Screen_SmartSynchronization)
  
  Parse3DScripts()        ;Vergleicht in den 3DArchiven gegebene Materialien mit Meshes,...
  
  CreateLight(#Licht_0 ,RGB(255*0.4, 255*0.4,255*0.4), 500, 500, 500, #PB_Light_Directional)        ;-Wird geändert, wenn es die Sonne gibt.
EndProcedure


Procedure Neu()         ;Erstellt eine neue Welt.
  Protected.i Quit, fileData, terrainX, terrainY, neuTerrain
  
  weltGroesse = 2
  speicherPfad = PathRequester("Bitte wählen Sie einen Speicherort für die zu erstellende Welt aus (Vorhandene Welten werden zum Teil geladen!).", "")
  Add3DArchive(speicherPfad, #PB_3DArchive_FileSystem)
  Dim terrain(weltGroesse -1, weltGroesse -1)       ;Redimensioniert die Größe des Terrainarray auf die aktuelle Weltgröße. -1, weil 0 als erste Stelle zählt.
  CreateCamera(#kam_0, 0, 0, 100, 100)
  CameraRange(#kam_0, 0, sichtDistanz)
  ErneuerTerrain()
EndProcedure


If Not InitEngine3D(#PB_Engine3D_DebugLog)
  MessageRequester("Info", "Keine Engine")
  End
EndIf
InitSprite()
InitKeyboard()

;-Variablen Vordefinierung Anfang
sichtDistanz = 11 * 256
;-Variablen Vordefinierung Ende

Open_Window_Screen()

Repeat
  Event = WindowEvent()
  
  Select Event
    Case #PB_Event_Menu
      Select EventMenu()
        Case #Item_0        ;Neu wurde gedrückt
          Neu()
      EndSelect
      
  EndSelect
ForEver
Liegt das wieder an meinem PC oder gibt es den Fehler (endlich) mal auch bei jemand Anderem?

Gruß,

Banane

EDIT: Programm aktualisiert [19.01.]
EDIT: Programm aktualisiert [24.01.]
Zuletzt geändert von Chimorin am 24.01.2014 09:17, insgesamt 2-mal geändert.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: CreateStaticGeometry() - Merkwürdiges Verhalten

Beitrag von Chimorin »

Ein einfaches "Funktioniert" oder "funktioniert nicht", würde mir schon reichen...
Bild

- formerly known as Bananenfreak -
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: CreateStaticGeometry() - Merkwürdiges Verhalten

Beitrag von STARGÅTE »

Wäre schön, wenn der Code erst mal ausführbar wäre.

Der Code stürtzt mit einer IMA bei Parse3DScripts() ab.
Vermutlich weil es garkein Archiv gibt.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: CreateStaticGeometry() - Merkwürdiges Verhalten

Beitrag von Chimorin »

Tut mir leid, ich kann den Fehler nicht nachvollziehen oO
Probiere doch mal den neuen Code. Jetzt wird erst mal geprüft, ob die Engine überhaupt verfügbar ist...
Bild

- formerly known as Bananenfreak -
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: CreateStaticGeometry() - Merkwürdiges Verhalten

Beitrag von STARGÅTE »

Hab mal den Flag "PB_Engine3D_EnableCG" bei InitEngine3D() weggenommen,
ansonsten schlägt InitEngine3D() fehl.

Nachdem start öffnet ein Fenster das sich nicht schließen lässt.
Bei Datei -> Neu habe ich n Ordner erstellt und bekomme dann:
1
0X0
2
1
0X1
2
1
1X0
2
1
1X1
2
danach passiert nichts mehr, und der Ordner ist noch leer.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: CreateStaticGeometry() - Merkwürdiges Verhalten

Beitrag von Chimorin »

Ah, Entschuldigung. Natürlich muss CG weg, dasfuer braucht man die DLL.
Dateien sollen gar nicht erstellt werden, es geht in erster Linie um die Debuggerausgabe.
Danke für deine Hilfe, dann liegt es doch schon wieder an Comodo, welches den Zugriff auf irgendetwas verweigert.
Die Ausgabe zeigt mir, dass alle Statischen Geometrien erstellt wurden und verfügbar sind.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: CreateStaticGeometry() - Merkwürdiges Verhalten

Beitrag von Chimorin »

Stargate, ich wüsste noch gerne von dir, ob du den Code mit dem x86- oder x64-Compiler kompiliert hast... Ich hatte jetzt gerade ein wenig Zeit und habe mal PB x86 installiert... Der Code funktioniert einwandfrei. Unter x64 immer noch nicht. (Anitvirensoftware beide Male aus und an)
Ich hoffe einfach mal, dass es x86 war... Sonst blicke ich da nicht mehr durch.
Bild

- formerly known as Bananenfreak -
Antworten