Irrlicht Textur erneuern

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Irrlicht Textur erneuern

Beitrag von D4uS1 »

hallo,

ich habe eine Frage bezüglich der Texturen in Irrlicht. Ich möchte im Verlauf eines Spiels ein Bild erstellen, welches von Irrlicht als Textur ausgelesen werden soll, um es auf dem Bildschirm darzustellen. Doch immer wenn ich versuche die Textur neu auszulesen, erscheint einfach wieder die alte.

Code: Alles auswählen

CreateImage(0, 200, 200)
StartDrawing(ImageOutput(0))
;Zeichnen des Bildes
StopDrawing()
SaveImage(0, "Bild.bmp")
*Textur = IrrgetTexture("Bild.bmp")
das ganze passiert alle 5 Sekunden in meinem Spiel, doch es wird immer das bild angezeigt, welches als erstes geladen wurde.
Weiß jemand ob es auch anders geht?

lg
D4uS1
Solltet ihr Rechtschreibfehler finden, dürft ihr diese natürlich gerne behalten ;).
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

:freak:
Wie wäre es, in Irrlicht einfach direkt ne Textur zu erstellen und etwas draufzuzeichnen statt da immer Bilder abzuspeichern.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Gibt es Zeichenoperationen in Irrlicht?
Solltet ihr Rechtschreibfehler finden, dürft ihr diese natürlich gerne behalten ;).
Benutzeravatar
Max_der_Held
Beiträge: 595
Registriert: 18.04.2006 17:01
Wohnort: Bavaria
Kontaktdaten:

Beitrag von Max_der_Held »

also.. ich hab mal was von dieser Procedure gehört: ( nehmen wir in magical twilight her, für Default-texturen)

Code: Alles auswählen

Procedure.l IrrPBImage2Texture(ImageNo.l, name.s, hasAlpha.l = #True)
  Define *Image.l = 0
  Define Format.l = #IRR_ECF_A8R8G8B8  ; Standard
  Define ImageID.l
  Define ImageInfo.BITMAP
  Define ImWidth.l, ImHeight.l, ImBytes.l, ImLine.l
  Define *IImage.l, *MeshTexture.l
  
  ImageID = ImageID(ImageNo)
  If GetObject_(ImageID, SizeOf(BITMAP), @ImageInfo)
    ImWidth  = ImageInfo\bmWidth
    ImHeight = ImageInfo\bmHeight
    ImBytes  = ImageInfo\bmBitsPixel/8
    ImLine   = ImWidth*ImBytes
    *Image   = ImageInfo\bmBits
  EndIf
  
  ; find the right color Format
  Select ImageDepth(ImageNo)
    Case 1,8, 16
      Debug("Image needs minimal Depth of 24 Bit !!")
    Case 24
      If hasAlpha 
        Format = #IRR_ECF_A1R5G5B5
      Else
        Format = #IRR_ECF_R8G8B8
      EndIf
    Case 32
      If hasAlpha 
        Format = #IRR_ECF_A8R8G8B8
      Else
        Format = #IRR_ECF_R8G8B8
      EndIf
  EndSelect       
   
  ; Create an Image from Data
  *IImage.l = IrrCreateImageFromData(Format,ImWidth,ImHeight,*Image)
  *MeshTexture = IrrAddTextureFromImage(name,*IImage)
  IrrDropPointer(*IImage)
  
  ProcedureReturn  *MeshTexture
EndProcedure 
Da aber bei Magical twilight täglich rund 120 Zeilen hinzukommen, und ziemlich alles noch ungetestet ist, will ich auch hierfür keine Verantwortung übernehmen (ist ja auch net von mir, sondern neotoma oder Thalius, nehme ich an. ;) )

viel Erfolg

Max

ps: warum dein Problem auftritt:

soweit ich das richtig verstanden habe lädt irrlicht nicht jede Textur XX mal, sondern nur 1 mal, und verlinkt diese dann auf die 3d-nodes.
evtl merkt er also bei deiner Version: "hoppla", habs ja schon geladen..
-> (daraus folgt) evtl hättest du es vorher mit "irrdroppointer" löschen müssen.

EDIT:

