Page 1 of 1

How to have less faces in 3DS Max

Posted: Sat Feb 23, 2008 4:22 pm
by jshaner
Hello. I currently model various things in my spare time in 3D Studio Max, and i have been having some issues. I know that there are some people here who do this kind of thing, whether it be for Descent or whatever. Whenever i make my models, they always come out with 1000's of faces or more. What i use them for does not like that, and i need to know hiw to reduce them (if possibly there is a way to do it without redoing the entire thing). Help would be greatly appreciated!

Posted: Sat Feb 23, 2008 6:13 pm
by Diedel
Well, once I've given my current ISP the boot and moved to a better one you can join the D2X-XL forum and ask our main modeler MetalBeast for help.

As far as I know he isn't too fond of face removal tools and does everything by hand.

Posted: Sun Feb 24, 2008 11:37 am
by VladR
There are plenty modifiers that let you do just that. I`m a programmer (not an artist), but from the top of my head there should be modifiers named like Optimize, Multires. One of them lets you freely choose the vertex count by percentage in a range of 0%-100%. That`s the one I always use to decimate the polygons since you can freely rotate the mesh and decide whether it`s still too much detailed or it could handle another reduction.

You`ll notice though that the texturing may break while reducing polys. That`s normal. Thus, it`s prefered to texture the mesh only after you have the final mesh.


Just one more thing to remember - it`s the VERTEX COUNT that counts,not TRIANGLE COUNT.

So, the important thing is to reduce the amount of vertices, not triangles - which is especially important under 3dsmax, because you can start manually retriangulating the mesh and you could end up with a mesh that has less polys but it`ll still have same amount of vertices.
Ever heard the term \"Vertex Shader\" ? It`s a little program that is executed upon each vertex of the mesh (to transform/light/texture (coords) it) by your gfx card.

Posted: Sun Feb 24, 2008 1:24 pm
by jshaner
ok, thanks, will have to try

Posted: Sun Feb 24, 2008 2:15 pm
by MetalBeast
Hi,

if you want to have really good low- or mid-poly meshes you have to make them yourself.

Using any kind of poly-reducing tools, make the mesh unclean. the polygon structures are going to be bad.

So all kind of such tools are only good, if you are using the meshes for renderings only.

If you want the meshes for games or other application, you have to make them yourself, using the highpoly mesh as reference only.

There are many tutorials on the net how to start and lern low-poly modelling.

Examples:
http://www.3dtotal.com/team/Tutorials/b ... this_1.asp
http://www.techtut.com/Tutorial/3D-stud ... house.html


Hope this helps,
MetalBeast.

Posted: Sun Feb 24, 2008 2:59 pm
by jshaner
I have found that when using techniques like extruding, as suggested in the tutorials, that i always get a (d)i(e)i(g)i(e)i(n)i(e)i(r)i(a)i(t)i(e) (exclude i's) triangle error when put the model through to be processed by the game engine i am using. That error is really getting on my nerves, and i don't know exactly what i am doing that is causing it.

For example, when i use a model of a pyro from wherever, whether it be extracted from some game/mod, i make sure it is in 3ds max and looking good. I then export it to X (x being whatever) format and process through my game tool (makes tags and such), it always comes up with that error, and it is not due to open faces (can be though), but it is in fact due to two or more triangles sharing the same side. And this is tru for almost any slightly comples model that i make or download. Being a rookie at modeling, i am not sure what the problem is or what to do.

Posted: Sun Feb 24, 2008 3:31 pm
by MetalBeast
It is difficult to say anything, if we don't know what format or engine you are using.

Anyway, if you want some model to check for bugs, just sent it to me in max format, I can check it for you.

I think your problem can be engine related.
Some engines don't like, if meshes have vertices at same places, belong to different faces, but you need it for planar UVW-Mapping.

Posted: Sun Feb 24, 2008 3:47 pm
by jshaner
For example, I can extract the Pyro GL from the main D3 Hog File. K, now i have it in .oof format. I downloaded a program to convert it to .3DS. Now it is in 3DS format. I open it up (import, rather) in Max and on the right side from the drop down bar do an SDL check. When i do that, a whole bunch of faces get highlighted red, because they are in error. This is because (i'm pretty sure) two or more triangles share the same side(there are no open faces or oher errors i don't think). When i export and process it i will get errors, and the model won't work, whereas if i do the same thing with a box, no faces are selected and it works ok.

Posted: Sun Feb 24, 2008 3:55 pm
by MetalBeast
Ok, now we get closer ;)

