Graphics3D 800,600,32,2 bilderspeichern=0 ;0: sample zeigen ;1: texturen speichern ice=generatetexture(1-bilderspeichern,0,512,20,20,3,10,3,2,2,0,1,0,1,1,2,160,160,160,160,190,255,00,60,0,0,0,0,0,0,0,0,0,0,1) funky=generatetexture(1-bilderspeichern,0,512,20,20,3,1,3,2,2,0,1,0,1,1,2,0,255,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,1) kacheln=generatetexture(1-bilderspeichern,0,256,100,100,3,1,1,0,0,0,11,11,1,1,2,0,255,0,255,0,255,255,255,0,255,0,255,0,255,255,255,0,0,1) steel=generatetexture(1-bilderspeichern,0,512,20,20,3,25,1,2,2,0,1,0,1,1,2,120,180,120,130,120,130,5,12,0,0,0,0,0,0,0,0,0,0,1) gras=generatetexture(1-bilderspeichern,0,512,100,100,3,1,1,0.1,0.1,0,1,0,1,1,2,20,100,50,150,20,40,255,255,0,0,0,0,0,0,0,0,0.95,2,1) clouds=generatetexture(1-bilderspeichern,0,512,100,100,3,3,3,1,1,0,1,0,1,1,2,255,255,255,255,255,255,10,100,0,0,0,0,0,0,0,0,0,0,1) wood=generatetexture(1-bilderspeichern,0,512,20,20,3,3,1,0.2,0.2,0,1,11,1,1,2,20,40,10,20,10,20,3,15,0,50,0,50,0,50,255,255,0.7,1,1) skclouds=generatetexture(1-bilderspeichern,0,512,10,10,3,10,3,0.1,0.1,0,1,0,1,1,2,80,100,80,100,100,255,25,40,0,0,0,0,0,0,0,0,0,0,1) wood=generatetexture(1-bilderspeichern,0,512,20,20,3,3,1,0.2,0.2,0,1,11,1,1,2,20,40,10,20,10,20,3,15,0,50,0,50,0,50,255,255,0.7,1,1) gfxsonne=generatetexture(1-bilderspeichern,0,512,10,10,3,1,1,0.5,0.5,0,4,4,2,2,2,0,105,0,105,0,105,255,255,0,105,0,105,0,105,255,255,0,0,1) gebuesch=generatetexture(1-bilderspeichern,0,512,30,30,3,3,3,1,1,0,1,11,1,0,2,0,255,255,255,0,255,5,50,0,0,0,0,0,0,0,0,0,0,1) If bilderspeichern=1 Then SaveImage ice,"ice.bmp" SaveImage funky,"funky.bmp" SaveImage kacheln,"kacheln.bmp" SaveImage steel,"steel.bmp" SaveImage gras,"gras.bmp" SaveImage clouds,"clouds.bmp" SaveImage wood,"wood.bmp" SaveImage gebuesch,"gebuesch.bmp" End EndIf sky=CreateCube() sonne=CreateSprite(sky) EntityTexture sky,skclouds EntityOrder sonne,1 PositionEntity sonne,0,1,2 EntityBlend sonne,3 EntityTexture sonne,gfxsonne EntityOrder sky,1 FlipMesh sky ScaleEntity sky,2,2,2 ;irgendwelches zeugs erstellen s=CreateSphere() ScaleMesh s,2,2,2 PositionEntity s,0,2,0 ScaleMesh s,2,2,2 EntityTexture s,funky ;bei dem ding musste ich einen strukturlayer über die kacheltextur tun weil die über keine abweichungen verfügt... c=CreateCube() ScaleEntity c,5,5,5 PositionEntity c,-15,5,10 ScaleTexture kacheln,0.1,0.1 EntityTexture c,kacheln TextureBlend clouds,2 ScaleTexture clouds,2.4,2.4 EntityTexture c,clouds,0,1 p=CreatePlane() ScaleTexture gras,5,5 EntityTexture p,gras ScaleTexture steel,1,1 o=CreateCube() PositionEntity o,-10,3,-10 ScaleEntity o,3,3,3 EntityTexture o,steel ScaleTexture ice,0.3,0.3 q=CreateCone(4,1) ScaleEntity q,5,5,5 PositionEntity q,14,4,4 EntityTexture q,ice r=CreateCylinder() ScaleEntity r,4,7,4 PositionEntity r,10,5,-15 ScaleTexture wood,.1,0.1 EntityTexture r,wood g=CreateSphere() ScaleEntity g,4,6,4 PositionEntity g,10,3,20 ScaleTexture gebuesch,.3,0.6 EntityTexture g,gebuesch SetBuffer BackBuffer() AmbientLight 255,255,255 camera=CreateCamera() CameraClsColor camera,255,255,0 PositionEntity camera,5,5,5 MoveMouse 512,512 camyaw#=90 campitch#=0 CameraFogColor camera,110,110,255 CameraFogRange camera,5,60 CameraFogMode camera,1 ;kucken Repeat camyaw#=camyaw#-MouseXSpeed()/3. campitch#=campitch#+MouseYSpeed()/3. RotateEntity camera,campitch,camyaw,0 MoveMouse 512,512 MoveEntity camera,(-KeyDown(30)+KeyDown(32))*0.3,0,(KeyDown(17)-KeyDown(31))*0.3 PositionEntity sky,EntityX(camera),EntityY(camera),EntityZ(camera) RenderWorld Flip Until KeyHit(1) End Function generatetexture(textur,seed,texres,Xres,Yres,trimode,layerzahl,layerblendmode,vertnoiseX#,vertnoiseY#,flatshading,Xcolormethod,Ycolormethod,Xcolorfact#,Ycolorfact#,combinemethod,xRmin,xRmax,xGmin,xGmax,xBmin,xBmax,xalphamin,xalphamax,yRmin,yRmax,yGmin,yGmax,yBmin,yBmax,yalphamin,yalphamax,Colordamping#,dampingsteps,Colors#) ;textur: ;1 wird als textur zurückgegeben ;0 wird als bild zurückgegeben (für speichern und so) ;seed: ;bestimmte variante auswählen, falls nicht gewünscht 0 lassen ;texres: textur-bildauflösung in pixel ;xres/yres: anzahl unterteilungen in x/y richtung ;trimode: welche ausrichtung die tris der unterteilungen haben sollen ;1=rechts oben nach links unten ;2=links oben nach rechts unten ;3=random ;layerzahl: anzahl überlagerte layer ;layerblendmode: blendmode der layer, 1= normal, 3=addieren (siehe entityblend) ;vertnoisex#,vertnoisey#: zufällige positions-variation der vertex in % ;xcolormethod,ycolormethod: einstellen der farbauswahl (zwischen min und max) in x und y richtung ;standart ;1=rand ;2=sin ;3=linear ;4=quadratisch ;5=random streifen ;muster ;11=tan-lattenmuster ;xcolorfact#,ycolorfact#: einstellen der frequenz für die farbauswahl in x und y richtung ;combinemethod: wie die x und die y ebene kombiniert werden sollen ;1 multiplizieren ;2 addieren ;3 pythagoras ;xrmin,xrmax,xgmin,xgmax,xbmin,xbmax,xalphamin,xalphamax: argb-farbrange entlang der x achse ;yrmin,yrmax,ygmin,ygmax,ybmin,ybmax,yalphamin,yalphamax: argb-farbrange entlang der y achse ;Colordamping#: um wieviel % die farben aufeinander angepassst werden sollen ;dampingsteps: wieviel mal dieser vorgang widerholt werden soll ;Colors#: farbkontrast % (0=farblos) If seed=0 Then SeedRnd MilliSecs() EndIf cam=CreateCamera() CameraClsColor cam,0,0,0 PositionEntity cam,0,0,-1 CameraRange cam,0.1,100 meshes=CreateBank (4*layerzahl) brush=CreateBrush() BrushFX brush,32+2+1+4*flatshading BrushBlend brush,layerblendmode colorbank=CreateBank((Xres)*(Yres)*4) For layer=1 To layerzahl ;zuerst mal die farben in die colorbank schreiben For ypos=1 To Yres For xpos=1 To Xres ;den x-verlauf If Xcolormethod=1 Then r1=Rand(xRmin,xRmax) g1=Rand(xGmin,xGmax) b1=Rand(xBmin,xBmax) a1#=Rand(xalphamin,xalphamax) ElseIf Xcolormethod=2 Then r1=Abs(Sin(1.*(xpos-1)/(Xres-1)*180*Xcolorfact))*(1.*xRmax-xRmin)+xRmin g1=Abs(Sin(1.*(xpos-1)/(Xres-1)*180*Xcolorfact))*(1.*xGmax-xGmin)+xGmin b1=Abs(Sin(1.*(xpos-1)/(Xres-1)*180*Xcolorfact))*(1.*xBmax-xBmin)+xBmin a1=Abs(Sin(1.*(xpos-1)/(Xres-1)*180*Xcolorfact))*(1.*xalphamax-xalphamin)+xalphamin ElseIf Xcolormethod=3 Then r1=(1-Abs((xpos-1)-((Xres-1)/2.))/(Xres-1))*(1.*xRmax-xRmin)+xRmin g1=(1-Abs((xpos-1)-((Xres-1)/2.))/(Xres-1))*(1.*xGmax-xGmin)+xGmin b1=(1-Abs((xpos-1)-((Xres-1)/2.))/(Xres-1))*(1.*xBmax-xBmin)+xBmin a1=(1-Abs((xpos-1)-((Xres-1)/2.))/(Xres-1))*(1.*xalphamax-xalphamin)+xalphamin ElseIf Xcolormethod=4 Then r1=(1-Abs((xpos-1)-((Xres-1)/2.))^2/(Xres-1)^2*10)*(1.*xRmax-xRmin)+xRmin g1=(1-Abs((xpos-1)-((Xres-1)/2.))^2/(Xres-1)^2*10)*(1.*xGmax-xGmin)+xGmin b1=(1-Abs((xpos-1)-((Xres-1)/2.))^2/(Xres-1)^2*10)*(1.*xBmax-xBmin)+xBmin a1=(1-Abs((xpos-1)-((Xres-1)/2.))^2/(Xres-1)^2*10)*(1.*xalphamax-xalphamin)+xalphamin ElseIf Xcolormethod=5 Then SeedRnd xpos*Xcolorfact r1=Rand(xRmin,xRmax) g1=Rand(xGmin,xGmax) b1=Rand(xBmin,xBmax) a1#=Rand(xalphamin,xalphamax) SeedRnd MilliSecs() ElseIf Xcolormethod=11 Then r1=(0.5+0.1*Tan(1.*(xpos-1)/(Xres-1)*180*Xcolorfact))*(1.*xRmax-xRmin)+xRmin g1=(0.5+0.1*Tan(1.*(xpos-1)/(Xres-1)*180*Xcolorfact))*(1.*xGmax-xGmin)+xGmin b1=(0.5+0.1*Tan(1.*(xpos-1)/(Xres-1)*180*Xcolorfact))*(1.*xBmax-xBmin)+xBmin a1=(0.5+0.1*Tan(1.*(xpos-1)/(Xres-1)*180*Xcolorfact))*(1.*xalphamax-xalphamin)+xalphamin EndIf ;den y-verlauf If Ycolormethod=1 Then r2=Rand(yRmin,yRmax) g2=Rand(yGmin,yGmax) b2=Rand(yBmin,yBmax) a2#=Rand(yalphamin,yalphamax) ElseIf Ycolormethod=2 Then r2=Abs(Sin(1.*(ypos-1)/(Yres-1)*180*Ycolorfact))*(1.*yRmax-yRmin)+yRmin g2=Abs(Sin(1.*(ypos-1)/(Yres-1)*180*Ycolorfact))*(1.*yGmax-yGmin)+yGmin b2=Abs(Sin(1.*(ypos-1)/(Yres-1)*180*Ycolorfact))*(1.*yBmax-yBmin)+yBmin a2=Abs(Sin(1.*(ypos-1)/(Yres-1)*180*Ycolorfact))*(1.*yalphamax-yalphamin)+yalphamin ElseIf Ycolormethod=3 Then r2=(1-Abs((ypos-1)-((Yres-1)/2.))/(Yres-1))*(1.*yRmax-yRmin)+yRmin g2=(1-Abs((ypos-1)-((Yres-1)/2.))/(Yres-1))*(1.*yGmax-yGmin)+yGmin b2=(1-Abs((ypos-1)-((Yres-1)/2.))/(Yres-1))*(1.*yBmax-yBmin)+yBmin a2=(1-Abs((ypos-1)-((Yres-1)/2.))/(Yres-1))*(1.*yalphamax-yalphamin)+yalphamin ElseIf Ycolormethod=4 Then r2=(1-Abs((ypos-1)-((Yres-1)/2.))^2/(Yres-1)^2*10)*(1.*yRmax-yRmin)+yRmin g2=(1-Abs((ypos-1)-((Yres-1)/2.))^2/(Yres-1)^2*10)*(1.*yGmax-yGmin)+yGmin b2=(1-Abs((ypos-1)-((Yres-1)/2.))^2/(Yres-1)^2*10)*(1.*yBmax-yBmin)+yBmin a2=(1-Abs((ypos-1)-((Yres-1)/2.))^2/(Yres-1)^2*10)*(1.*yalphamax-yalphamin)+yalphamin ElseIf Ycolormethod=5 Then SeedRnd ypos*Ycolorfact r2=Rand(yRmin,yRmax) g2=Rand(yGmin,yGmax) b2=Rand(yBmin,yBmax) a2#=Rand(yalphamin,yalphamax) SeedRnd MilliSecs() ElseIf Ycolormethod=11 Then r2=(0.5+0.1*Tan(1.*(ypos-1)/(Yres-1)*180*Ycolorfact))*(1.*yRmax-yRmin)+yRmin g2=(0.5+0.1*Tan(1.*(ypos-1)/(Yres-1)*180*Ycolorfact))*(1.*yGmax-yGmin)+yGmin b2=(0.5+0.1*Tan(1.*(ypos-1)/(Yres-1)*180*Ycolorfact))*(1.*yBmax-yBmin)+yBmin a2=(0.5+0.1*Tan(1.*(ypos-1)/(Yres-1)*180*Ycolorfact))*(1.*yalphamax-yalphamin)+yalphamin EndIf ;zusammenmixen If combinemethod=1 Then r=1.*(r1*r2) g=1.*(g1*g2) b=1.*(b1*b2) a#=1.*(a1*a2) ElseIf combinemethod=2 Then r=r1+r2 g=g1+g2 b=b1+b2 a=a1+a2 ElseIf combinemethod=3 Then r=Sqr(r1^2+r2^2) g=Sqr(g1^2+g2^2) b=Sqr(b1^2+b2^2) a=Sqr(a1^2+a2^2) EndIf ;ausreisser abfangen If r>255 Then r=255 If g>255 Then g=255 If b>255 Then b=255 If a>255 Then a=255 If r<0 Then r=0 If g<0 Then g=0 If b<0 Then b=0 If a<0 Then a=0 ;und speichern PokeByte colorbank,4*(Yres*(ypos-1)+(xpos-1))+0,r PokeByte colorbank,4*(Yres*(ypos-1)+(xpos-1))+1,g PokeByte colorbank,4*(Yres*(ypos-1)+(xpos-1))+2,b PokeByte colorbank,4*(Yres*(ypos-1)+(xpos-1))+3,a Next Next ;die funktion zum verwischen der farben For Steps=1 To dampingsteps For ypos=1 To Yres-1 For xpos=1 To Xres-1 r=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1))+0) g=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1))+1) b=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1))+2) a=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1))+3) ;es werden die farben der punkte über,unter,links und rechts des aktuellen punktes ermittelt ;rechts r1=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1+1))+0) g1=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1+1))+1) b1=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1+1))+2) a1#=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1+1))+3) ;links (falls der punkt in der ersten reihe liegt von der rechtesten reihe nehmen, ;bei "rechts" und "unter" ist das unnötig weil diese verts eh noch umgefärbt werden wegen dem seamless) If xpos=1 Then r2=PeekByte(colorbank,4*(Yres*(ypos-1)+(Xres-1))+0) g2=PeekByte(colorbank,4*(Yres*(ypos-1)+(Xres-1))+1) b2=PeekByte(colorbank,4*(Yres*(ypos-1)+(Xres-1))+2) a2=PeekByte(colorbank,4*(Yres*(ypos-1)+(Xres-1))+3) Else r2=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1-1))+0) g2=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1-1))+1) b2=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1-1))+2) a2=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1-1))+3) EndIf ;über (falls der punkt in der ersten reihe liegt von der untersten reihe nehmen, ;bei "rechts" und "unter" ist das unnötig weil diese verts eh noch umgefärbt werden wegen dem seamless) If ypos=1 Then r3=PeekByte(colorbank,4*(Yres*(Yres-1)+(xpos-1))+0) g3=PeekByte(colorbank,4*(Yres*(Yres-1)+(xpos-1))+1) b3=PeekByte(colorbank,4*(Yres*(Yres-1)+(xpos-1))+2) a3=PeekByte(colorbank,4*(Yres*(Yres-1)+(xpos-1))+3) Else r3=PeekByte(colorbank,4*(Yres*(ypos-1-1)+(xpos-1))+0) g3=PeekByte(colorbank,4*(Yres*(ypos-1-1)+(xpos-1))+1) b3=PeekByte(colorbank,4*(Yres*(ypos-1-1)+(xpos-1))+2) a3=PeekByte(colorbank,4*(Yres*(ypos-1-1)+(xpos-1))+3) EndIf ;unter r4=PeekByte(colorbank,4*(Yres*(ypos-1+1)+(xpos-1))+0) g4=PeekByte(colorbank,4*(Yres*(ypos-1+1)+(xpos-1))+1) b4=PeekByte(colorbank,4*(Yres*(ypos-1+1)+(xpos-1))+2) a4=PeekByte(colorbank,4*(Yres*(ypos-1+1)+(xpos-1))+3) ;kurz mixen r=r*(1-Colordamping)+(r1+r2+r3+r4)/4.*Colordamping g=g*(1-Colordamping)+(g1+g2+g3+g4)/4.*Colordamping b=b*(1-Colordamping)+(b1+b2+b3+b4)/4.*Colordamping a=a*(1-Colordamping)+(a1+a2+a3+a4)/4.*Colordamping ;und zurückschrieben PokeByte colorbank,4*(Yres*(ypos-1)+(xpos-1))+0,r PokeByte colorbank,4*(Yres*(ypos-1)+(xpos-1))+1,g PokeByte colorbank,4*(Yres*(ypos-1)+(xpos-1))+2,b PokeByte colorbank,4*(Yres*(ypos-1)+(xpos-1))+3,a Next Next Next m=CreateMesh() su=CreateSurface(m,brush) EntityOrder m,-1 For ypos=1 To Yres For xpos=1 To Xres ;fertige farbpunkte auslesen r=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1))+0) g=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1))+1) b=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1))+2) a#=PeekByte(colorbank,4*(Yres*(ypos-1)+(xpos-1))+3)/255. ;vertex-zufallsverschiebung vorberechnen noisex#=Rnd(-vertnoiseX#,vertnoiseX#)/(Xres-1) noisey#=Rnd(-vertnoiseY#,vertnoiseY#)/(Yres-1) ;funktion für die farbentsättigung d=(r+g+b)/3 r=r*(Colors)+d*(Colors-1) g=g*(Colors)+d*(Colors-1) b=b*(Colors)+d*(Colors-1) ;zeugs für die nahtlosen übergänge ;an den rändern gibts keine vertexverschiebung If xpos=1 Or xpos=Xres Then noisex=0 If ypos=1 Or ypos=Yres Then noisey=0 ;und die farbe der letzten reihen stimmt mit denen der ersten überein If xpos=Xres Then r=VertexRed(su,(1-1)+(ypos-1)*Yres) g=VertexGreen(su,(1-1)+(ypos-1)*Yres) b=VertexBlue(su,(1-1)+(ypos-1)*Yres) a=VertexAlpha(su,(1-1)+(ypos-1)*Yres) EndIf If ypos=Yres Then r=VertexRed(su,(xpos-1)+(1-1)*Yres) g=VertexGreen(su,(xpos-1)+(1-1)*Yres) b=VertexBlue(su,(xpos-1)+(1-1)*Yres) a=VertexAlpha(su,(xpos-1)+(1-1)*Yres) EndIf ;vertex erzeugen vertex=AddVertex(su,-1+2.*(xpos-1)/(Xres-1)+noisex,-1+2.*(ypos-1)/(Yres-1)+noisey,0) VertexColor su,vertex,r,g,b,a ;tris malen If xpos>1 And ypos>1 Then If trimode =1 Then AddTriangle su,(xpos-2)+(ypos-1)*Yres,(xpos-1)+(ypos-1)*Yres,(xpos-1)+(ypos-2)*Yres AddTriangle su,(xpos-2)+(ypos-1)*Yres,(xpos-1)+(ypos-2)*Yres,(xpos-2)+(ypos-2)*Yres ElseIf trimode=2 Then AddTriangle su,(xpos-2)+(ypos-2)*Yres,(xpos-1)+(ypos-1)*Yres,(xpos-1)+(ypos-2)*Yres AddTriangle su,(xpos-2)+(ypos-2)*Yres,(xpos-2)+(ypos-1)*Yres,(xpos-1)+(ypos-1)*Yres ElseIf trimode=3 Then If Rand(1,2)=1 Then AddTriangle su,(xpos-2)+(ypos-1)*Yres,(xpos-1)+(ypos-1)*Yres,(xpos-1)+(ypos-2)*Yres AddTriangle su,(xpos-2)+(ypos-1)*Yres,(xpos-1)+(ypos-2)*Yres,(xpos-2)+(ypos-2)*Yres Else AddTriangle su,(xpos-2)+(ypos-2)*Yres,(xpos-1)+(ypos-1)*Yres,(xpos-1)+(ypos-2)*Yres AddTriangle su,(xpos-2)+(ypos-2)*Yres,(xpos-2)+(ypos-1)*Yres,(xpos-1)+(ypos-1)*Yres EndIf EndIf EndIf Next Next UpdateNormals m PokeInt meshes,4*(layer-1),m Next ;rendern der textur CameraViewport cam,0,0,texres,texres SetBuffer BackBuffer() RenderWorld ;speichern und zurückgeben (als bild oder textur) If textur=0 Then texture=CreateImage(texres,texres) CopyRect 0,0,texres,texres,0,0,BackBuffer(),ImageBuffer(texture) Else texture=CreateTexture(texres,texres) CopyRect 0,0,texres,texres,0,0,BackBuffer(),TextureBuffer(texture) EndIf For layer=1 To layerzahl m=PeekInt(meshes,4*(layer-1)) FreeEntity m Next FreeBank colorbank FreeBank meshes FreeEntity cam Return texture End Function ;~IDEal Editor Parameters: ;~C#Blitz3D