soweit ich weiß ist die Procedur im Irrlichtwrapper schon eingebaut.. musstas also evtl nicht selbst einbauen.
Zuletzt geändert von Max_der_Held am 11.02.2009 18:28, insgesamt 1-mal geändert.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Max_der_Held hat geschrieben:evtl hättestas vorher mit "irrdroppointer" löschen müssen.
Ok vielen dank, die Prozedur werd ich demnächst mal ausprobieren und berichten ob es funktioniert. Ich wollte nur jetzt antworten damit ichs nich vergesse. IrrDropPointer habe ich bereits probiert, das funktioniert leider nicht. Danke nochmal, wie gesagt ich probiers demnächst aus.

lg
D4uS1
Solltet ihr Rechtschreibfehler finden, dürft ihr diese natürlich gerne behalten ;).
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Die Prozedur ist im IrrlichtWrapper beriets enthalten und es kommt ein Invaild Memory Access. :cry:

Bisher habe ich eine Notlösung programmiert. Eine Zählvariable die nach jedem erstellen der Textur ihren Wert erhöht und dann das Spiel unter dem Namen des Wertes abspeichert. Dennoch finde ich diesen Weg nicht ausreichend, denn wenn die Textur nicht erneuert wird, bedeuted dies, das irgentwo im Speicher sich diese Textur noch befindet. Igentwann wird der Speicher durch die vielen erstellten Texturen überlastet sein.
Solltet ihr Rechtschreibfehler finden, dürft ihr diese natürlich gerne behalten ;).
Benutzeravatar
Max_der_Held
Beiträge: 595
Registriert: 18.04.2006 17:01
Wohnort: Bavaria
Kontaktdaten:

Beitrag von Max_der_Held »

XD ja lol ^^
du musst natürlich beim image die Farbtiefe schon einstelen.. also beim pb-image (24 bit z.b.)
(dann gehts zumindest bei mir ;)

hier code:
Bei mir funktioniert nur 24 bit ..(also createimage (23,23,24!!!) ^^ ;)
(Evtl nochmal einrücken etc.. aber muss noch ewigst english-lernen usw.. wir haben wieder ne fieße Test-phase und ich komm nirgens vorwärts o_O..

hoffe, es klappt auch bei dir, der Befehl ;)

Code: Alles auswählen

;; ----------------------------------------------------------------------------
;; Irrlicht Wrapper For Imperative Languages - Purebasic Examples
;; IrrlichtWrapper and FreeBasic-Example by Frank Dodd (2006)
;; Improved IrrlichtWrapper - Michael Taupitz (2007)
;; PureBasic-Examples by Michael Taupitz (neotoma) & Marius Eckardt (Thalius) 
;; ----------------------------------------------------------------------------
;; Example 04 : 3D Models - Meshes And Nodes
;; This example loads an MD2 model And adds it As a node To the scene
;; ----------------------------------------------------------------------------

EnableExplicit 
DisableExplicit
;; Include the Irr3D-Requester.. wenn nicht geht: Xincludefile "irr3dRequester.pb" ; hernehmen und in nen ordner mit'm irr3drequester verschieben.
XIncludeFile #PB_Compiler_Home + "Examples\IrrlichtWrapper\Irr3DRequester.pb"


;; ////////////////////////////////////////////////////////////////////////////
;; Global variables

; irrlicht objects
Define *MD2Mesh.irr_mesh          ;Pointer to the Mesh
Define *MeshTexture.irr_texture     ;Pointer to the Texture
Define *SceneNode.irr_node        ;Pointer to the SceneNode
Define *OurCamera.irr_camera      ;Pointer to the Camera

