avoid reBuild mesh callback

Become a member of the CGSociety

Connect, Share, and Learn with our Large Growing CG Art Community. It's Free!

THREAD CLOSED
 
Thread Tools Search this Thread Display Modes
  04 April 2013
avoid reBuild mesh callback

Is there a way on custom geo plugins to avoid the buildMesh callback thats fired when a UI control has changed?

Does this work for anyone?

		fn Random = ( 
			disableRefMsgs(); 
			disableSceneRedraw()
////
			enableSceneRedraw()
			enableRefMsgs() 
			)
__________________
____________ ___ __ _
John A. Martini
JokerMartini@hotmail.com
www.JokerMartini.com
 
  04 April 2013
I'm having this issue with the sphere plus geo plugin. When users click on "Uniform" then change the spinner, you'll see that all spinners change to match the appropriate value, the only problem is that it rebuilds the mesh 3 times for every change (one for each spinner) This happens because when the spinner changes it fires the buildMesh callback.

How can I skip or delay the build mesh so it only happens once?
__________________
____________ ___ __ _
John A. Martini
JokerMartini@hotmail.com
www.JokerMartini.com
 
  04 April 2013
Originally Posted by JokerMartini: I'm having this issue with the sphere plus geo plugin. When users click on "Uniform" then change the spinner, you'll see that all spinners change to match the appropriate value, the only problem is that it rebuilds the mesh 3 times for every change (one for each spinner) This happens because when the spinner changes it fires the buildMesh callback.

How can I skip or delay the build mesh so it only happens once?

add internal local variable... something like building. and set it to ON before building the mesh and to OFF after.
on build mesh callback check if the mesh is in building mode and skip the building in this case.
 
  04 April 2013
sample code

