Brauche Input: Präsentieren mit PureBasic

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Brauche Input: Präsentieren mit PureBasic

Beitrag von Kukulkan »

Hallo,

es freut mich, dass euch Pres3D gefällt. Danke für das Lob <)
machst du dort nun echtzeit ClipSprite3D() (aus dem Forum, DX9) hier ... oder machst du immer n Array mit Sprites3D im vorhinein ?
Ich generiere für jeden Buchstaben / Bild direkt kurz vor dem einblenden ein Array und generiere alle benötigten Sprites "on the fly". Ich codiere nicht erst ein ganzes Character-Set, sondern nur die Zeichen die benötigt werden. Wenn ein kleines "a" 10 mal vorkommt, wird es auch 10 mal berechnet. Wenn ich später Gradienten einbaue, dann wird das sowieso nötig. Ich male das Bild/Character erst auf ein Image (mit Alpha-Channel). Dann wird es als transparentes PNG gespeichert und als Sprite eingeladen (nervig, ich weiss). Daher auch die leichten Verzögerungen zwischen den Slides.
Färbst du die schrift mit Sprite3DColor() (aus dem Forum, DX9) ... oder machst du dafür auch n neues Character-Set ?
Im Moment wird die Schrift beim generieren der einzelnen Images/Sprites mit DrawText() geschrieben.
Hinweis noch ... Effects_List.ods kann ich hier zB nicht öffnen, da ich nur das echte Office habe.
Du meinst Du hast das falsche Office :lol: Die Datei ist nur aus versehen in's ZIP gerutscht. Eine Dokumentation des XML und der möglichen Werte steht noch aus. Das OO Dokument ist eigentlich nur für mich gedacht gewesen (als Gedächtnisstütze).

[update]Hab gerade eine Dokumentation zum slide.xml als PDF in die ZIP eingefügt. Jetzt kann jeder mit dem Ding spielen[/update]

Volker
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Brauche Input: Präsentieren mit PureBasic

Beitrag von STARGÅTE »

Ich male das Bild/Character erst auf ein Image (mit Alpha-Channel). Dann wird es als transparentes PNG gespeichert und als Sprite eingeladen (nervig, ich weiss). Daher auch die leichten Verzögerungen zwischen den Slides.
:freak: Oh je, ich verstehe. Ich finds auch etwas schade das SpriteOutput() nicht auch alles das kann was ImageOutput kann.
Da ich damals selber auch nicht jedes Image immer erst auf die HDD schreiben wollte und sowohl das Image als auch das Sprite ja 32Bit-Format haben, habe ich n Procedure geschrieben (PB-Only) die Image zu Sprite macht.

Code: Alles auswählen