; -----------------------------------------------------------------------------
; To Start the Irrlicht-Device we use the Irr3DRequester, to make it more comfortable
; for the Users, and also easier to test different resolutions and devices.
If Irr3DRequester()

  ; set the window caption
  IrrSetWindowCaption( "Example 04: 3D Models - Meshes and Nodes" )
  IrrGuiAddStaticText( "Welcome to Irrlicht", 4,0,200,16, #IRR_GUI_NO_BORDER, #IRR_GUI_NO_WRAP )
  *SceneNode = IrrAddCubeSceneNode(10)
  IrrSetNodeMaterialFlag( *SceneNode, #IRR_EMF_LIGHTING, #IRR_OFF )
  *OurCamera = IrrAddCameraMaya ( 0 , 180 , 200 , 200 );  50,0,0, 0,0,0 )

   CreateImage( 0 , 512 , 512 ,24) ; TEXTUR per PB erstellen
   For x = 1 To 10 ; damit man mehr linien sieht ;)
        If StartDrawing ( ImageOutput(0))
            Line ( Random(512 ),Random(512 ),Random(512 ),Random(512 ),RGB(Random(255),Random(255),Random(255)))
            Line ( Random(512 ),Random(512 ),Random(512 ),Random(512 ),RGB(Random(255),Random(255),Random(255)))
            StopDrawing()
        EndIf 
   Next 
   texture = IrrPBImage2Texture ( 0 , "wall.bmp" , 0)
   IrrSetNodeMaterialTexture    ( *SceneNode , texture ,0 )
  ; -----------------------------------------------------------------------------
  ; while the irrlicht environment is still running
  While IrrRunning()
      ; begin the scene, erasing the canvas with sky-blue before rendering
      IrrBeginScene( 240, 255, 255 )
  
      ; draw the scene
      IrrDrawScene()
      
      ; draw the GUI
      IrrDrawGUI()
      
      If getasynckeystate_(#VK_SPACE)
         
         If StartDrawing ( ImageOutput(0))
            Line ( Random(512 ),Random(512 ),Random(512 ),Random(512 ),RGB(Random(255),Random(255),Random(255)))
            Line ( Random(512 ),Random(512 ),Random(512 ),Random(512 ),RGB(Random(255),Random(255),Random(255)))
            StopDrawing()
         EndIf 
         If texture ; droppen... k.a., was das enau macht ^^. hauptsache raus damit!!
            IrrDropPointer( texture )
         EndIf 
         texture = IrrPBImage2Texture ( 0 , "wall.bmp" , 0)
         IrrSetNodeMaterialTexture    ( *SceneNode , texture ,0 )
      EndIf 
      
      ; end drawing the scene and render it
      IrrEndScene()
  Wend
  
  ; -----------------------------------------------------------------------------
  ; Stop the irrlicht engine and release resources
  IrrStop()
  
EndIf  

End 
mfg Max (Draufwalker ;) )

ps: als Beweis dasses bei mir hinhaut: DOWNLOAD Exe

[EDIT]
habe gerade festgestellt, dass die texturen nicht gelöscht werden -> Vram = bumm.
mit löschen des nodes würden die (soweit ich weiß) allerdings auch rausgehaun werden... evtl mal thalius fragen, ob er ne "freetexture" einbaut, bei dem man nicht das node löschen muss.....
für gewöhnlich werden ja nodes ab gewisser entfernung sowieso removed (sollte man selbst einbauen.. LOD)
aber kk. muss jetz wieder weitermachen. hoffe, geholfen zu haben ;)
immerhin weißte jetz, wie man ne textur selber erstellt ;) )
[/BlockEditEnde]
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag von Thalius »

Texturen sollten "garbaged" werden sobald sie von nix mehr referenziert sind. Respektive nix mehr diese benutzt. Ram wird nur aufgeräumt wenn nötig ( lazy cleanup ).
"...smoking hash-tables until until you run out of memory." :P
Benutzeravatar
Max_der_Held
Beiträge: 595
Registriert: 18.04.2006 17:01
Wohnort: Bavaria
Kontaktdaten:

Beitrag von Max_der_Held »

[offTopic]
Lustig is ja auch, dass ich das Lazy-cleanup system auch entwickelt hab, nur um dann festzustellen, dass des in irrlicht doch sowieso schon drin is lol :D ;)

nennt man ironie des schicksals..
(trotzdem hätt ich da ganz gern selbst die kontrolle übers aufräumen pfft.. mapf.. ;) aber äh egal.. ;) )
[/offtopic]
mfg max
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Was genau muss ich also jetzt machen um eine Textur bzw. ein Bild löschen zu lassen?
Solltet ihr Rechtschreibfehler finden, dürft ihr diese natürlich gerne behalten ;).
Antworten