plugin simpleObject SpherePlus 
name:"Sphere_Plus"
category:"Standard Primitives"
classID:#(0x68b2b559, 0x7b555bd2)
(
	parameters main rollout:rltParams
	(
		rows type:#integer default:4 ui:uiRows		
		columns type:#integer default:8 ui:uiColumns
		radius1 type:#float ui:uiRadius1 default:0
		radius2 type:#float ui:uiRadius2 default:0
		radius3 type:#float ui:uiRadius3 default:0
		uniform type:#boolean ui:uiUniform default:false
		hemisphere type:#float ui:uiHemisphere default:1.0
		cap type:#boolean ui:uiCap default:false
		mapCoords type:#boolean ui:uiMapCoords default:true
		realWorldMapSize type:#boolean ui:uiRealWorldMapSize default:false
	)
	
	rollout rltParams "Parameters"
	(
		spinner uiRows "Rows" range:[1,100,16] type:#integer
		spinner uiColumns "Columns" range:[3,100,32] type:#integer
		spinner uiRadius1 "Radius X:" range:[0,1e9,0] scale:.1 type:#worldunits offset:[0,9]
		spinner uiRadius2 "Radius Y:" range:[0,1e9,0] scale:.1 type:#worldunits
		spinner uiRadius3 "Radius Z:" range:[0,1e9,0] scale:.1 type:#worldunits
		checkBox uiUniform "Uniform " checked:false offset:[67,0] enabled:true
		spinner uiHemisphere "Hemisphere:" range:[0.0,1.0,1.0] scale:.005 type:#float offset:[0, 9]
		checkBox uiCap "Cap " checked:false offset:[67,0] enabled:false
		checkBox uiMapCoords "Generate Mapping Coords" checked:true offset:[0, 9]
		checkBox uiRealWorldMapSize "Real-World Map Size" checked:false
		
		on uiHemisphere changed val do (uiCap.enabled = (val != 1.0))
		on uiUniform changed state do (if state do uiRadius2.value = uiRadius3.value = uiRadius1.value)
		on uiRadius1 changed val do (if uiUniform.state do uiRadius2.value = uiRadius3.value = val)
		on uiRadius2 changed val do (if uiUniform.state do uiRadius1.value = uiRadius3.value = val)
		on uiRadius3 changed val do (if uiUniform.state do uiRadius1.value = uiRadius2.value = val)
	)
	
	on hasUVW do map_coords
		
	on setGenUVW bool do map_coords = bool
	
	fn genMesh =
	(
		local vertCount = (rows+2 )* columns --add the both polar ends to the rows count
		local facesCount =  columns * (rows-1) * 2 
		local rowAngle = 180.0 / (rows+1) * hemisphere
		local columnAngle = 360.0 / columns
		local capRow = 0
		
		/*Set Vertices*/
		local verticesArr = #()
		
		for h = 1 to (rows+2) do
		(
			for v = 1 to columns do
			(									
				calcX = radius1 * cos((v-1) * columnAngle) * sin((h-1)*rowAngle)
				calcY = radius2 * sin((v-1)* columnAngle) * sin((h-1)*rowAngle)
				calcZ = radius3 * cos((h-1) * rowAngle)
				
				pos = [calcX,calcY,calcZ] + [0,0,0] --include nodes matrix
				append verticesArr pos
			)
		)
		
		/*Cap Mesh*/
		if hemisphere != 1.0 then
		(
			/*duplicate the last six verts for later use in capping the SpherePlus*/
			lastVert = verticesArr.count
			startingVert = lastVert - (columns - 1)--the starting vert to begin collecting at
			
			lastVerticesRow = (for i = startingVert to lastVert collect verticesArr[i])
			join verticesArr lastVerticesRow
			capRow = 1
			vertCount += columns
		)
		
		/*Set Faces*/
		local facesArr = #()
		local rowEnd = columns as integer
		
		loops = (rows + 1 + capRow)*columns
		for v = 1 to loops do
		(
			if v < rowEnd then
			(
				append facesArr [v+1, v, v+columns]
				append facesArr [ v+columns ,  v+columns+1 , v+1 ] 
			)else(
				append facesArr [ 1+v-columns , v , v+columns]
				append facesArr [v+columns , v+1, 1+v-columns ]
				rowEnd += columns
			)
		)
		
		/*Set Mesh*/
 		setMesh mesh verts:verticesArr faces:facesArr
		triCount = (rows+1+capRow)*columns*2
		for f in #{1..triCount} do setEdgeVis mesh f 3 false
		for f in #{1..triCount} do setFaceSmoothGroup mesh f 1
		if hemisphere != 1.0 and cap do (
			for f in #{(triCount-(columns*2)+1)..triCount} do setFaceSmoothGroup mesh f 2
		)
			
		/*Set Texture Coordinates*/
		if mapCoords do (
			setNumTVerts mesh vertCount
			if realWorldMapSize then
			(
				for i = 1 to vertCount do
				(
					setTVert mesh i verticesArr[i]
				)
			)
			else 
			(
 				local maxLength = amax #(radius1,radius2,radius3)
 				for i = 1 to vertCount do
				(
 					setTVert mesh i (verticesArr[i] / maxLength + [0, 0, 0]/2)
				)
			)
			buildTVFaces mesh false
			for i = 1 to facesArr.count do
			(
				setTVFace mesh i facesArr[i]
			)
		)
		
		/*Weld Polars*/
		if hemisphere == 1.0 then
		(
			local weldBottomVerts = for i = vertCount to (vertCount - (columns-1)) by -1 collect i
			meshop.weldvertset mesh weldBottomVerts --weld end verts first because it changes the vert count
		)
		else
		(
			if cap do 
			(
				local weldBottomVerts = for i = vertCount to (vertCount - (columns-1)) by -1 collect i
				meshop.weldvertset mesh weldBottomVerts --weld end verts first because it changes the vert count
			)
		)
		
 		local weldTopVerts = for i = 1 to columns collect i
 		meshop.weldvertset mesh weldTopVerts
		
 		update mesh
	)
	
	on buildMesh do (genMesh())
	
	tool create
	(
		local first_pos
		
		on mousePoint click do (
			case click of (
				1: (radius1 = radius2 = radius3 = 0; coordSys grid (nodeTM.translation = first_pos = gridPoint))
				2: #stop
			)
		)
			
		on mouseMove click do (
			case click of (
				2: (
						radius1 = radius2 = radius3 = length (gridDist * [1, 1, 0])
						if altKey do
						(
							nodeTM.translation = [0,0,0]
						)
					)
			)
		)
	)
)
__________________
____________ ___ __ _
John A. Martini
JokerMartini@hotmail.com
www.JokerMartini.com
 
  04 April 2013
where is a problem? it calls only once on every parameter change...
ahh... i see... in uniform mode...
 
  04 April 2013
yeah in uniform mode it does several fires.
__________________
____________ ___ __ _
John A. Martini
JokerMartini@hotmail.com
www.JokerMartini.com
 
  04 April 2013
