MetallTextureMaker -_-

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Holzchopf

Meisterpacker

Betreff: MetallTextureMaker -_-

BeitragSo, Jun 27, 2004 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieses kleine Programm erstellt eine Textur oder ein Bild einer Metalloberfläche. Man kann aber nicht nur Metall "erstellen" sondern auch ganz andere Dinge, zb: Grashalme, Glastexturen, Sand etc...
Einfach mit den Parametern rumspielen, ich glaub ich habe sie genug dokumentiert und auskommentiert.

Code: [AUSKLAPPEN]

Graphics 400,300,32,2
AppTitle "MTM (MetallTextureMaker -_- ) - by Holzchopf"

SeedRnd MilliSecs()

;************************************************

; Soll die erstellte Textur Kachelbar sein?
Kachelbar   = True

; Soll die erstellte Textur gespeichert werden?
Speichern   = False

; Wenn ja, wohin?
Pfad$      = "Metalltextur.bmp"


; RGB-Werte der Grundfarben
RGB_Rot      = 128
RGB_Gruen   = 128
RGB_Blau   = 128

; ± Toleranz der Farbe, welche die einzelnen
;   Streifen haben dürfen ( > Je weniger, umso
;   feiner wirken die "Kratzer" )
RGB_Toleranz   = 2

; Mindest- und Höchstwerte, welche die Farben
;   erreichen dürfen
RGB_Rot_Min      = 0
RGB_Rot_Max      = 256

RGB_Gruen_Min   = 0
RGB_Gruen_Max   = 256

RGB_Blau_Min   = 0
RGB_Blau_Max   = 256

; Mindest- und Maximallänge der Streifen
Laenge_Min   = 5
Laenge_Max   = 40

; Winkel der Streifen
Winkel      = 0

; ± Toleranz des Winkels
Winkel_Tol   = 0

