 |
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: 04.03.2010, 16:24 Titel: Copy-befehl vom einem Speicherbereich in den anderen. |
|
|
Ich suche einen memcopy-befehl in Freebasic.
Gibt es so etwas, wenn nein, was ist eine sehr schnelle Routine dafür?
Gruss |
|
Nach oben |
|
 |
tim.vogt

Anmeldungsdatum: 01.03.2009 Beiträge: 56
|
Verfasst am: 04.03.2010, 16:58 Titel: |
|
|
Einfach:
Dann kannst du memcpy benutzen. _________________ "Nichts ist wahrhaftig und alles ist erlaubt." |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 04.03.2010, 17:11 Titel: |
|
|
Jup, danke.
Das Bild ist aber Seitenverkehrt damit im "Sprite":
MemCpy sprite + 32, FiDataPointer,spritemenge
Wenn ich vorher Freeimage FlipVertical( FiDataPointer) eingebe, ändert sich nichts.
In welcher Reihenfolge und wie muss ich die Daten umkopieren?
Gruss
Code: |
#include "GL/gl.bi"
#include "GL/glu.bi"
#include "IrrlichtWrapper.bi"
#include "fbgfx.bi"
#INCLUDE "FreeImage393.bi"
#include "crt.bi"
USING FB
Declare Sub mScreenshot ()
Dim Shared Sprite As Any Ptr
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 shared As Integer new_x, new_y,xres1, yres1,xres2, yres2,bits,spritemenge,zz
ScreenRes 300,300,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( "ogl-sprite" )
MeshTexture = IrrGetTexture( "./media/testbild.bmp" )
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 )
xres1=100
yres1=100
xres2=200
yres2=200
spritemenge=xres2*yres2*4
bits=32
Sprite = ImageCreate(xres2,yres2)
While IrrRunning
Sleep 1
IrrBeginScene( 255,255,0 )
If multikey( FB.SC_W ) Then
IrrDrawScene
mScreenshot ()
Put (50,50),sprite,pset
End If
getmouse new_x, new_y
drehe = drehe+new_x/5000
drehen = drehen+new_y/5000
IrrSetNoderotation( TestNode, 0,0,drehe)
IrrSetNoderotation( TestNode1, drehen, 0,0 )
IrrDrawScene
IrrEndScene
Wend
IrrStop
Sub mScreenshot ()
Dim bitmap as FiBitmap ptr
Dim FiDataPointer as any ptr
bitmap = FreeImage_Allocate(xres2, yres2, bits)
FiDataPointer = FreeImage_GetBits(bitmap)
glReadPixels(xres1,yres1, xres2, yres2, GL_BGRA, GL_UNSIGNED_BYTE, FiDataPointer)
MemCpy sprite + 32, FiDataPointer,spritemenge
FreeImage_Unload(bitmap)
end Sub
|
|
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 04.03.2010, 18:21 Titel: |
|
|
MemCpy sprite + 32, FiDataPointer,spritemenge !?
Was soll hier sprite + 32 sein? sprite ist ne Variable, in der du das Bild abspeicherst, memcpy arbeitet mit Pointern. Du übergibst also überschreibst also dein Sprite mit den Daten aus FiDataPointer, lässt aber was aus, warum?
btw.: Du füllst das Forum mit deinen Codes etwas aus, verwende doch lieber ein Pastesystem, zB. Pastebin oder das vom FreeBASIC-Portal. |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 04.03.2010, 18:38 Titel: |
|
|
Code: |
Dim Shared Sprite As Any Ptr
|
Sprite wurde ganz oben als ptr dimensioniert und 32 ist der Header.
Das Sprite ist links im kleinen Freebasic-Screen zu sehen, mit "put" reingesetzt, ist quasi ein kopierter Ausschnitt aus dem Irrlichtscreen(Opengl) rechts.
Ich wollte immer neben dem Opengl-Screen einen 2. haben von Freebasic zum Zeichnen und Auswerten.
Da Irrlicht mit Opengl arbeitet und sehr gute Befehle für die Darstellung hat, ist es töricht sich mit dem anderen Opengl etwas zusammen zu zimmern.
Gruss |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 04.03.2010, 18:53 Titel: |
|
|
Das meinte ich ja, du überschreibst das Bild, den Header aber nicht. Naja egal... |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 04.03.2010, 19:37 Titel: |
|
|
Habe jetzt eine Lösung gefunden aus dem Portal.
Gruss |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 05.03.2010, 16:06 Titel: |
|
|
funkeld hat Folgendes geschrieben: | Da Irrlicht mit Opengl arbeitet und sehr gute Befehle für die Darstellung hat, ist es töricht sich mit dem anderen Opengl etwas zusammen zu zimmern. |
Habe ich was verpasst? Anderes OpenGL? |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 05.03.2010, 18:42 Titel: |
|
|
jup, habe die Version von meinem Opengl erhöht bzw neue Treiber geladen, weil das neue Irrlicht 1.7.1 tolle neue Befehle hat die jetzt auch vom Irrlichtwrapper 0.7.1 alpha von Freebasic angesprochen werden.
Wenn ich Demos vom neuen Irrlicht getestet hatte, wurde gemeckert , das meine Version Opengl diesen oder jenen Befehl umgangen hat.
Wer zu spät kommt , dem bestraft das Leben.
Sie mal zu, das du dein Projekt hier zu Ende bringst.
 |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 05.03.2010, 23:13 Titel: |
