Vertex color

Blitz3D Forums/Blitz3D Programming/Vertex color

Bolo_Loco(Posted 2004) [#1]
Here is what i'm trying to do :

- Load a mesh( with coloured Vertices ) and position a single surface to each vertex of the mesh --> this works
- applying the vertex color from the mesh to the single surfaces--->???

(this is just a modification of Rob's single surface stuff:)
http://www.blitzbasic.com/Community/posts.php?topic=32064


Global fpsindex#,fpstime#,fpsfold_millisecs#,fpsfps#,time,xyzturn

Type layer
	Field mesh
	Field count
	Field spritebank ; pointer to a type just for holding a list of sprites
End Type

Type sprite
	Field x#,y#,z#
	Field r,g,b
	Field s#,a#
	Field verti[3]
	Field surf
End Type

;--------------------------------------------------------------------------------------------
Graphics3D 640,480,32,2
SetBuffer BackBuffer()
Global camera=CreateCamera()
CameraRange camera,1,9000

CameraClsColor camera,141,195,245
light=CreateLight(1)
PositionEntity light,1000,1000,-1000
;--------------------------------------------------------------------------------------------
fire=LoadTexture ("fire1.png",2+48)

test=CreateLayer()
EntityTexture test,fire


Mymesh=LoadMesh("cloud1.b3d")



;EntityAlpha Mymesh,0.5
EntityFX Mymesh,2
HideEntity Mymesh

For scount=1 To CountSurfaces(Mymesh)
		surface = GetSurface(Mymesh,scount)
		numverts=CountVertices(surface)-1
		For i=0 To numverts
;Coordinates of the vertices					
			xv#=VertexX(surface,i)
			yv#=VertexY(surface,i)
			zv#=VertexZ(surface,i)
;VertexColor
			vcr=VertexRed#(surface,i)
    		vcg=VertexGreen#(surface,i)
    		vcb=VertexBlue#(surface,i)

			
			
			
			
	temp = AddSprite(test)
	
	PositionSprite temp,xv#,yv#,zv#,vcr,vcg,vcb



Next
Next
;--------------------------------------------------------------------------------------------
HidePointer

While Not KeyHit(1)
	MoveEntity camera,0,0,MouseZSpeed()*10
	mxspd#=MouseXSpeed()*.2
	myspd#=MouseYSpeed()*.2
	MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
	TurnEntity camera,myspd,-mxspd,0
	

	
	
UpdateSprites()
	
	UpdateWorld
	RenderWorld
	Text 0,0,fps()
	Flip 0
Wend
End

;--------------------------------------------------------------------------------------------

Function UpdateSprites()
	For s.sprite=Each sprite
		TFormPoint s\x,s\y,s\z,0,camera
		If TFormedZ#()>0
			TFormVector -s\s,-s\s,0,camera,0 
			VertexCoords s\surf,s\verti[0],s\x+TFormedX#(),s\y+TFormedY#(),s\z+TFormedZ#()
			TFormVector s\s,-s\s,0,camera,0 
			VertexCoords s\surf,s\verti[1],s\x+TFormedX#(),s\y+TFormedY#(),s\z+TFormedZ#()
			TFormVector -s\s,s\s,0,camera,0 
			VertexCoords s\surf,s\verti[2],s\x+TFormedX#(),s\y+TFormedY#(),s\z+TFormedZ#()
			TFormVector s\s,s\s,0,camera,0 
			VertexCoords s\surf,s\verti[3],s\x+TFormedX#(),s\y+TFormedY#(),s\z+TFormedZ#()
		EndIf
	Next
End Function

;--------------------------------------------------------------------------------------------
Function CreateLayer()
	l.layer=New layer	
	l\mesh=CreateMesh() : surf=CreateSurface(l\mesh)
	l\spritebank=CreateBank()
	NameEntity l\mesh,Handle(l)
	EntityColor l\mesh,255,255,255
	EntityFX l\mesh,2
	EntityBlend l\mesh,3
	Return l\mesh
End Function
;--------------------------------------------------------------------------------------------
Function AddSprite(mesh)
	l.layer=Object.layer(EntityName(mesh))
	surf=GetSurface(l\mesh,1)
	l\count=l\count+1
	ResizeBank l\spritebank,l\count*4
	
	;create a new sprite
	s.sprite=New sprite
	s\verti[0]=AddVertex(surf,0,0,0,0,1) ;topleft
	s\verti[1]=AddVertex(surf,0,0,0,1,1) ;topright
	s\verti[2]=AddVertex(surf,0,0,0,0,0) ;bottomleft
	s\verti[3]=AddVertex(surf,0,0,0,1,0) ;bottomright
	AddTriangle(surf,s\verti[1],s\verti[2],s\verti[3])
	AddTriangle(surf,s\verti[2],s\verti[1],s\verti[0])
	s\s=1 : s\a=1
	s\r=255 : s\g=255 : s\b=255
	s\x=0 : s\y=0 : s\z=0
	s\surf=surf
	;put the new sprite into the bank
	PokeInt l\spritebank,(l\count*4)-4,Handle(s)
	Return Handle(s)
End Function
;--------------------------------------------------------------------------------------------
Function PositionSprite(sprite,x#,y#,z#,vcr,vcg,vcb)

	s.sprite = Object.sprite( sprite )
	s\x=x
	s\y=y
	s\z=z
	s\r=vcr
	s\g=vcg
	s\b=vcb



End Function
;--------------------------------------------------------------------------------------------



;--------------------------------------------------------------------------------------------
Function fps()
	fpsindex=fpsindex+1
	fpstime=fpstime+MilliSecs()-fpsfold_millisecs
	If fpstime=>1000
		fpsfps=fpsindex
		fpstime=0
		fpsindex=0
	EndIf
	fpsfold_millisecs=MilliSecs()
	Return fpsfps
End Function




Media(15 Kb):
http://www.boteco.de/bolo/upload1/Cloud1.zip


DJWoodgate(Posted 2004) [#2]
Use Vertexcolor surf,vert,red,green,blue.

Bear in mind though that entityblend 3 is enabled for that surface. Depends what effect you are after I suppose.


Bolo_Loco(Posted 2004) [#3]
Thanks !