Procedure ImageToSprite(Sprite, Image, Mode=#False)
  Protected Row
  Protected ImageHeight = ImageHeight(Image)
  Protected ImageWidth  = ImageWidth(Image)
  Protected *ReadBuffer,  ReadPitch,  ReadFormat 
  Protected *WriteBuffer, WritePitch, WriteFormat 
  StartDrawing(ImageOutput(Image))
    *ReadBuffer = DrawingBuffer()
    ReadPitch = DrawingBufferPitch()
    ReadFormat = DrawingBufferPixelFormat()
  StopDrawing()
  If Sprite = #PB_Any
    Sprite = CreateSprite(#PB_Any, ImageWidth, ImageHeight, Mode)
  Else
    CreateSprite(Sprite, ImageWidth, ImageHeight, Mode)
  EndIf
  StartDrawing(SpriteOutput(Sprite))
    *WriteBuffer = DrawingBuffer()
    WritePitch = DrawingBufferPitch()
    WriteFormat = DrawingBufferPixelFormat()
    If ReadFormat & #PB_PixelFormat_ReversedY XOr WriteFormat & #PB_PixelFormat_ReversedY
      For Row = 0 To ImageHeight-1
        CopyMemory(*ReadBuffer+(ImageHeight-1-Row)*ReadPitch, *WriteBuffer+Row*WritePitch, ImageWidth*SizeOf(Long))
      Next
    Else
      For Row = 0 To ImageHeight-1
        CopyMemory(*ReadBuffer+Row*ReadPitch, *WriteBuffer+Row*WritePitch, ImageWidth*SizeOf(Long))
      Next
    EndIf
  StopDrawing()
  ProcedureReturn Sprite
EndProcedure
Das funktioniert dnan so:

Code: Alles auswählen

InitSprite()
InitSprite3D()
  
CreateImage(1, 128,128,32|#PB_Image_Transparent)
StartDrawing(ImageOutput(1))
  DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
  Box(0,0,64,64,$80FFFFFF)
  Box(64,0,64,64,$8000FF00)
  Box(0,64,64,64,$80FF00FF)
StopDrawing()

OpenWindow(0, 0, 0, 800, 600, "Screen", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0)
   
ImageToSprite(1, 1, #PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
CreateSprite3D(1,1)
   
Repeat
 
  ClearScreen(0)
 
  Start3D()
   DisplaySprite3D(1, 100,100)
   DisplaySprite3D(1, 150,150)
  Stop3D()
   
  FlipBuffers()
 
Until WindowEvent() = #PB_Event_CloseWindow
Funktioniert jedoch nur für Sprites die mit #PB_Sprite_Texture|#PB_Sprite_AlphaBlending und Images die 32Bit haben,
Aber genau das hast du ja ...
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
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Brauche Input: Präsentieren mit PureBasic

Beitrag von Kukulkan »

Hallo STARGÅTE,

Wow, das klappt ja super. Ist es OK für Dich, wenn ich den Code (beinahe) unverändert so verwende?

Das ZIP aus dem ersten Post ist jetzt aktualisiert. Es sollte, vor allem auf älteren PC's, deutlich schneller von Folie zu Folie wechseln :) Schnelle PC's sollten kaum einen Unterschied feststellen.

Volker
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Brauche Input: Präsentieren mit PureBasic

Beitrag von STARGÅTE »

Jo klar kannst du das machen, deswegen hab ich es ja gepostet ...
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
Shadow-Gamer
Beiträge: 152
Registriert: 06.09.2009 13:31
Computerausstattung: NB: Intel P8700, Mobility ATI HD4650, 4GB, Win 7

Re: Brauche Input: Präsentieren mit PureBasic

Beitrag von Shadow-Gamer »

das Programm ist ja erotik pur, mach weiter so
Ich versuche ja nicht faul zu sein. :)
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Brauche Input: Präsentieren mit PureBasic

Beitrag von Kukulkan »

Hallo,

Update mit neuem WAVE-Effekt (für Text und Bilder). Der neue Effekt ist in die Beispiel-Slide am Ende eingebaut. Eingefügte XML Doku (PDF) ist auch auf dem neuesten Stand. Link im ersten Post ist aktualisiert (einfach neu runterladen).
das Programm ist ja erotik pur, mach weiter so
:lol: Sowas ähnliches sagt meine Frau auch immer zu mir :lol:
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Brauche Input: Präsentieren mit PureBasic

Beitrag von Kukulkan »

Hallo,

ich hab den Source von Pres3D zu Open Source gemacht (LGPL). Mehr Infos findet Ihr im englischen Forum hier: http://www.purebasic.fr/english/viewtop ... 14&t=43936

Viele Grüße,

Volker
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Brauche Input: Präsentieren mit PureBasic

Beitrag von STARGÅTE »

Hab mir den Code mal angeschaut ...

Ein paar Hinweise:
  • Du verwendest in den Macros fast überall diese #, obwohl sie fast überall garnicht benötigt wird.
    Der Platzhalter wird auch ersetzt wenn ein \ folgt ... bzw davor stand ...
    Wenn es deine Absicht war, dann ok, aber ich finds etwas überflüssig ...
  • MATRICE_Rotate_XYZ() kann optimiert werden.
    Dort benutzt du sehr oft Cos() und Sin() ... klar manche hier werden jetzt sagen, da kann man auch n Array nutzen, was superschnell ist. Aber hier würde es schon reichen, zu allen 3 Winkel Cos und Sie zu berechnen, und danach nur noch diese Werte multiplizieren, denn derzeit tauschen sachen wie Cos(Za#) bis zu 5 mal auf ...
  • Die Struktur PB_Sprite3D sieht irgendwie falsch aus ... zumindest wenn man es mit den anderen im Forum vergleich die auch mit dem Rückgabewert von IsSprite3D() arbeiten ...
Ansonsten danke fürs Open Source machen.
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
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Brauche Input: Präsentieren mit PureBasic

Beitrag von Kukulkan »

Hi STARGATE,

deine Kommentare beziehen sich alle auf die SuperSprite3D Funktionen. Das ist ein Include das ich direkt aus dem Forum entnommen habe. Es ist nicht von mir. Im Header findest Du die entsprechende Information.

Tatsächlich sollte durch eine Optimierung der Sin() und Cos() Funktionen eine Steigerung der Performance möglich sein. Ein interessanter Ansatz wäre schon, die zugehörigen Werte für Sin() und Cos() in einem Array vorzuberechnen und dann aus dem Array zu lesen. Dafür müssten alle Angaben allerdings mindestens mit dem Faktor 100 Multipliziert werden um einen tauglichen Array-Index zu haben. Evtl. ist das sogar nicht ausreichend und es müsste der Faktor 1000 her...

Evtl. möchte das jemand machen? Änderungen am Core nehme ich gerne entgegen und führe die dann im Source zusammen. Ich kann das ja dann sporadisch als Download aktualisieren.

Volker
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Brauche Input: Präsentieren mit PureBasic

Beitrag von STARGÅTE »

Um die Genauigkeits gehts da fast garnicht,
mit 1000 Indexwerte (0=0°, 1000=360°) habeich nur noch eine Abweichung von 0.2%

Problem ist nur, das ich einen Float-Winkel in einen Integer-Index umwandeln muss.
Das heißt ich brauche Int() und Mod() damit man immer im ArrayBereich bleibt ...
Kurze Tests ergaben, das es dadurch fast schon langsammer wird ...
Hinzu kommt ein Streckungsfaktor der den Winkel dann auf den Array-Bereich legt ...

Würde ich die schnellere Funktion % nehmen, bin ich auf Integer reduziert, wodurch bei hohen Winkeln ein Overflow entsteht.

Wenn man also weiß, das die übergebenen Winkel nicht zu groß werden, kann man folgenden Code nutzen, welcher bei mir
die Geschwindigkeit um ca 75% reduziert.

Code: Alles auswählen

#TrigPrecision = 1000

#TrigFactor    = #TrigPrecision/#PI/2

Global Dim SinArray.f(#TrigPrecision)
Global Dim CosArray.f(#TrigPrecision)

For Angle = 0 To #TrigPrecision
  SinArray(Angle) = Sin(Angle/#TrigFactor)
  CosArray(Angle) = Cos(Angle/#TrigFactor)
Next

Procedure.f Sinus(Angle.f)
  Protected Index.i = #TrigFactor*Angle
  ProcedureReturn SinArray(Index%#TrigPrecision)
EndProcedure

Procedure.f Cosinus(Angle.f)
  Protected Index.i = #TrigFactor*Angle
  ProcedureReturn CosArray(Index%#TrigPrecision)
EndProcedure


Abweichung.f
For n = 1 To 100
  zufall = Random(100000)
  Abweichung + Abs(Cosinus(zufall)-Cos(zufall))
  Abweichung + Abs(Sinus(zufall)-Sin(zufall))
Next
MessageRequester("Abweichung",StrF(Abweichung/200*100,4)+"%")

#Size = 100000

Time = ElapsedMilliseconds()
For n = 1 To #Size
  For i = 1 To 100
    Cosinus(n)
  Next
Next
Time1 = ElapsedMilliseconds()-Time

Time = ElapsedMilliseconds()
For n = 1 To #Size
  For i = 1 To 100
    Cos(n)
  Next
Next
Time2 = ElapsedMilliseconds()-Time

Time = ElapsedMilliseconds()
For n = 1 To #Size
  For i = 1 To 100
  Next
Next
Time3 = ElapsedMilliseconds()-Time

MessageRequester("Testergebnis", "Time1: "+Str(Time1-Time3)+Chr(10)+"Time2: "+Str(Time2-Time3))
Ich für mein Teil werden aber trotzdem weiterhin Cos() und Sin() nutzen.
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
Antworten