everything is much simple... you mistake is that you use spinner change events instead of property set event. i've changed your code to do uniform sync the right way.
 
  04 April 2013
if spinner is wired to a property never use spinner events. they don't make any sense in case of undo/redo anyway.
actually it's not just about spinners. it concerns to any rollout control.
 
  04 April 2013
can you share with me the fixed code so i can learn from it?
__________________
____________ ___ __ _
John A. Martini
JokerMartini@hotmail.com
www.JokerMartini.com
 
  04 April 2013
Originally Posted by JokerMartini: can you share with me the fixed code so i can learn from it?

sure i've forgot to post a code:

plugin simpleObject SpherePlus 
name:"Sphere_Plus"
category:"Standard Primitives"
classID:#(0x68b2b559, 0x7b555bd2)
(
	fn syncRadius val = 
	(
		if this.radius1 != val do this.radius1 = val
		if this.radius2 != val do this.radius2 = val
		if this.radius3 != val do this.radius3 = val
	)
	parameters main rollout:rltParams
	(
		rows type:#integer default:4 ui:uiRows		
		columns type:#integer default:8 ui:uiColumns
		radius1 type:#float ui:uiRadius1 default:0
		radius2 type:#float ui:uiRadius2 default:0
		radius3 type:#float ui:uiRadius3 default:0
		uniform type:#boolean ui:uiUniform default:false
		hemisphere type:#float ui:uiHemisphere default:1.0
		cap type:#boolean ui:uiCap default:false
		mapCoords type:#boolean ui:uiMapCoords default:true
		realWorldMapSize type:#boolean ui:uiRealWorldMapSize default:false
		
		on radius1 set val do if uniform do syncRadius val
		on radius2 set val do if uniform do syncRadius val
		on radius3 set val do if uniform do syncRadius val
			
		on uniform set val do if val do syncRadius radius1
	)
	
	rollout rltParams "Parameters"
	(
		spinner uiRows "Rows" range:[1,100,16] type:#integer
		spinner uiColumns "Columns" range:[3,100,32] type:#integer
		spinner uiRadius1 "Radius X:" range:[0,1e9,0] scale:.1 type:#worldunits offset:[0,9]
		spinner uiRadius2 "Radius Y:" range:[0,1e9,0] scale:.1 type:#worldunits
		spinner uiRadius3 "Radius Z:" range:[0,1e9,0] scale:.1 type:#worldunits
		checkBox uiUniform "Uniform " checked:false offset:[67,0] enabled:true
		spinner uiHemisphere "Hemisphere:" range:[0.0,1.0,1.0] scale:.005 type:#float offset:[0, 9]
		checkBox uiCap "Cap " checked:false offset:[67,0] enabled:false
		checkBox uiMapCoords "Generate Mapping Coords" checked:true offset:[0, 9]
		checkBox uiRealWorldMapSize "Real-World Map Size" checked:false
		
		on uiHemisphere changed val do (uiCap.enabled = (val != 1.0))
	)
	
	on hasUVW do map_coords
		
	on setGenUVW bool do map_coords = bool
	
	fn genMesh = 
	(
		format "build...%\n" (timestamp())

		local vertCount = (rows+2 )* columns --add the both polar ends to the rows count
		local facesCount =  columns * (rows-1) * 2 
		local rowAngle = 180.0 / (rows+1) * hemisphere
		local columnAngle = 360.0 / columns
		local capRow = 0
		
		/*Set Vertices*/
		local verticesArr = #()
		
		for h = 1 to (rows+2) do
		(
			for v = 1 to columns do
			(									
				calcX = radius1 * cos((v-1) * columnAngle) * sin((h-1)*rowAngle)
				calcY = radius2 * sin((v-1)* columnAngle) * sin((h-1)*rowAngle)
				calcZ = radius3 * cos((h-1) * rowAngle)
				
				pos = [calcX,calcY,calcZ] + [0,0,0] --include nodes matrix
				append verticesArr pos
			)
		)
		
		/*Cap Mesh*/
		if hemisphere != 1.0 then
		(
			/*duplicate the last six verts for later use in capping the SpherePlus*/
			lastVert = verticesArr.count
			startingVert = lastVert - (columns - 1)--the starting vert to begin collecting at
			
			lastVerticesRow = (for i = startingVert to lastVert collect verticesArr[i])
			join verticesArr lastVerticesRow
			capRow = 1
			vertCount += columns
		)
		
		/*Set Faces*/
		local facesArr = #()
		local rowEnd = columns as integer
		
		loops = (rows + 1 + capRow)*columns
		for v = 1 to loops do
		(
			if v < rowEnd then
			(
				append facesArr [v+1, v, v+columns]
				append facesArr [ v+columns ,  v+columns+1 , v+1 ] 
			)else(
				append facesArr [ 1+v-columns , v , v+columns]
				append facesArr [v+columns , v+1, 1+v-columns ]
				rowEnd += columns
			)
		)
		
		/*Set Mesh*/
		 setMesh mesh verts:verticesArr faces:facesArr
		triCount = (rows+1+capRow)*columns*2
		for f in #{1..triCount} do setEdgeVis mesh f 3 false
		for f in #{1..triCount} do setFaceSmoothGroup mesh f 1
		if hemisphere != 1.0 and cap do (
			for f in #{(triCount-(columns*2)+1)..triCount} do setFaceSmoothGroup mesh f 2
		)
			
		/*Set Texture Coordinates*/
		if mapCoords do (
			setNumTVerts mesh vertCount
			if realWorldMapSize then
			(
				for i = 1 to vertCount do
				(
					setTVert mesh i verticesArr[i]
				)
			)
			else 
			(
				 local maxLength = amax #(radius1,radius2,radius3)
				 for i = 1 to vertCount do
				(
					 setTVert mesh i (verticesArr[i] / maxLength + [0, 0, 0]/2)
				)
			)
			buildTVFaces mesh false
			for i = 1 to facesArr.count do
			(
				setTVFace mesh i facesArr[i]
			)
		)
		
		/*Weld Polars*/
		if hemisphere == 1.0 then
		(
			local weldBottomVerts = for i = vertCount to (vertCount - (columns-1)) by -1 collect i
			meshop.weldvertset mesh weldBottomVerts --weld end verts first because it changes the vert count
		)
		else
		(
			if cap do 
			(
				local weldBottomVerts = for i = vertCount to (vertCount - (columns-1)) by -1 collect i
				meshop.weldvertset mesh weldBottomVerts --weld end verts first because it changes the vert count
			)
		)
		
		 local weldTopVerts = for i = 1 to columns collect i
		 meshop.weldvertset mesh weldTopVerts
		
		 update mesh
	)
	
	on buildMesh do (genMesh())
	
	tool create
	(
		local first_pos
		
		on mousePoint click do (
			case click of (
				1: (radius1 = radius2 = radius3 = 0; coordSys grid (nodeTM.translation = first_pos = gridPoint))
				2: #stop
			)
		)
			
		on mouseMove click do (
			case click of (
				2: (
						radius1 = radius2 = radius3 = length (gridDist * [1, 1, 0])
						if altKey do
						(
							nodeTM.translation = [0,0,0]
						)
					)
			)
		)
	)
)
 
  04 April 2013