|
|
Ähm ja sicherlich.... |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 05.03.2010, 23:17 Titel: |
|
|
Dann meinst du aber nicht ein anderes OpenGL, sondern eine andere Version von OpenGL.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 06.03.2010, 13:50 Titel: |
|
|
Dann haben wir auch keine 3.000.000 Hartz-IV Empfänger sondern 3.000.000 arbeitssuchende, die aber vor 11.00 Uhr vormittags nicht aufstehen wollen, eine andere generation Menschen.
Gruss |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 06.03.2010, 13:58 Titel: |
|
|
Nein, denn es gibt nur ein OpenGL und das ist standardisiert. Der Standard wird halt gelegentlich erweitert, aber trotzdem ist es immer noch "das" OpenGL. Ich weiß jetzt nicht, bis zu welcher Version die FreeBASIC-Header reichen, es kann durchaus sein, dass da die neuesten Befehle noch nicht dabei sind - aber die neuen Header kann man sich ja auch automatisiert übersetzen lassen. _________________ » 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: 06.03.2010, 14:19 Titel: |
|
|
Für diese Routine möchte ich ein Ersatz, damit ich das Freeimage nicht immer mitschleppen muss:
FreeImage_FlipVertical(bitmap)
Brauche mal einen Vorschlag. geht irgendwie wieder mit Pointer?
Ansonsten funktioniert die Bildcopy in einem Speicherbereich mit Createimage(Sprite) wunderbar. Nur das Bild muss geflippt werden.
Gruss
Gruss
Code: |
Sub mScreenshot ()
glReadPixels(xres1,yres1, xres2, yres2, GL_BGRA, GL_UNSIGNED_BYTE, FiDataPointer)
FreeImage_FlipVertical(bitmap)
MemCpy sprite +32, FiDataPointer,xres2*yres2*4
End Sub
|
|
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 06.03.2010, 14:24 Titel: |
|
|
Wenn du das Bild nur spiegeln willst, dann mach es doch einfach, ein Code dafür ist nicht schwer zu erstellen.
Falls du Denkanstöße brauchst, schau im Projektforum den Code von Kirby an, da werden die Bilddateien auch gespiegelt. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 06.03.2010, 14:41 Titel: |
|
|
aus der "mir ist stink langweilig schnellcode zimerei"
Code: | #IfNDef MemCopy
Declare sub MemCopy cdecl alias "memcpy" (dest As Any Ptr, src As Any Ptr, length As ushort)
#EndIf
Sub ImageFlipVertical (Byref Image as any ptr)
Dim ImageWidth as UInteger=Peek(UInteger,Image+8)
Dim ImageHeight as UInteger=Peek(UInteger,Image+12)
Dim ImagePitch as UInteger=Peek(UInteger,Image+16)
Dim FlipImage as any ptr=ImageCreate(ImageWidth,ImageHeight)
ImageHeight-=1
For Y as UInteger=0 to ImageHeight
MemCopy (FlipImage+32+(Y*ImagePitch),Image+32+((ImageHeight-Y)*ImagePitch),ImagePitch-1)
Next Y
Deallocate Image
Image=FlipImage
End Sub
|
_________________
 |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 06.03.2010, 14:48 Titel: |
|
|
Hey Eternal_pain, nett dich mal wieder zu lesen
Aber:
Man sollte dem Benutzer funkeld nicht immer fertigen Code vorsetzten. Denn so lernt er nie eigenständig zu arbeiten. |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 06.03.2010, 15:00 Titel: |
|
|
Zitat: |
Man sollte dem Benutzer funkeld nicht immer fertigen Code vorsetzten. Denn so lernt er nie eigenständig zu arbeiten.
|
Ich war mal Beamter, jetzt Pensionär, jetzt werden eure Steuergelder verprasst.
Beamte arbeiten nicht, sie dienen....
Gruss an den Schmuddelarbeiter 28398
Zuletzt bearbeitet von funkeld am 06.03.2010, 15:01, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 06.03.2010, 15:00 Titel: |
|
|
Eternal_pain, danke.
Gruss |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 06.03.2010, 15:04 Titel: |
|
|
Zitat: |
Projektforum den Code von Kirby
|
Finde es nicht...dieses Proktforum für Freebasic.
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.
|
|