; Form der Streifen ( > Parameter:
;   0 = Gerade
;   1 = Rund ( Mittelpunkt beachten )
Form      = 0

; Mittelpunkt, wenn Form = 1
Zentr_X      = 0
Zentr_Y      = 0

; Radiusbereich ( Entfernung ) der Streifen zum
;   Mittelpunkt bei Form = 1
Radius_Min   = 0
Radius_Max   = 100

; Winkelbereich der Streifen bei Form = 1
Winkel_Min   = 90
Winkel_Max   = 180

; Dimensionen des Bildes
Breite      = 128
Hoehe      = 128

; Anzahl Streifen ( > Je weniger, umso glatter
;   wirkt die Oberfläche )
ANZ_Streifen   = 10000


;*************************************************

bild = CreateImage( Breite, Hoehe )
bild_buf = ImageBuffer( bild )

SetBuffer bild_buf

   ; Den Bereich grundieren
   Color RGB_Rot, RGB_Gruen, RGB_Blau
   Rect 0,0, Breite, Hoehe

   LockBuffer bild_buf

   ; Alle Streifen bearbeiten
   For i = 0 To ANZ_Streifen
   
      ; Die Länge im angegeben Bereich festlegen
      Laenge = Rand( Laenge_Min, Laenge_Max )
      ; Die Startposition des Streifens festlegen
      XPos = Rand( 0, Breite - 1 )
      YPos = Rand( 0, Hoehe - 1 )
      ; Die Farbabweichung des Streifens festlegen
      Abweichung = Rand( -RGB_Toleranz, RGB_Toleranz )

      If Form = 0
         ; Die Winkelabweichung festlegen
         wnk = Winkel + Rand( -Winkel_Tol, Winkel_Tol )
      Else
         ; Den Radius und Startwinkel festlegen
         wnk = Rand( Winkel_Min, Winkel_Max - Laenge )
         radius = Rand( Radius_Min, Radius_Max )
      EndIf

      ; Den Streifen malen
      For l = 0 To Laenge

         If Form = 0
            ; X- und Y-Position unter Winkel berechnen
            x = XPos + Cos( wnk ) * l
            y = YPos + Sin( wnk ) * l
         Else
            ; X- und Y-Position unter Winkel und Radius
            ;   ausgehend vom Zentrum berechnen
            x = Zentr_X + Cos( wnk ) * radius
            y = Zentr_Y + Sin( wnk ) * radius
            ; Den Winkel um 1 erhöhen ( sonst gibts keine
            ;   Kreise )
            wnk = wnk + 1
         EndIf

         If Kachelbar = 1
            ; X und Y bei Über- resp. Unterlauf auf die
            ;   Andere Seite setzen
            x = ( x + Breite ) Mod Breite
            y = ( y + Hoehe ) Mod Hoehe
         EndIf

         ; Pixel nur bearbeiten wenn Position innerhalb
         ;   der Bildgrösse liegt ( bei Kachelbar = 0 kann
         ;   dies vorkommen )
         If x => 0 And x < Breite And y => 0 And y < Hoehe

            ; Pixel auslesen und die einzelnen Farb-
            ;   anteile ausrechnen
            RGB = ReadPixelFast( x, y )

            Rot = ( RGB And $FF0000 ) Shr 16
            Gruen = ( RGB And $00FF00 ) Shr 8
            Blau = ( RGB And $0000FF )

            ; Die einzelnen Farbanteile mit der Abweichung
            ;   verfälschen und sie im Toleranzfeld halten
            Rot = Rot + Abweichung
            If Rot > RGB_Rot_Max Then Rot = RGB_Rot_Max
            If Rot < RGB_Rot_Min Then Rot = RGB_Rot_Min

            Gruen = Gruen + Abweichung
            If Gruen > RGB_Gruen_Max Then Gruen = RGB_Gruen_Max
            If Gruen < RGB_Gruen_Min Then Gruen = RGB_Gruen_Min

            Blau = Blau + Abweichung
            If Blau > RGB_Blau_Max Then Blau = RGB_Blau_Max
            If Blau < RGB_Blau_Min Then Blau = RGB_Blau_Min

            ; RGB zusammenrechnen und Pixel zeichnen
            RGB = ( Rot Shl 16 ) + ( Gruen Shl 8 ) + Blau

            WritePixelFast x, y, RGB

         EndIf

      Next
   Next

   UnlockBuffer bild_buf

;*************************************************

If Speichern Then SaveImage( Bild, Pfad )

;*************************************************

SetBuffer BackBuffer()

While Not KeyHit(1)

   Cls

   DrawImage Bild, 0, 0

   Flip

Wend

End


Eine Idee - die Geschwindigkeit zu optimieren - wäre natürlich, statt direkt Pixel zu lesen und zu schreiben, alles zuerst in eine Bank speichern und danach erst malen. Aber das hier ist ja kein Geschwindigkeitswettbewerb Rolling Eyes
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
  • Zuletzt bearbeitet von Holzchopf am So, Feb 06, 2005 21:39, insgesamt einmal bearbeitet
 

OJay

BeitragSo, Jun 27, 2004 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
garnicht mal schlecht. mit handgefertigten texturen natürlich nicht zu vergleichen...aber für einen algorythmus nicht schlecht Wink

interessante settings sind auch:
- rgb 100-200
- laenge_max = 400
- form = 1
- radius_max = 100


in einer funktion, fertig zum includen währe das sicher eine feine sache... Smile
 

Bolo Loco

BeitragMo, Jun 28, 2004 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Verdammt - das ding ist gut !!!! Glückwunsch !

Ich habe nur kurz mit den Parametern ein bißchen rumgespielt und
habe schon eine ganze handvoll an Texturen ,die man ganz
hervorragend als Layer benutzen kann.
Also an deiner Stelle würde ich das ganze noch ausbauen:

- nette GUI
- abspeichern von Einstellungen
- weitere Algorithmen ( Perlin Noise ? )

Tja,ich sage ersteinmal : Vielen Dank !

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group