bug

What is the solution to this then? It is a problem with Tubular.

Create an object then click 'new' three time. then select different list items and youll see it build it several times.

The issue is the populate settings function! ahhhh


--delete objects

plugin simpleObject Tubular 
name:"Tubular"
category:"Standard Primitives"
classID:#(0x503dde09, 0x1cd55e62)
(
	parameters sections rollout:sections
	(	
		sectionsData type:#stringTab tabSize:0 tabSizeVariable:true -- changed the parameter name also changed tabsize to 0 so it would not add an undefined item to the array		
		
		XRadius2 type:#float ui:uiXRadius2 default:0
		YRadius2 type:#float ui:uiYRadius2 default:0
		smooth2 type:#float ui:uiSmooth2 default:0.0
		height2 type:#worldUnits default:0 ui:uiHeight2
		heightSegs2 type:#integer default:4 ui:uiHeightSegs2
		heightBias2 type:#float default:0 ui:uiHeightBias2
		heightBiasPower2 type:#float default:10 ui:uiHeightBiasPower2
		radiusBias2 type:#float default:0 ui:uiRadiusBias2
		radiusBiasPower2 type:#float default:10 ui:uiRadiusBiasPower2
		twisty type:#worldUnits default:0 ui:uiTwisty
		
		on sectionsData tabChanged change tabIndex tabCount do 
		(
			this.PopulateSectionList()
		)
			
		on XRadius2 set val do (this.WriteSettings())
		on YRadius2 set val do (this.WriteSettings())
		on smooth2 set val do (this.WriteSettings())
		on height2 set val do (this.WriteSettings())
		on heightSegs2 set val do (this.WriteSettings())
		on heightBias2 set val do (this.WriteSettings())
		on heightBiasPower2 set val do (this.WriteSettings())
		on radiusBias2 set val do (this.WriteSettings())
		on radiusBiasPower2 set val do (this.WriteSettings())
		on twisty set val do (this.WriteSettings())
	)
	
	rollout sections "Sections"
	(
		button uiNewSection "New" across:3 height:24 width:51 align:#left offset:[-9,0]
		button uiRemoveSection "Remove" height:24 width:51 align:#left offset:[-3,0]
		button uiClearSections "Clear" height:24 width:51 align:#left offset:[3,0]
		multilistbox uiSectionList items:#() height:5 width:155 offset:[-10,-4] align:#left
		group "Settings"
		(
			spinner uiXRadius2 "Radius X:" range:[0,1e9,0] scale:.1 type:#worldunits fieldwidth:50 align:#right offset:[0,0]
			spinner uiYRadius2 "Radius Y:" range:[0,1e9,0] scale:.1 type:#worldunits fieldwidth:50 align:#right offset:[0,0]
			spinner uiSmooth2 "Smooth:" range:[-1e9,1e9,0] scale:.01 type:#float fieldwidth:50 align:#right offset:[0,0]
			spinner uiHeight2 "Height: " range:[-1e9,1e9,0]  type:#worldUnits fieldwidth:50 align:#right offset:[0,6]	
			spinner uiHeightSegs2 "Height Segs: " type:#integer range:[1,1000,0] fieldwidth:50 align:#right offset:[0,0]
			spinner uiHeightBias2 "Height Bias: " type:#float range:[-1,1,0] scale:0.01 fieldwidth:50 align:#right offset:[0,0]
			spinner uiHeightBiasPower2 "Height Power: " range:[1,100,0] type:#float scale:0.1 fieldwidth:50 align:#right offset:[0,0]
			spinner uiRadiusBias2 "Radius Bias: " type:#float range:[-1,1,0] scale:0.01 fieldwidth:50 align:#right offset:[0,6]
			spinner uiRadiusBiasPower2 "Radius Power: " range:[1,100,0] type:#float scale:0.1 fieldwidth:50 align:#right offset:[0,0]
			spinner uiTwisty "Twist: " type:#float range:[-1e9,1e9,0] scale:1.0 fieldwidth:50 align:#right offset:[0,6]
		)
		
		on uiSectionList selectionEnd do (this.PopulateSettings())
		on uiNewSection pressed do 
		(
			local newSection = #(
				10,	 --1 = Radius X
				10,	 --2 = Radius Y
				0,	 --3 = Smooth
				20,	 --4 = Height
				10,	 --5 = Height Segs
				0,	 --6 = Height Bias
				10, --7 = Height Power
				0,	 --8 = Radius Bias
				10, --9 = Radius Power
				0	 --10 = Twist
			) as string
			append sectionsData newSection
		)
		on uiRemoveSection pressed do (this.RemoveListSections())
		on uiClearSections pressed do sectionsData = #()
		on sections open do (this.PopulateSectionList())
	)
	
	fn getSelectedListItem = 
	(
		curSel = this.sections.uiSectionList.selection as array
		selItem = if curSel.count >= 1 then curSel[1] else 0
		selItem 
	)
	
	fn getArrayFromString stg = 
	(
		local tmpArr = #()
		if stg.count >= 1 do 
		(
			for p = 1 to stg.count do
			(
				part = execute (substring stg[p] 1 (stg[p].count))
				append tmpArr part
			)
		)
		tmpArr
	)
	
	fn PopulateSettings =
	(
		local sectionsArr = getArrayFromString sectionsData
		index = getSelectedListItem()
		
		if index >= 1 do 
		(
			sectionData = sectionsArr[index]
			
			this.sections.uiXRadius2.value = sectionData[1]
			this.sections.uiYRadius2.value = sectionData[2]
			this.sections.uiSmooth2.value = sectionData[3]
			this.sections.uiHeight2.value = sectionData[4]
			this.sections.uiHeightSegs2.value = sectionData[5]
			this.sections.uiHeightBias2.value = sectionData[6]
			this.sections.uiHeightBiasPower2.value = sectionData[7]
			this.sections.uiRadiusBias2.value = sectionData[8]
			this.sections.uiRadiusBiasPower2.value = sectionData[9]
			this.sections.uiTwisty.value = sectionData[10]
		)
	)
	
	fn WriteSettings = 
	(
		local sectionsArr = getArrayFromString sectionsData
		index = getSelectedListItem()
		
		if index >= 1 do 
		(
			sectionData = sectionsArr[index]
			
			if sectionData != undefined do 
			(
				sectionData[1] = this.sections.uiXRadius2.value 
				sectionData[2] = this.sections.uiYRadius2.value
				sectionData[3] = this.sections.uiSmooth2.value
				sectionData[4] = this.sections.uiHeight2.value
				sectionData[5] = this.sections.uiHeightSegs2.value
				sectionData[6] = this.sections.uiHeightBias2.value
				sectionData[7] = this.sections.uiHeightBiasPower2.value
				sectionData[8] = this.sections.uiRadiusBias2.value
				sectionData[9] = this.sections.uiRadiusBiasPower2.value
				sectionData[10] = this.sections.uiTwisty.value
				
				sectionsData[index] = sectionData as string
			)
		)
	)
	
	fn RemoveListSections listUnselected:(-this.sections.uiSectionList.selection) = 
	(
		sectionsData = for i in listUnselected collect sectionsData[i]
		PopulateSettings()
	)
	
	fn PopulateSectionList = (
		local sectionsArr = getArrayFromString sectionsData
		this.sections.uiSectionList.items = for n = 1 to sectionsArr.count collect (n as string)
		sel = if sectionsArr.count >= 1 then #{sectionsArr.count} else #{}
		this.sections.uiSectionList.selection = sel
		PopulateSettings()
	)
	
	fn genMesh =
	(	
		if sectionsData.count >= 1 then
		(			
			setMesh mesh verts:#() faces:#() 
		)
	)
	
	on buildMesh do 
	(
		genMesh()
		format "Generating: %\n" (random 0 9)
	)
	
	tool create
	(
		local first_pos
		
		on mousePoint click do case click of
		(
			1: (XRadius1 = YRadius1 = XRadius2 = YRadius2 = 0; coordSys grid (nodeTM.translation = first_pos = gridPoint))
			2: #stop
		)
		
		on mouseMove click do case click of
		(
			2: (
					XRadius1 = YRadius1 = amax (abs gridDist.x) (abs gridDist.y)
					if altKey do
					(
						nodeTM.translation = [0,0,0]
					)
				)
		)
	)
)
__________________
____________ ___ __ _
John A. Martini
JokerMartini@hotmail.com
www.JokerMartini.com

Last edited by JokerMartini : 04 April 2013 at 03:04 PM.
 
  04 April 2013
it's the same mistake... use properties instead of controls:

	fn PopulateSettings =
	(
		local sectionsArr = getArrayFromString sectionsData
		index = getSelectedListItem()
		
		if index >= 1 do 
		(
			sectionData = sectionsArr[index]
			
			XRadius2 = sectionData[1]
			YRadius2 = sectionData[2]
			Smooth2 = sectionData[3]
			Height2 = sectionData[4]
			HeightSegs2 = sectionData[5]
			HeightBias2 = sectionData[6]
			HeightBiasPower2 = sectionData[7]
			RadiusBias2 = sectionData[8]
			RadiusBiasPower2 = sectionData[9]
			Twisty = sectionData[10]
		)
	)
 
  04 April 2013
that is what i figured.
Thank you very much for the fixes. I was going to go nuts if i could find a solution.
__________________
____________ ___ __ _
John A. Martini
JokerMartini@hotmail.com
www.JokerMartini.com
 
  04 April 2013
Thread automatically closed

This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.
__________________
CGTalk Policy/Legalities
Note that as CGTalk Members, you agree to the terms and conditions of using this website.
 
Thread Closed share thread



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
CGSociety
Society of Digital Artists
www.cgsociety.org

Powered by vBulletin
Copyright 2000 - 2006,
Jelsoft Enterprises Ltd.
Minimize Ads
Forum Jump
Miscellaneous

All times are GMT. The time now is 02:09 PM.


Powered by vBulletin
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.