 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 17.10.2009, 11:26 Titel: Foto vom Irrlichtscreen in den Speicher ? |
|
|
Hallo, unten mit dem Befehl kann ich ein Bild vom Irrlichtscreen ablegen als BMP.
Code: |
If multikey( FB.SC_W ) Then
IrrDrawScene
IrrSaveScreenShot("d:\test.bmp")
End If
|
Nun möchte ich den Befehl irgendwie umleiten, das ich das Bild aus dem Speicher lesen kann.
So sieht die Declare aus von der Irrlicht.bi :
' save a screenshot out to a file
declare sub IrrSaveScreenShot CDECL alias "IrrSaveScreenShot" ( byval text as zstring ptr )
Wer kann da weiterhelfen?
Gruss |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 17.10.2009, 11:45 Titel: |
|
|
Mit dem Befehle geht's auf jeden Fall nicht. Da muss du dir mal die restlichen Deklarationen anschauen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 17.10.2009, 13:13 Titel: |
|
|
Wenn der Screen 18,32 aktiviert ist, kann ich mit der w-Taste ein : IrrSaveScreenShot("d:\test.bmp") machen. Das funktioniert.
Gruss
Code: |
#include "IrrlichtWrapper.bi"
#include "fbgfx.bi"
USING FB
DIM MeshTexture as irr_texture
DIM TestNode as irr_node
DIM TestNode1 as irr_node
DIM OurCamera as irr_camera
Dim delta as single
DIM drehen as single
DIM drehe as single
Dim As Integer new_x, new_y
Screen 18,32
SCREENCONTROL SET_WINDOW_POS, 10,200
IrrStart( IRR_EDT_OPENGL, 400, 400, IRR_BITS_PER_PIXEL_32, _
IRR_WINDOWED, IRR_NO_SHADOWS, IRR_CAPTURE_EVENTS )
IrrSetWindowCaption( "drehen-kindnodes" )
MeshTexture = IrrGetTexture( "./media/texture.jpg" )
TestNode = IrrAddTestSceneNode
IrrSetNodeMaterialTexture( TestNode, MeshTexture, 0 )
IrrSetNodeMaterialFlag( TestNode, IRR_EMF_LIGHTING, IRR_OFF )
TestNode1 = IrrAddTestSceneNode
IrrSetNodeMaterialTexture( TestNode1, MeshTexture, 0 )
IrrSetNodeMaterialFlag( TestNode1, IRR_EMF_LIGHTING, IRR_OFF )
OurCamera = IrrAddCamera( 0,0,-100, 0,0,0 )
IrrSetNodePosition( OurCamera, 10, 10, -35 )
IrrAddChildToParent( testnode1, testnode)
IrrSetNodePosition( testnode1, 0, 10, 0 )
WHILE IrrRunning
Sleep 1
IrrBeginScene( 255,255,0 )
If multikey( FB.SC_W ) Then
IrrDrawScene
IrrSaveScreenShot("d:\test.bmp")
End If
getmouse new_x, new_y
drehe = drehe+new_x/5000
drehen = drehen+new_y/5000
Locate 1,1: print drehe
Locate 2,1: print drehen
IrrSetNoderotation( TestNode, 0,0,drehe)
IrrSetNoderotation( TestNode1, drehen, 0,0 )
IrrDrawScene
IrrEndScene
Wend
IrrStop
|
|
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 17.10.2009, 13:47 Titel: |
|
|
Schau doch, ob es einen Befehl gibt, um an die Rohdaten zu kommen. Hier im Forum gibt's meines Wissens nach niemanden, der sich mit Irrlicht intensiv auseinander gesetzt hat. Da ist halt mal Eigeninitiative angesagt! _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 01.11.2009, 16:34 Titel: |
|
|
So sieht der cpp-code aus, wurde mit Linux compiliert.
Ich weiss nicht, wie ich jetzt mit Freebasic ran komme?
Gruss
Code: |
/* ----------------------------------------------------------------------------
save a screenshot out to a file
*/
void DLL_EXPORT IrrSaveScreenShot( const char * file )
{
IImage* screenshot = driver->createScreenShot();
if ( screenshot )
{
device->getVideoDriver()->writeImageToFile( screenshot, file );
screenshot->drop();
}
}
/* ////////////////////////////////////////////////////////////////////////////
all of the above functions are declared as C functions and are exposed without
any mangled names
*/
}
|
|
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 01.11.2009, 17:36 Titel: |
|
|
Wie könnte man die Variable DIM pixels as uinteger ptr auslesen von:
pixels = IrrLockTexture( RenderTexture )
Es ist ja ein Zeiger wo irgendwie das Bild(Texture) drin ist.
Wer kann hier weiterhelfen?
Gruss
Code: |
#include "IrrlichtWrapper.bi"
DIM MD2Mesh as irr_mesh
DIM MeshTexture as irr_texture
DIM RenderTexture as irr_texture
DIM TextureA as irr_texture
Dim TextureB as irr_texture
DIM SceneNode as irr_node
DIM CubeNode as irr_node
DIM StaticCamera as irr_camera
DIM FPSCamera as irr_camera
DIM pixels as uinteger ptr
IrrStart( IRR_EDT_OPENGL, 600, 300, IRR_BITS_PER_PIXEL_32, _
IRR_WINDOWED, IRR_SHADOWS, IRR_IGNORE_EVENTS )
IrrSetWindowCaption( "Example 33: Rendering to a texture" )
IrrAddStaticText( "Zumlin model by Rowan 'Sumaleth' Crawford", 4,0,200,16, IRR_GUI_NO_BORDER, IRR_GUI_NO_WRAP )
MD2Mesh = IrrGetMesh( "./media/zumlin.md2" )
MeshTexture = IrrGetTexture( "./media/zumlin.pcx" )
RenderTexture = IrrCreateRenderTargetTexture ( 128, 128 )
TextureA = IrrGetTexture( "./media/Diagonal.bmp" )
TextureB = IrrCreateTexture( "merged", 128, 128, ECF_A8R8G8B8 )
SceneNode = IrrAddMeshToScene( MD2Mesh )
CubeNode = IrrAddCubeSceneNode( 30.0 )
IrrSetNodePosition( CubeNode, 0, 0, 100 )
IrrSetNodeMaterialTexture( SceneNode, MeshTexture, 0 )
IrrSetNodeMaterialTexture( CubeNode, RenderTexture, 0 )
IrrSetNodeMaterialFlag( SceneNode, IRR_EMF_LIGHTING, IRR_OFF )
IrrSetNodeMaterialFlag( CubeNode, IRR_EMF_LIGHTING, IRR_OFF )
IrrPlayNodeMD2Animation( SceneNode, IRR_EMAT_STAND )
StaticCamera = IrrAddCamera( 50,0,0, 0,0,0 )
FPSCamera = IrrAddFPSCamera
IrrSetNodePosition( FPSCamera, 40, 0, 110 )
IrrSetNodeRotation( FPSCamera, 160, -400.0, 0 )
IrrHideMouse
WHILE IrrRunning
IrrSetActiveCamera ( StaticCamera )
IrrDrawSceneToTexture ( RenderTexture )
pixels = IrrLockTexture( RenderTexture )
IrrBeginScene( 240, 255, 255 )
IrrSetActiveCamera ( FPSCamera )
IrrDrawScene
IrrDrawGUI
IrrEndScene
WEND
IrrStop
|
|
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 02.11.2009, 11:14 Titel: |
|
|
@funkeld: Ich kenne mich mit irrlicht leider immer noch nicht aus, ABER: Bilder bzw. Bildpuffer haben in den meisten umsetzungen einen sehr ähnlichen aufbau. In der FBGFX gibts die "struktur" IMAGE. Sie zeigt einem den internen aufbau eines FBGFX-Bildpuffers.. da gibts (u.A) die breite, höhe, farbtiefe, pitch und dann den pixelbereich. (Dort bereichnet sich die position eines beliebigen Pixels innerhalb eines Bildpuffers nach p = pixdata + x + y * pitch)
Sowas ähnliches wird bei irrlicht bestimmt auch der Fall sein. Die Funktion IrrLockTexture() gibt dir einen Pointer auf eine Struktur wieder, die bestimmt immer den selben aufbau hat und mehr informationen enthält als die reinen pixel-daten.
Wie der Aufbau dieser Struktur genau ist und was er enthält kann ich dir leider nicht sagen. Da musst du mal in der Doku zu irrlicht stöbern!
Schau mal genau nach was IrrLockTexture zurückgibt!
Sollte da eine bestimmte Struktur dahinterstecken, musst du "pixels" mit dieser Struktur dimensionieren und nicht mit " uinteger ptr "
Ich glaub, wie du vielleicht gemerkt hast, richtige irrlicht experten wirst du hier eher nich finden... aber gute programmierer auf jeden fall  |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 30.12.2009, 18:50 Titel: |
|
|
Gibt es neue Erkenntnisse?
Ich komme einfach nicht weiter.
Vielleicht hat jemand eine Idee mit einem Pointer, den man dann irgendwie mit "Put" als Bild darstellen kann.
Gruss |
|
Nach oben |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
Verfasst am: 31.12.2009, 14:39 Titel: |
|
|
Hi funkeld!
Ebenfalls keine Ahnung von Irrlicht. Aber nach den Vorabinfos: Das Heap-Image deines Screenshots steckt wohl in einem Bereich, auf den IImage ptr (Im C-Code: IImage*) zeigt.
Aufgabe 1: Den Pointer identifizieren und ansprechen können.
Aufgabe 2: Mach dir ein Testimage, nur zwei Farben (Schwarz-Weiss) und ein sehr regelmässiges Muster (z.B. Schachbrett, also immer eins schwarz, eins weiss....). Schaue perfekt planar mit der Kamera auf das Muster (in einer möglichst neutralen Szene, z.B. drumherum nur eine Farbe), wenn du den Screenshot machst. Lies dir dann den Image ptr-Bereich aus und schreibe ihn als Text (Spalte 1: Byte-Adresse, Spalte 2: Byte-Wert) in ein Textfile und schau, ob du das Schwarz/Weiss-Muster dort wiederfindest.
Wenn ja, kannst du dich Schritt für Schritt mit weiteren Testbildern an die Kodierung rantasten. Meistens ist die sehr einfach, also wie bei bmp-True-Color z.B.
Wenn nein, dann hast du Pech gehabt, dann ist das schon ein Kompressionsformat. Dann hilft nur noch Googeln, was das Zeug hält.
Aufgabe 3: Selbst eine Routine schreiben, die den IImage-Ptr-Bereich ausliest und ggf weiterverarbeitet.
VG!
Croco |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 31.12.2009, 18:23 Titel: |
|
|
Vorerst muss ich sagen, dass ich mit Irrlicht bis jetzt noch nie was zu tun hatte - noch nicht einmal den Namen kannte.
Ich habe mir den Irrlicht Quellcode heruntergeladen und da die folgenden Funktion gefunden:
Code: | //! Returns an image created from the last rendered frame.
IImage* CD3D8Driver::createScreenShot() |
Nun ist Irrlicht ja in C++ geschrieben. Gibts da eine Wrapper-Bibliothek für FB oder wie funktioniert das?
Denn auch Funktionen aus einer C++ DLL kann man ja meines Wissens von FB aus nicht zugreifen.
@funkeld: Ich mag mir jetzt nicht die Arbeit machen mich komplett in Irrlicht einzuarbeiten, aber wenn du eine Testumgebung hochlädst bin ich gerne bereit mir das anzuschauen (also ein minimales Beispielprogramm inkl. der benötigten Bibliotheken, Includes, Wrapper, usw. sodass ich es mit dem Standard FB 0.20 kompilieren kann). _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 31.12.2009, 18:38 Titel: |
|
|
Ich würde gern eine Zip hochladen. Wie geht das hier?
Gruss |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 31.12.2009, 19:14 Titel: |
|
|
Übers Forum direkt funktioniert das nicht, aber du kannst die Datei auf einem Datei-Hoster hochladen und dann hier den Link hineinschreiben.
Wenn du keine Datei-Hoster kennst kannst du dir einen aussuchen: http://uploaded.to/ oder http://netload.in/ oder http://megaupload.com/ oder ...
Aber bitte tue mir (und ws den andern auch) einen Gefallen und lade es nicht auf Rapidshare hoch. Wenn man dort einen (kostenpflichtigen) Premium Account hat mags ja ganz OK sein, aber für alle die das nicht haben gibts neben ewigen Wartezeiten, starken Geschwindigkeitsbegrenzungen, etc. auch noch Zeiten, wo man überhaupt nichts herunterladen kann.
Die oben genannten sind ganz OK (zwar auch kurze Wartezeiten o.ä., aber nicht so starke Einschränkungen wie bei Rapidshare). Zum Hochladen / Herunterladen musst du dich übrigens nirgends registrieren oder anmelden.
@Foren-Admins: Wie wärs mit einem FAQ Eintrag zu dem Thema "Wie lade ich Programme / Bilder hoch?" (oder so ähnlich), denn da gibts immer wieder Fragen, die man immer wieder erneut beantworten muss. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 31.12.2009, 19:36 Titel: |
|
|
Ich bin mir sicher, wenn es dazu einen FAQ-Eintrag gäbe, müsste man die Frage trotzdem immer wieder beantworten ... _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 31.12.2009, 19:57 Titel: |
|
|
@nemored: Dass sich die wenigsten Benutzer einen FAQ Eintrag durchlesen (bzw. diesen überhaupt finden) *bevor* sie fragen wie es funktioniert ist unbestritten. Aber es würde das Beantworten vereinfachen. So würde ein Link auf den entsprechenden FAQ-Eintrag genügen, anstatt jedes Mal einen kleinen Text schreiben zu müssen. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 01.01.2010, 12:43 Titel: |
|
|
Zitat: |
Ich bin mir sicher, wenn es dazu einen FAQ-Eintrag gäbe, müsste man die Frage trotzdem immer wieder beantworten ...
|
Das glaube ich auch. Weil man als Neuling nicht weiss, welche Bande sich hinter dem Servern befindet.
Und auch evtl die Dateien verhökert werden können.
Fazit : Ich Traue nur empfohlenden Servern.
GRuss
Zuletzt bearbeitet von funkeld am 01.01.2010, 16:38, insgesamt 3-mal bearbeitet |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 01.01.2010, 13:17 Titel: |
|
|
http://ul.to/kq6bz7 ist die IrrlichtWrapper.zip
Die "drehen-kindnodes.bas" kannst du sofort mit Freebasic 0.2 compilieren.
Wenn du mit der Maus auf dem linken Fenster klickst(aktivieren), kannste mit der Mausposition-xy auf dem Fenster die Drehung des Würfels im rechten Irrlichtfenster bestimmen.
Mit der Taste "w" kann man dann ein Bmp-Foto herstellen. Alle Datein von Irrlicht sind im Ordner zum verfolgen, was in Irrlciht drin ist.
Gruss |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|