Procedural dynamic textures

Blitz3D Forums/Blitz3D Programming/Procedural dynamic textures

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

My simple "perlin-noise" generator


;2-óðîâíåâûé ãåíåðàòîð øóìà Ïåðëèíà (ïî÷òè)
;äëÿ óïðîùåíèÿ è óñêîðåíèÿ èñïîëüçóåòñÿ ðåíäåð âèäþõè
;ñîçäàííàÿ òåêñòóðà ìîæåò ãåíåðèòüñÿ "áåñøîâíîé" ïî ãîðèçîíòàëè è âåðòèêàëè


Global GW=1280
Global GH=1024

Graphics3D GW,GH,0,1
Global cam=CreateCamera()
SetFont LoadFont ("",15)
Dim s(100)
Dim t(100)
Dim sp(100)


tx=CreateTexture(GH,GH,1)
i=0
sp(i)=CreateQuad()
EntityFX sp(i),1+8+16
EntityOrder sp(i),-i
PositionEntity sp(i),0,0,Float(GW)/Float(GH)
EntityTexture sp(i),tx

.loop
	r0=Rand(9,10)
	r1=Rand(0,5)
	Generate r0,r1,tx,1,1
	AutoContrast 1,tx		;ôèëüòð àâòîêîíòðàñòíîñòè ñ óïðàâëÿåìûì ïîðîãîì "÷åðíîãî"
	RenderWorld
	Text 10,10,"Base Freq: "+Str(r0)
	Text 10,25,"Modulate Freq: "+Str(r1)
	Text 10,40,"G - new generate"
	Flip 0
	k=WaitKey()
	If k=103 Then Goto loop
End




;iq - ÷àñòîòà ãåíåðàöèè îñíîâíîãî àääèòèâíîãî øóìà (âñå ÷àñòîòíûå ñîñòàâëÿþùèå ÑÊËÀÄÛÂÀÞÒÑß)
;iq = 2 ... 10 (1024 pix)

;iq0 - ÷àñòîòà ãåíåðàöèè ìîäóëÿöèîííîãî øóìà (øóì iq ÓÌÍÎÆÀÅÒÑß íà øóì iq0)
;åñëè iq0<1 òî íåãåíåðèòüñÿ
;ìíîé èñïîëüçîâàí äëÿ ãåíåðàöèè íèçêî÷àñòîòíûõ ìîäóëÿöèé îñíîâíîãî øóìà - "îáëàêîâ"

;tt - òåêñòóðíûé áóôôåð, êóäà áóäåò ïîìåùåíà ñãåíåðåííûé øóì

;lpX è lpY - ôëàãè "áåñøîâíîñòè" ïî îñÿõ X è Y

;ðàçìåð òåêñòóðû ãåíåðÿùåéñÿ òåêñòóðû = 2^iq (2^iq0), òàêæå çàâèñèò îò âèäåîðàçðåøåíèÿ
;è âîîáùå âîçìîæíîñòåé âèäåîêàðòû

Function Generate(iq,iq0,tt,lpX=0,lpY=0)
	RotateEntity cam,0,180,0
	CameraClsColor cam,0,0,0

	SeedRnd MilliSecs ()

	For i=2 To iq
		s(i)=CreateQuad()
		EntityFX s(i),1+8+16
		EntityOrder s(i),-i
		PositionEntity s(i),0,0,-Float(GW)/Float(GH)
		EntityAlpha s(i),1.0/Float(iq)
		EntityBlend s(i),3
		
		d=2^i
		t(i)=CreateTexture (d,d,1)
		b=TextureBuffer( t(i) )
		SetBuffer b
		LockBuffer b
		For x=0 To d-1
			For y=0 To d-1
				c=Rand(0,255)
				WritePixelFast x,y,(c Shl 16)+(c Shl 8)+c
			Next
		Next
		
		If lpX>0 Then
		For y=0 To d-1				;áåñøîâíîñòü ïî ãîðèçîíòàëè
			c=ReadPixelFast (0,y)
			WritePixelFast d-1,y,c
		Next
		EndIf
		If lpY>0 Then
		For x=0 To d-1				;áåñøîâíîñòü ïî âåðòèêàëè
			c=ReadPixelFast (x,0)
			WritePixelFast x,d-1,c
		Next
		EndIf
		
		UnlockBuffer b

		kk#=Float(d)/Float(d-1)
		ScaleEntity s(i),kk,1.0,1.0
		EntityTexture s(i),t(i)
	Next

	SeedRnd MilliSecs ()
	
	If iq0>0 Then
	For i=1 To iq0
		i0=iq+i
		
		s(i0)=CreateQuad()
		EntityFX s(i0),1+8+16
		EntityOrder s(i0),-i0
		PositionEntity s(i0),0,0,-Float(GW)/Float(GH)
		EntityBlend s(i0),2
		
		d=2^i
		t(i0)=CreateTexture (d,d,1)
		b=TextureBuffer( t(i0) )
		SetBuffer b
		LockBuffer b
		For x=0 To d-1
			For y=0 To d-1
				c=Rand(128,255)
				WritePixelFast x,y,(c Shl 16)+(c Shl 8)+c
			Next
		Next
		
		If lpX>0 Then
		For y=0 To d-1				;áåñøîâíîñòü ïî ãîðèçîíòàëè
			c=ReadPixelFast (0,y)
			WritePixelFast d-1,y,c
		Next
		EndIf
		If lpY>0 Then
		For x=0 To d-1				;áåñøîâíîñòü ïî âåðòèêàëè
			c=ReadPixelFast (x,0)
			WritePixelFast x,d-1,c
		Next
		EndIf
		UnlockBuffer b
		
		kk#=Float(d)/Float(d-1)
		ScaleEntity s(i0),kk,1.0,1.0
		EntityTexture s(i0),t(i0)
	Next
	EndIf


	SetBuffer BackBuffer()
	RenderWorld


	d=GH
	dx=(GW-GH)/2
	CopyRect dx,0,d,d,0,0,BackBuffer(),TextureBuffer(tt)


	For i=2 To (iq+iq0)
		FreeEntity s(i)
		FreeTexture t(i)
	Next
	RotateEntity cam,0,0,0

End Function

Function AutoContrast(lev,tx)
	min=255
	max=0
	b=TextureBuffer (tx)
	SetBuffer b
	LockBuffer b
	
	For x=0 To GH-1
		For y=0 To GH-1
			c=ReadPixelFast (x,y) And 255
			If c>max Then max=c
			If c<min Then min=c
		Next
	Next

	min=min+lev
	max=max-lev
	k#=255.0/Float(max-min)
	
	For x=0 To GH-1
		For y=0 To GH-1
			c=ReadPixelFast (x,y) And 255
			
			cm=c-min
			If cm<0 Then cm=0
			
			c0=(Float(cm)*k)
			If c0>255 Then c0=255
			
			WritePixelFast x,y,(c0 Shl 16)+(c0 Shl 8)+c0
		Next
	Next

	UnlockBuffer b
	SetBuffer BackBuffer()
End Function

Function CreateQuad()
	m=CreateMesh()
	sf=CreateSurface(m)

	v0=AddVertex(sf, -1.0,1.0,0.0, 0.0,0.0)
	v1=AddVertex(sf, 1.0,1.0,0.0, 1.0,0.0)
	v2=AddVertex(sf, 1.0,-1.0,0.0, 1.0,1.0)
	v3=AddVertex(sf, -1.0,-1.0,0.0, 0.0,1.0)

	AddTriangle sf,v0,v1,v2
	AddTriangle sf,v0,v2,v3
	
	Return m
End Function