The tool you are talking about is 3DSgen?,
so I have to say you, this tool is crap, sorry.
I used it few times, but the meshes which were produced are useless.

You can fix it, but it is full load of work.

You have to find the right vertices-radius and select the whole model. Then select all vertices and choose \"weld selected\", this will clenup all the useless vertices in mesh and delete most of doubled faces, but not all. So depend of mesh complexity you have to correct the rest manually.

What I made was using the converted meshe as reference and made completly new one.
It is better and cleaner, than fixing bad meshes.

Posted: Sun Feb 24, 2008 4:45 pm
by jshaner
OOF to 3DS 1.0 With this program you can convert the geometry information stored in OOF-files (Outrage Object Files) to 3DS-files (3D-Studio). 44.7 KB DF | FP
http://www.planetdescent.com/site/files ... opment.asp

Taken straight from PD, this is what i have been using after awhile ago i discovered that 3dsgen was crap.

So are you saying that this will get rid of the error?

Re:

Posted: Sun Feb 24, 2008 5:19 pm
by SuperSheep
zombie999 wrote:Ok, now we get closer ;)

The tool you are talking about is 3DSgen?,
so I have to say you, this tool is crap, sorry.
I used it few times, but the meshes which were produced are useless.

You can fix it, but it is full load of work.

You have to find the right vertices-radius and select the whole model. Then select all vertices and choose "weld selected", this will clenup all the useless vertices in mesh and delete most of doubled faces, but not all. So depend of mesh complexity you have to correct the rest manually.

What I made was using the converted meshe as reference and made completly new one.
It is better and cleaner, than fixing bad meshes.
Sorry, 3dsgen is not crap. It was written to be used in conjunction with Max OOF Utility not by itself. That is where you had your problems.

3dsgen does that on purpose because it is not possible to preserve textures correctly when exporting to the 3ds format, I had to break down the faces into sections in order to preserve them.

Here's the description straight from MaxOOFUtility readme...
Description
-----------
Max OOF Utility is the companion program for 3dsGen. After you convert your
OOF file to 3DS and import into 3dsMax. This utility will help you in finding
and creating materials, colorizing the model, welding the redundant vertices
created by 3dsgen and assigning special properties to sub-models.
And the usage...
Usage
-----
The program has several functions. All of which rely on a model being loaded,
and collapsed to Editable Mesh(s).

Weld Redundant Verts: This welds all of the redundant vertices that are created
by 3dsgen as a kludge to preserve texture mapping. This function operates on
all Meshes in the scene.

Colorize, B/W Colorize: Colorizes each sub-model(object) randomly. This operates
on all Meshes in the scene.

Create Materials: Attempts to locate textures of type TGA used by the model and
create materials in the Material slot chosen. It will also remove textures from
those submodels that are of type GPNT,GRND,ATCH,SPCL and glows. This function
operates on the currently selected Mesh(s).

Wildcard Material Search: Uses <filename>*.tga search name when searching for
textures and can save you from having to manually locate the file.

Set Property: This will set the Custom Propety attribute of the Mesh(s) to the
desired property.

Posted: Sun Feb 24, 2008 5:27 pm
by MetalBeast
The problem is, that OOF format is crap, So 3dsgen is just doing what it can do, I think supersheep did his best, but OOF is using non-standard modeling convetions. It is bad documented and without usable tools.

So converting meshes from OOF to any standard format is not possible without losses. And in other direction it is not better.

It is the reason, why we stopped to support OOF in d2x-xl and changed to ASE.

Like just wrote, you have to weld all vertices in the mesh in order to become usable model.

But all UVW mappings are than gone, so you must do new work on UVW-mappings and texturing.

Is is so big amount of work, so I think it is better to make the model new from scratch, using converted model as reference.

EDIT: supersheep was first ;)
Anyway, using 3dsgen or other tool converted meshes from OOF, means many work for you :D

Re:

Posted: Sun Feb 24, 2008 5:40 pm
by SuperSheep
zombie999 wrote:The problem is, that OOF format is crap, So 3dsgen is just doing what it can do, I think supersheep did his best, but OOF is using non-standard modeling convetions. It is bad documented and without usable tools.

So converting meshes from OOF to any standard format is not possible without losses. And in other direction it is not better.

It is the reason, why we stopped to support OOF in d2x-xl and changed to ASE.

Like just wrote, you have to weld all vertices in the mesh in order to become usable model.

But all UVW mappings are than gone, so you must do new work on UVW-mappings and texturing.

Is is so big amount of work, so I think it is better to make the model new from scratch, using converted model as reference.

EDIT: supersheep was first ;)
Anyway, using 3dsgen converted meshes means many work for you :D
That is not what I said and you still seem to misunderstand. Max OOF Utility welds the verts for you. The UVW mapping is not lost. It would be if the model were not broken apart by 3dsgen.

I took the Hellion and converted it from an OOF to 3DS, imported into 3dsmax, and had a fully textured, exportable model with all keyframes in under 5 minutes. How is that a lot of work?

Posted: Sun Feb 24, 2008 5:47 pm
by MetalBeast
Ok, if this way works and the mesh is clean with proper UVW maps, than it may be a solution for you jshaner.

But anyway I'm lucky,
I haven't to work with OOF models anymore :D

And I don't like converted models, I prefer to build them myself :D

Posted: Sun Feb 24, 2008 7:55 pm
by BUBBALOU
wow - sounds like someone who never used Super Sheep's tool in the first place, has alot to say about nothing

bad form

bad attitude

zombie999

Posted: Sun Feb 24, 2008 7:56 pm
by d3jake
I dunno how to get the keyframes (due to my version of 3ds Max not being compatible with the OOF utility (I assume), but I converted over the GX model from the D4 section of PD and it textured perfectly, no issues.

Re:

Posted: Sun Feb 24, 2008 8:03 pm
by MetalBeast
BUBBALOU wrote:wow - sounds like someone who never used Super Sheep's tool in the first place, has alot to say about nothing

bad form

bad attitude

zombie999
I used it, just don't like it,
the Max OOF Utility did'nt work for me.

And I don't like your comment.
Is just your evidence of incapacity.
Go and spam to another thread.

Re:

Posted: Sun Feb 24, 2008 9:12 pm
by SuperSheep
d3jake wrote:I dunno how to get the keyframes (due to my version of 3ds Max not being compatible with the OOF utility (I assume), but I converted over the GX model from the D4 section of PD and it textured perfectly, no issues.
I wrote the utility for 3dsmax 3.0. I don't have more recent versions of 3dsmax so I cannot attest to it's working in later versions.
zombie999 wrote:I used it, just don't like it,
the Max OOF Utility did'nt work for me.
I can understand the reason you don't like it however it does indeed work, just not on your version of 3dsmax. I do not have time to do updates and can not afford to get later versions of max, but the "source code" is included.

Your view of the software is similar to thinking software is a POS because it won't work on later versions of windows. I think that is why Bubba was coming down on you.

You are free to use it or not as you see fit, but the utility does work on the versions of max that it was written for, and I stand by my software.

Posted: Sun Feb 24, 2008 9:14 pm
by SuperSheep
btw...for anyone interested in making OOF Utility compatible with later versions of max, the .ms file includes the source.

For those who don't have it, I will post it here as well.

Code: Select all

-- Max OOF Utility
-- by Robert 'SuperSheep' Piontek

global myImage  = \"selfloat.bmp\"
global myImageA = \"selfloat_a.bmp\"
global myLogo   = \"maxooflogo.bmp\"
global curPath  = \"C:\\\\\"
global wildSearch = true
global bwcolor = 0
global props    = #(\"None\", \                    \"Facing\", \                    \"Rotate\", \                    \"Turret/FOV\", \                    \"Glow/Thruster\", \                    \"Custom(Logo)\", \                    \"Shell\", \                    \"FrontFace\", \                    \"Jitter\", \                    \"Viewer\", \                    \"Monitor(01-08)\", \                    \"Layer\")
global monitors = #(\"Monitor01 - Left HUD Display\", \                    \"Monitor02 - Ship Strength\", \                    \"Monitor03 - Right HUD Display\", \                    \"Monitor04 - Left Energy Indicator\", \                    \"Monitor05 - Right Energy Indicator\", \                    \"Monitor06 - Shields\", \                    \"Monitor07 - Afterburn Indicator\", \                    \"Monitor08 - Unknown\")
global curPropShown = 1
global winSize = [250,440]
global mtlSlot = 1
-- Property initial/save states
struct s_fov  (fov,spr,rt)
struct s_glow (color,radius)
global prop_rotate  = 1.0
global prop_monitor = 1
global prop_fov     = s_fov  fov:90.0 spr:1.0 rt:0.0
global prop_glow    = s_glow color:blue radius:1.0

-- Takes a string with single \\'s and returns one with \\\\'s
fn doubleSlash str = (for i = str.count to 1 by -1 do (if str[i] == \"\\\\\" then str = replace str i 1 \"\\\\\\\\\"); return str)
-- Takes a string with \\\\'s and returns one with \\'s
fn singleSlash str = (for i = str.count-1 to 1 by -1 do (if str[i] == \"\\\\\" and str[i+1] == \"\\\\\" then str = replace str i 1 \"\"); return str)
-- Removes file extension from str
fn removeExt str = (for i = str.count-1 to 1 by -1 do (if str[i] == \".\" then (str = replace str i 4 \"\"; exit));	return str)

-- Rename diffuse texture to long name
fn renameDiffuse mat =
(
	dif_map = mat.diffuseMap

	-- Have we already got a fully qualified path name and file exists?
	f = getFilenamePath(dif_map.filename)
	if matchPattern f pattern:\"*\\\\*\" then (f = getFiles(dif_map.filename); if f.count == 1 then return 0)

	-- Store as much of the file name as we can
	search_name = curPath + mat.name

	-- Can we find this name?
	if mat.name.count<17 then
	(
		f = getFiles(search_name + \".tga\")
		if f.count == 1 then (dif_map.name = mat.name; dif_map.filename = singleSlash(f[1]); return 0)
	)

	-- Can we find the name with a wildcard search?
	if wildSearch == true then
	(
		f = getFiles(search_name + \"*.tga\")
		if f.count == 1 then
		(
			-- We found it, so exit
			mat.name         = removeExt(filenameFromPath(f[1]))
			dif_map.name     = mat.name
			dif_map.filename = singleSlash(f[1])
			return 0
		)
	)

	-- We now need to prompt user to find texture
	f = getOpenFileName filename:(search_name + \".tga\") caption:(\"Missing texture: \" + mat.name) types:\"TGA Files(*.TGA)|*.tga|All files(*.*)|*.*|\"
	if f != undefined then
	(
		-- Store new map and material name and update Current Path
		mat.name         = removeExt(filenameFromPath(f))
		dif_map.name     = mat.name
		dif_map.filename = singleSlash(f)
		curPath          = getFileNamePath(f)
	)
)

-- Renames all bitmaps on materials
fn renameMaterials =
(
	if ClassOf meditMaterials[mtlSlot] == Standard then
		if ClassOf meditMaterials[mtlSlot].diffuseMap == BitmapTexture then
			renameDiffuse meditMaterials[mtlSlot]
	if ClassOf meditMaterials[mtlSlot] == MultiMaterial then
	(
		for i = 1 to meditMaterials[mtlSlot].material.count do
		(
			if ClassOf meditMaterials[mtlSlot].material[i] == Standard then
				if ClassOf meditMaterials[mtlSlot].material[i].diffuseMap == BitmapTexture then
					renameDiffuse meditMaterials[mtlSlot].material[i]
		)
	)
)

-- Create Material Editor materials from objects in scene
fn createMaterialsFromObjects =
(
	if selection.count == 0 then (messageBox \"No objects selected!\"; return 0)
	curMatId = 0
	matnames = #()
	materials = #()
	-- Create a material list from objects
	for i = 1 to selection.count do
	(
		o = selection[i]
		if ClassOf o == Editable_Mesh then
		(
			mat = o.material
			if mat == undefined then continue
			if ClassOf mat == Standard then
			(
				if ClassOf mat.diffuseMap != BitmapTexture then (o.material = undefined; continue)
			)
			for curFace = 1 to o.numFaces do
			(
				matId = getFaceMatId o curFace
				local submat = mat
				if (ClassOf mat==MultiMaterial) and (matId>0) and (matid<=mat.material.count) then submat = mat.material[matId]
				local index = finditem matnames submat.name
				if index == 0 then
				(
					append matnames submat.name
					append materials submat
					curMatId += 1
					setFaceMatId o curFace curMatId
				)
				else setFaceMatId o curFace index
			)
		)
		update o
	)
	-- Create materials
	if curMatId == 1 then
	(
		setMeditMaterial (mtlSlot) materials[1]
		-- Show texture in viewport
		if ClassOf meditMaterials[mtlSlot].diffuseMap == BitmapTexture then
			showTextureMap meditMaterials[mtlSlot] meditMaterials[mtlSlot].diffuseMap on
	)
	else if curMatId > 1 then
	(
		mat = multiMaterial numsubs:curMatId name:(\"Material #\" + (mtlSlot as string))
		mat.materialList = materials
		mat.names = matnames
		if mat != undefined then
		(
			setMeditMaterial (mtlSlot) mat
			-- Show texture in viewport
			for i = 1 to curMatId do
			(
				if ClassOf meditMaterials[mtlSlot].material[i].diffuseMap == BitmapTexture then
					showTextureMap meditMaterials[mtlSlot].material[i] meditMaterials[mtlSlot].material[i].diffuseMap on
			)
		)
	)
	-- Rename the materials
	renameMaterials()
)

-- Assign material to selected objects
fn assignMaterials =
(
	-- Assign material to all objects
	for i = 1 to selection.count do
	(
		o = selection[i]
		if ClassOf o == Editable_Mesh and o.material != undefined then
		(
			o.material = undefined
			update o
			if ((findString o.name \"$attach\")==1) or ((findString o.name \"$normal\")==1) or \			   ((findString o.name \"$gun\")   ==1) or ((findString o.name \"$ground\")==1) or \			   ((findString o.name \"$dummy\")==1)  or ((findString (GetUserPropBuffer o) \"$glow\")==1) then continue
			o.material = meditMaterials[mtlSlot];
			update o
		)
	)
	redrawViews()
)

-- Welds all redundant vertices
fn weldAllVerts o=
(
	j = o.numVerts
	k = j
	tmppos = o.verts[j].pos
	do
	(
		if o.verts[j].pos!=tmppos then
		(
			if k>(j+1) then (setVertSelection o #{(j+1)..(k)}; meshOps.weld o; deselect o.selectedVerts)
			tmppos = o.verts[j].pos
			k = j
		)
	) while (j-=1) > 0
	-- Do last set of vertices
	if k>(j+1) then (setVertSelection o #{1..(k)}; meshOps.weld o; deselect o.selectedVerts)
)

-- Colorize Model
fn colorize style =
(
	for i = 1 to objects.count do
	(
		o = objects[i]
		if ClassOf o == Editable_Mesh then
		(
			if      (findString o.name \"$attach\") == 1 then o.wirecolor = orange
			else if (findString o.name \"$normal\") == 1 then o.wirecolor = color 255 0 255
			else if	(findString o.name \"$gun\")    == 1 then o.wirecolor = red
			else if (findString o.name \"$ground\") == 1 then o.wirecolor = green
			else if (findString o.name \"$dummy\")  == 1 then o.wirecolor = yellow
			else if ((findString (GetUserPropBuffer o) \"$glow\")==1) then continue
			else if (style == 2) then
			(
				vpcolor = getVPortBGColor()
				vpgray  = (vpcolor.r + vpcolor.g + vpcolor.b)/3
				if (bwcolor += 16) > 255 then bwcolor = 0
				if (bwcolor > vpgray-25) and (bwcolor < vpgray+25) then bwcolor = vpgray+25
				if bwcolor>255 then bwcolor = 255
				o.wireColor = color bwcolor bwcolor bwcolor
			)
			else
			(
				vpcolor = getVPortBGColor()
				mycolor = color (random 0 196) (random 0 196) (random 0 196)
				if (mycolor.r>vpcolor.r-25) and (mycolor.r<vpcolor.r+25) then mycolor.r = vpcolor.r-25
				if (mycolor.g>vpcolor.g-25) and (mycolor.g<vpcolor.g+25) then mycolor.g = vpcolor.g-25
				if (mycolor.b>vpcolor.b-25) and (mycolor.b<vpcolor.b+25) then mycolor.b = vpcolor.b-25
				if mycolor.r<0 then mycolor.r=0
				if mycolor.g<0 then mycolor.g=0
				if mycolor.b<0 then mycolor.b=0
				o.wirecolor = mycolor
			)
		)
		update o
	)
)

-- Set Custom property
fn SetCustomProperty type =
(
	numProps = 0
	prop = \"None\"
	if selection.count == 0 then return 0
	for i = 1 to selection.count do
	(
		o = selection[i]
		if ClassOf o == Editable_Mesh then
		(
			sfov  = stringStream \"\"
			sglow = stringStream \"\"
			format \"%, %, %\" prop_fov.fov prop_fov.spr prop_fov.rt to:sfov
			format \"%, %, %, %\" (prop_glow.color.red/255) (prop_glow.color.green/255) (prop_glow.color.blue/255) prop_glow.radius to:sglow
			SetUserPropBuffer o \"\"
			if ((findString o.name \"$attach\")==1) or ((findString o.name \"$normal\")==1) or \			   ((findString o.name \"$gun\")   ==1) or ((findString o.name \"$ground\")==1) or \			   ((findString o.name \"$dummy\")==1) then continue
			case type of
			(
				2:  SetUserPropBuffer o \"$facing\"
				3:  SetUserProp       o \"$rotate\" prop_rotate
				4:  SetUserProp       o \"$fov\"    (sfov as string)
				5: (SetUserProp       o \"$glow\"   (sglow as string); o.wirecolor = prop_glow.color)
				6:  SetUserPropBuffer o \"$custom\"
				7:  SetUserPropBuffer o \"$shell\"
				8:  SetUserPropBuffer o \"$frontface\"
				9:  SetUserPropBuffer o \"$jitter\"
				10: SetUserPropBuffer o \"$viewer\"
				11: SetUserPropBuffer o (\"$monitor0\" + prop_monitor as string)
				12: SetUserPropBuffer o \"$layer\"
			)
			prop = GetUserPropBuffer o
			if prop == \"\" then prop = \"None\"
			numProps += 1
		)
	)
	if numProps>0 then messageBox (\"Property \"+prop+\" set for \"+ numProps as string + \" object(s)\")
)


-- ******************** Floating Rollout window ********************
--

-- ********** Sub-Object(s) Property rollouts **********
--
rollout Prop1 \"None\"   (label lab01 \"Sub-Object(s) has No properties.\"   align:#left)
rollout Prop2 \"Facing\" (label lab02 \"Sub-Object(s) always Faces player.\" align:#left)
rollout Prop3 \"Rotate\"
(
	label   lab03     \"Sub-Object(s) is a Rotator.\" align:#left
	spinner spnrotate \"Rotates once every: \"        align:#left across:2 fieldWidth:40 range:[0.1,999,prop_rotate]
	label   lab04     \" seconds\"                    align:#right
	on spnrotate changed val do (prop_rotate = val)
)
rollout Prop4 \"Turret/FOV\"
(
	label   lab05    \"Sub-Object(s) is a Turret.\" align:#left
	spinner spnfov   \"Field of View: \"            align:#right offset:[-30,2]  fieldWidth:40 range:[0.0,360.0,prop_fov.fov]
	spinner spnspr   \"Seconds per Rotation: \"     align:#right offset:[-30,-3] fieldWidth:40 range:[0.1,60.0,prop_fov.spr]
	spinner spnrt    \"Reaction Time: \"            align:#right offset:[-30,-3] fieldWidth:40 range:[0.0,10.0,prop_fov.rt]
	on spnfov changed val do (prop_fov.fov = val)
	on spnspr changed val do (prop_fov.spr = val)
	on spnrt  changed val do (prop_fov.rt  = val)
)
rollout Prop5 \"Glow/Thruster\"
(
	label       lab06         \"Sub-Object(s) is a Glow/Thruster.\"  align:#left
	colorpicker cpglowcolor   \"Glow Color: \"                       align:#left  across:2 color:prop_glow.color
	spinner     spnglowradius \"Radius: \"                           align:#right offset:[0,4] range:[0.0,999.9,prop_glow.radius]
	on cpglowcolor   changed val do (prop_glow.color  = val)
	on spnglowradius changed val do (prop_glow.radius = val)
)
rollout Prop6  \"Custom\"    (label lab07 \"Sub-Object(s) has Custom texture/color.\" align:#left)
rollout Prop7  \"Shell\"     (label lab08 \"Sub-Object(s) is a Door Shell.\"          align:#left)
rollout Prop8  \"FrontFace\" (label lab09 \"Sub-Object(s) is a Door Front.\"          align:#left)
rollout Prop9  \"Jitter\"    (label lab10 \"Sub-Object(s) Jitters.\"                  align:#left)
rollout Prop10 \"Viewer\"    (label lab11 \"Sub-Object(s) is Viewer.\"                align:#left)
rollout Prop11 \"Monitor(01-08)\"
(
	label        lab12 \"Sub-Object(s) is a Monitor.\" align:#left
	dropdownlist dlMonitor                           align:#left width:(winSize.x-54) items:monitors selection:prop_monitor
	on dlMonitor selected sel do (prop_monitor = sel)
)
rollout Prop12 \"Layer\" (label lab13 \"Sub-Object(s) is drawn after model.\" align:#left)


-- ********** Main Rollout(s) **********
--
-- About rollout
rollout main \"About\"
(
	label  label01 \"Max OOF Utility v1.0\"
	bitmap logo width:132 height:68 fileName:myLogo
	label  label02 \"by Rob 'SuperSheep' Piontek\"
	label  label03 \"See Readme.txt for instructions\"
)
-- Object rollout
rollout model \"Model\"
(
	group \"Mesh\"
	(
		button       btnWeldVerts  \"Weld Redundant Verts\" align:#left  width:(winSize.x-54)
		progressbar  pbProgress                           align:#left  width:(winSize.x-54) height:8 value:0 color:red
		button       btnColorize   \"Colorize\"             align:#left  width:((winSize.x-59)/2) across:2
		button       btnColorizeBW \"B/W Colorize\"         align:#right width:((winSize.x-59)/2)
	)
	group \"Materials\"
	(
		button   btnSelFloater \"+\"                       align:#left  width:20 height:20 across:3 toolTip:\"Select object(s)\" images:#(myImage,myImageA,2,1,1,2,2)
		button   btnCreateMat \"Create Materials\"         align:#left  pos:[(btnSelFloater.pos.x+30),(btnSelFloater.pos.y)] width:((winSize.x-70)*.5)
		spinner  spnMatSlot   \"Slot: \"                   align:#right fieldWidth:30 range:[1,24,(mtlSlot)] type:#integer offset:[0,4]
		checkBox cbWildSearch \"Wildcard Material Search\" align:#left  checked:wildSearch
	)
	-- Fix 3DS file button pressed
	on btnWeldVerts pressed do
	(
		setCommandPanelTaskMode mode:#modify
		try
		(
			disableSceneRedraw()
			undo off
			(
				for i = 1 to objects.count do
				(
					pbProgress.value = 100*i/objects.count
					obj = objects[i]
					if ClassOf obj == Editable_Mesh then
					(
						modPanel.setCurrentObject obj
						subObjectLevel = 1
						weldAllVerts(obj)
						subObjectLevel = 0
						update obj
						clearSelection()
					)
				)
			)
			enableSceneRedraw()
			pbProgress.value = 0
		)
		catch
		(
			enableSceneRedraw()
			pbProgress.value = 0
			throw()
		)
		redrawViews()
	)
	on btnColorize   pressed          do (colorize 1)
	on btnColorizeBW pressed          do (colorize 2)
	on btnSelFloater pressed          do (max selection floater)
	on btnCreateMat  pressed          do (createMaterialsFromObjects(); assignMaterials())
	on spnMatSlot    changed val      do (mtlSlot = val)
	on cbWildcard    changed theState do (wildSearch = theState)
)

-- Sub-Object rollout
rollout submodel \"Sub Model\"
(
	button       btnSelFloater \"+\"             align:#left  width:20 height:20 across:3 toolTip:\"Select object(s)\" images:#(myImage,myImageA,2,1,1,2,2)
	button       btnSetProp    \"Set Property:\" align:#left  pos:[(btnSelFloater.pos.x+30),(btnSelFloater.pos.y)] width:((winSize.x-100)*.5)
	dropdownlist dlProperty                    align:#right width:((winSize.x-75)*.5) height:13 items:props selection:1

	on dlProperty selected sel do
	(
		if sel!=curPropShown then
		(
			cp = (curPropShown as string)
			execute(\"removerollout Prop\"+cp+\" MaxOOFUtility\")
			execute(\"addrollout Prop\"+(sel as string)+\" MaxOOFUtility\")
			curPropShown = sel
		)
	)
	on btnSetProp    pressed do (SetCustomProperty curPropShown)
	on btnSelFloater pressed do (max selection floater)
)

-- Create Floating Rollout
file = getFiles(myImage);  if file.count == 1 then myImage  = file[1]
file = getFiles(myImageA); if file.count == 1 then myImageA = file[1]
file = getFiles(myLogo);   if file.count == 1 then myLogo   = file[1]
MaxOOFUtility = newrolloutfloater \"MaxOOFUtility\" (winSize.x) (winSize.y)
addrollout main     MaxOOFUtility
addrollout model    MaxOOFUtility
addrollout submodel MaxOOFUtility
addrollout Prop1    MaxOOFUtility

Posted: Sun Feb 24, 2008 9:16 pm
by jshaner
Well, i do agree that the OOF format is painful and outdated, but it is something i must bear with nonetheless. It isn't that bad, it just needs more attention than a more common format. Maybe my example was poor, i don't know. Even then, i could use another example with dif. formats involved and get the same error. I can take the ASE pyro from Diedel's site and get the same thing if i do an SDL check and export it to my game engine. Not to say it is a crappy model, (it is beautiful and fits what it was intended for) but i don't know where to go. So i guess ignore what i had to say about .OOF and see this: I get the same errors with any model, whether it be downloaded or hand made (Yes, i also prefer to hand make things). So really, what is causeing my problems? My game engine being nit picky?


-and textures aren't a major concern right now. I am trying to get a decent model working (not to say the ones i have tried are not, they just don't suit my uses). So any help on dif. formats and such would be appreciated!

Posted: Sun Feb 24, 2008 9:24 pm
by MetalBeast
If you have problems with any models, than it's problem of your engine, which probably needs a special kind of models.

So you should read in the engine-documentation, what kind of models are supported.

Posted: Mon Feb 25, 2008 1:50 am
by VladR
Sorry for OT, but is there a way how to get the level geometry imported into 3dsmax ? Or at least into ASE format so I could import it into my engine/editor (and put Radiosity lights there).

Posted: Mon Feb 25, 2008 1:57 am
by Diedel
I will write an ASE exporter for Descent models and levels, but that will take a while. We will need it for the port to the new engine anyway - I want the entire D1+D2 level base available for it. ;)

Posted: Mon Feb 25, 2008 2:09 am
by VladR
Yeah, that would be definitely great. But I can understand that not being a priority right now.
I believe some long time ago I`ve found some docs about the internal format of the level geometry, there was just some issue with extracting the level.

Writing an importer shouldn`t be a matter of more than 4 hrs at most, i.e. one evening, as long as the documentation is full and format doesn`t contain last-minute hacks.

Any quick pointers ?

Posted: Mon Feb 25, 2008 5:23 am
by Diedel
Supersheep,

FYI: OOF tool seems to mess up face normals, at least that's MetalBeast's experience with it. Not that we'd need it since introduction of ASE support in D2X-XL, but maybe you want to look into it.

Re:

Posted: Mon Feb 25, 2008 7:18 am
by BUBBALOU
zombie999 wrote:I used it, just don't like it,
the Max OOF Utility did'nt work for me.

And I don't like your comment.
Is just your evidence of incapacity.
Go and spam to another thread.
I have no issues modeling for any engine or with any program and or plugin!

Your lack of knowledge and experience is showing...

Back On Topic
-------------------

You can Use Intel Multires© to at least reduce your model to and acceptable level but the finishing touches will have to be done by hand

Re:

Posted: Mon Feb 25, 2008 7:30 am
by Diedel
BUBBALOU wrote:wow - sounds like someone who never used Super Sheep's tool in the first place, has alot to say about nothing

bad form

bad attitude

zombie999
Bubbalou,

until you showed up here, Zombie and S-Sheep were having a well behaved and conducted conversation - no insults or hard feelings involved as far as I can see.

But apparently it is your nature to crap into every thread you come across.

If this was my forum, you'd have gotten the boot already.

Re:

Posted: Mon Feb 25, 2008 8:38 am
by MetalBeast
BUBBALOU wrote:
I have no issues modeling for any engine or with any program and or plugin!

Your lack of knowledge and experience is showing...
Dude, you are just poor spammer, nothing more.
Big mouth nothing behind. ;)

Posted: Mon Feb 25, 2008 9:21 am
by jshaner
You know, i have to admit that i am a rookie at modeling and things involved with that.

I will make a video of what i am doing on rapidshare, so you all can see what i am facing, so there is no more of this controversy. (poor spelling, i know)

it (the game engine) basically supports any format that 3ds max can read, but it just has to be clean. EDIT:has to be exported, but that is not important. I only started Max a couple months ago. I know i am not too good at it, and that is why i am asking for help.

Everybody's models i have tried are very detailed and good, i just can't use them for what i am doing.

I would consider the ASE format, but i can't find a good free importer for max.

i have to go, so help would be appreciated.
i will inform you all about my rapidshare video later sometime.

Posted: Mon Feb 25, 2008 3:16 pm
by Aus-RED-5
People, don't feed the trolls!

Ignore the comments and move on or I will start editing and removing posts.

So far the comments aren't that bad, so keep it civil please. ;)

Posted: Mon Feb 25, 2008 7:19 pm
by jshaner
I don't mean to cause controversy...i just need assistance.

I have been very busy lately, i will get my video up asap. :idea:

Posted: Mon Feb 25, 2008 7:27 pm
by BUBBALOU
jshaner just p/m me if you need any assistance without biased opinions or bad attitudes from the peanut gallery

you should of posted this in the ptmc gallery anyways

EDIT By MOD
Link removed.
We could link to some of your own bad attitude as well, but no need to continue the trolling in here.

Posted: Mon Feb 25, 2008 8:05 pm
by Aus-RED-5
Ok.

Lets leave it at that. :roll: