Jump to content
Official BF Editor Forums
stefax

HELP ME PLEASE -- Unknown property: "saveMaterial" in undefined

Recommended Posts

I need help guys,im stuck on exporting bf2 vehicle.when i try to export i get this error.    PLEASE HELP:(

-- Unknown property: "saveMaterial" in undefined
-- this struct holds the main scene dumping functions
struct rSceneDump
(


fn getFilenameExt =
(
	return "Objects(Objects.con)|Objects.con|All|*.*|"
),


-- rSceneDump.writeMesh f meshObj matInfo coordSpace:(matrix3 1) s:s isNonVis:isNonVis
fn writeMesh f obj matInfo coordSpace:#world s:0.1 isNonVis:false bnObjs:#() dontWarnSkinWeights:false minUvSetCnt:0=
(
	
	RMesh.export obj fHandle:f isLocal:true matInfo:matInfo coordSpace:coordSpace s:s isNonVis:isNonVis bnObjs:bnObjs dontWarnSkinWeights:dontWarnSkinWeights minUvSetCnt:minUvSetCnt 
	
),


fn writeTransform f t s:0.1=
(
	writeFloat f t.row1.x
	writeFloat f t.row1.z
	writeFloat f t.row1.y
	
	writeFloat f t.row3.x
	writeFloat f t.row3.z
	writeFloat f t.row3.y
	
	writeFloat f t.row2.x
	writeFloat f t.row2.z
	writeFloat f t.row2.y
	
	-- Position
	writeFloat f (t.row4.x*s)
	writeFloat f (t.row4.z*s)
	writeFloat f (t.row4.y*s)
),



fn saveAnimation f obj objParent range:#(0,0) s:0.1=
(
	writeLong f (range[2] - range[1] + 1)
	
	if objParent != undefined then
	(
		for i=range[1] to range[2] do
		(
			local t
			at time i
			(	
				local t1 = copy obj.transform 
				local t2 = copy objParent.transform
				t = t1 * inverse t2
			)
			
			local bonePos = [t.row4.x, t.row4.z, t.row4.y] * s		
			t.row4 = [0,0,0]
		
			local r = (bf2TransformConvert t).rotation
			
			writeFloat f r.x
			writeFloat f r.y
			writeFloat f r.z
			writeFloat f r.w
			
			writeFloat f bonePos[1]
			writeFloat f bonePos[2]
			writeFloat f bonePos[3]	
		)
	)
	else
	(
		for i=range[1] to range[2] do
		(
			local t
			at time i
			(	
				t = copy obj.transform
			)	
			
			local bonePos = [t.row4.x, t.row4.z, t.row4.y] * s		
			t.row4 = [0,0,0]
		
			local r = (bf2TransformConvert t).rotation
			
			writeFloat f r.x
			writeFloat f r.y
			writeFloat f r.z
			writeFloat f r.w
			
			writeFloat f bonePos[1]
			writeFloat f bonePos[2]
			writeFloat f bonePos[3]

		)		
	)
	
),

fn getRootNode objs = 
(
	for i=1 to objs.count do
	(
		if objs[i].parent == undefined then		
		(
			if objs[i].name.count > 5 then
			(
				local testName = lowercase objs[i].name
				if "root_" == (substring testName 1 5) then
				(
					return objs[i]
				)
			)
		)
	)

	return undefined
),


fn getRootNodeType rootObjNode = 
(		
	local objectTypeName = undefined
	if isValidNode rootObjNode then
	(
		local testName = lowercase rootObjNode.name
		
		objectTypeName = substring testName 6 -1
	
		-- "root_staticmesh_MyName"
		local foundID = findstring objectTypeName "_"
		if foundID != undefined then
		(
			objectTypeName = substring objectTypeName 1 (foundID-1)
		)
						
	)
	
	return objectTypeName 
),

fn save fname:undefined objs:undefined dbg:true anmRange:undefined anmObjs:undefined s:0.1 prefix:undefined=
(
	format "save()\n"
	
	if objs == undefined then objs = objects as array
	if objs.count == 0 then
	(
		format "ERROR! No objects to export!\n"
		return false
	)
	
	local scalesAreUniform = BF2checkScales objs
	
	format " scalesAreUniform: %\n" scalesAreUniform 
	format " anmRange: %\n" anmRange
	format " anmObjs: %\n" anmObjs
	
	
	
	-- Filename handling
	if fname == undefined then
	(
		fname = getSaveFileName types:(rSceneDump.getFilenameExt())
	)

	
	if fname == undefined then
	(	return false
	)
	
	-- make sure it has the .dat file extension
	local fnameType = getFilenameType fname
	if lowercase fnameType != ".dat" then 
	(
		if fnameType.count > 0 then fname = (substring fname 1 (fname.count - fnameType.count)) + ".dat"
		else fname = fname + ".dat"
		
	)
	
	format " fname: %\n" fname 
	
	format " objs: %\n" objs
	-- find the root node type
	
	local rootObjNode = rSceneDump.getRootNode objs
	local objectTypeName = rSceneDump.getRootNodeType rootObjNode 

	if objectTypeName == undefined then 
	(
		MessageBox "Undefined root type! should be one of these: bundledMesh, staticMesh, ..."
		return false
	)
	
	local isStaticObject = false
	local isAnimation = false
	local isSkeleton = false
	
	
	local jointNodeTypes = #()
	append JointNodeTypes BoneGeometry
	append jointNodeTypes Pyramid
	
	local validType = false
	if objectTypeName == "staticmesh" then
	(
		isStaticObject = true
		anmRange = #(currentTime, currentTime)
		anmObjs = #()
		jointNodeTypes = #()
		validType = true
	)
	if objectTypeName == "bundledmesh" or objectTypeName == "meshparticlemesh" then
	(
		anmRange = #(currentTime, currentTime)
		anmObjs = #()
		validType = true
	)
	if objectTypeName == "skeleton" or objectTypeName == "skinnedmesh" then
	(
		isSkeleton = true
		anmRange = #(currentTime, currentTime)
		anmObjs = #()
		validType = true
	)
	if objectTypeName == "animation" then
	(
		isAnimation = true	
		--append jointNodeTypes Dummy
		validType = true
	)

	if not validType then
	(
		local errMesg = "ERROR! Root object name is unknown: \"" + (objectTypeName as string) + "\"\nCheck your spelling."
		format "%\n" errMesg 
		MessageBox errMesg 
		return false
	)
	
	local isAnimOrSke = isAnimation or isSkeleton
	
	format " jointNodeTypes: %\n" jointNodeTypes
	
	-- For use in animations, kit parts and weapon parts
	-----------------
	local rHand
	local root_bone
	local is1p = false
	local is3p = false
	if isAnimOrSke then
	(
		for o in objs do
		(
			local bnName = lowercase o.name
			if bnName == "right_ullna" then 
			(	
				rHand = o
				is3p = true
			)
	
			if bnName == "torus"  then
			(
				rHand = o
				is1p = true
			)
			
			if bnName == "root"  then
			(
				root_bone = o
			)
		)
	)

	
	-- (1p skeleton) weapon parts are mesh1 ... mesh16				
	-- (3p skeleton) kits take over   mesh9 ... mesh16
	local numWeapParts = 0
	if is3p then
	(
		numWeapParts = 8
	)
	else
	(	
		if is1p then numWeapParts = 16 
	)
	-----------------
	
	
	-- create the file
	local f = fopen fname "wb"
	
	-- file didn't open, so create the path and try again
	if (f == undefined) then
	(
		local fnamePath = getFilenamePath fname
		fnamePath = replaceChar fnamePath "/" "\\"
		local b = makeDir fnamePath
		f = fopen fname "wb"
	)
	
	if (f != undefined) then
	(
		local rootNodeTransform = rootObjNode.transform
		
		-- Prefixes object names to make them unique for the global game scope
		local objsPrefix = #()
		if not isAnimOrSke and classof prefix == String then
		(
			if isValidNode rootObjNode then
			(
				bf2getNodesforPrefix rootObjNode objsPrefix
				bf2AddNamePrefix objsPrefix prefix 
			)
		)
	
		-------------
		-- SORTING object order
		--
		local objsNew = BF2SortSkeParts objs objectTypeName is1p is3p
		
		--fclose f
		--return
		
		--objs = objsNew
		
		if not isAnimOrSke then
			objs = objsNew 
	
		if isAnimation then
		(
			format "  isAnimation : %\n" isAnimation
		--	objs = objsNew 
		)


		
		
		local oldRootName = rootObjNode.name
		rootObjNode.name = "root_" + objectTypeName

		
		-- CALCULATE MESH INFO
		local meshCount = 0
		local validMeshIDs = #()
		
		local objUsesMesh = #()
		objUsesMesh[objs.count] = undefined
		
		for i=1 to objs.count do
		(
			local curObj = objs[i]
			if SuperClassof curObj == GeometryClass then
			(
				if not (isOneOfThese curObj JointNodeTypes) then
				(				
					local meshObjId = i
					
					objUsesMesh[i] = meshObjId
					if 0 == (findItem validMeshIDs meshObjId) then
						append validMeshIDs meshObjId
				)
			)
		)
		
		format " validMeshIDs: %\n" validMeshIDs
		
		-- EXPORT MESH DATA
		writeLong f validMeshIDs.count
		
		
		local matFname = (getFilenamePath fname) + (getFilenameFile fname) + ".material"
		deleteFile matFname 
		
		local fMat = fopen matFname "w"
		if fmat != undefined then
		(
			fclose fMat 
		)
		else
		(
			format "WARNING! Unable to create file: %\n" matFname 
		)
		
		
		for i=1 to validMeshIDs.count do
		(
			local meshObj = objs[validMeshIDs[i]]	
			local matInfo = BF2MatInfo.getMulti meshObj.material type:objectTypeName
			
			local meshObj_OriginalTransform = meshObj.transform
			
			local isNonVis = false
			if isValidNode meshObj.parent then
			(
				if (lowercase meshObj.parent.name == "nonvis_") then
					isNonVis = true;
			)
			
			
			
			local crdSpace = matrix3 1
			if isStaticObject then
			(				
				crdSpace = meshObj.transform * (inverse rootObjNode.transform)
			)
			else
			(
			
				local p = meshObj.parent
				if isValidNode p then
				(

					if lowercase p.name == "nonvis_" then
					(
						if isValidNode p.parent then
						(	
							-- A collision mesh's pivot is the visible mesh that it is parented to
							crdSpace = meshObj.transform * (inverse p.parent.transform)
						)
					)

					-- scale the mesh
					crdSpace = crdSpace * scaleMatrix meshObj.scale
					
				)
	
				
			)


			local dontWarnSkinWeights = false
			
			local bnObjs = #()
			-- TODO: Get the skeleton bones in the correct order as they will be in the export
			if objectTypeName == "skinnedmesh" then
			(
				format "SkinnedMesh ... Getting skeleton bones for mesh: %\n" meshObj.name
				bnObjs = bf2GetSkinMeshBones meshObj objs jointNodeTypes
			)
			if objectTypeName == "bundledmesh" then
			(
				dontWarnSkinWeights = true
				for o in objs do
				(
					if findItem jointNodeTypes (classof o) > 0 then 
						append bnObjs o
				)
			)
			local minUvSetCnt = 0
			if isStaticObject and not isNonVis then
			(
				minUvSetCnt = 4
			)
		
			
			rSceneDump.writeMesh f meshObj matInfo coordSpace:crdSpace s:s isNonVis:isNonVis bnObjs:bnObjs dontWarnSkinWeights:dontWarnSkinWeights minUvSetCnt:minUvSetCnt 

			meshObj.transform = meshObj_OriginalTransform
		
			local a = ""
			for i=1 to matInfo.count do
			(
				local fxMat = matInfo[i]
				
				if fxMat.fxFilename == undefined then
				(
				 	format "WARNING: % has undefined .fxFilename\n" meshObj.name
					--format "    % \n" fxMat
					--format "    % \n" meshObj.material
				)
				local b = fxMat.materialID as string
				b = b + ";" + (fxMat.materialName as string)
				b = b + ";" + (fxMat.fxFilename as string)
				b = b + ";" + (fxMat.technique as string) + ";"
				
				for j=1 to fxMat.textures.count do
				(
					local tmpTexture = fxMat.textures[j]
					if tmpTexture.count == 0 then tmpTexture = "default.dds"
					
					b = b + "|" + tmpTexture 
				)
					
				a = a + "?" + b
			)
			
			local saveMatSuccess = bf2mdtOps.saveMaterial matFname ("mesh" + ((i-1) as string)) a
			if saveMatSuccess != 0 then
			(
				format "WARNING! Unable to save file: %\n" matFname 
			)
		)
	
	
	
	
		

		-------------------------------
		-- EXPORT NODE GRAPH DATA
		-- each node has transform and can have a mesh instance
		writeLong f objs.count

		local animatedNodeNames = #()
		for i=1 to objs.count do
		(
			local curObj = objs[i]
	
			-- path Names "Fred|mike|pete" for graphing the scene
			local pathName = BF2getObjectPath curObj
			writeLong f (pathName.count + 1)
			writestring f pathName	
			
			-- debug info
			if dbg == true then
			(
				if i < 10 then format "  0%_:%\n" i pathName
				else format "  %_:%\n" i pathName
			)

			-- Node TypeId
			local typeId = -1
			local meshId = objUsesMesh[i]
			if meshId != undefined then
			(
				meshId = findItem validMeshIDs objUsesMesh[i]
				if (meshId == 0) then
					throw "ASSERT! meshID == 0!\n"
		
				meshId = meshId - 1
				typeId = 0 -- Is mesh
			)
			else
			(
				meshId = -1
			
				if (isOneOfThese curObj JointNodeTypes) then
				(
					typeId = 3; -- joint
				)
				else
				(
					case (classof curObj) of
					(
						Point: typeId = 1 -- locator
						default: typeID = 2 -- transform
					)
				)
			)
			
			local m_flags = 0
			local hasAnim = false
			
			if classof anmObjs == array then
			(	
				local findID = findItem anmObjs curObj
				if findID != 0 then
				(
					append animatedNodeNames curObj.name
					m_flags = bit.set m_flags 1 true -- anim_export true
					hasAnim = true
				)
			)
			
			--format "typeId:  %  %\n" typeId hasAnim 
			
			writeLong f typeId
			writeLong f meshId
			writelong f m_flags
			
			if hasAnim then
			(
				local objParent = curObj.parent
				
				-- weapons are relative to right hand
				local meshID = BF2GetMeshIDFromName curObj.name
				
				if classof meshID == integer then
				(	if meshID <= numWeapParts then
					( 
						objParent = objs[1]
						format "    weapon part: % (meshID : %)\n" curObj.name meshID 
					)
				)

				rSceneDump.saveAnimation f curObj objParent range:anmRange s:s 
			)
			else
			(
			
				if typeId == 3 then -- joint
				(
					rSceneDump.saveAnimation f curObj curObj.parent range:#(currentTime,currentTime) s:s
				)
				else
				(
					local t = undefined

					if isStaticObject then
					(
						t = matrix3 1 -- the staticobject will snap to this transform if not already this transform
					)
					else
					(
						local p = curObj.parent
						if isValidNode p then
						(
							if lowercase curObj.name == "nonvis_" then
							(	
								t = matrix3 1
							)
							else
							(
								if lowercase p.name == "nonvis_" then
								(
									if isValidNode p.parent then
									(	
										t = matrix3 1
										
									)
								)
							)
						)
					)

									
					if t == undefined then
					(
						t = curObj.transform
					
						if isValidNode curObj.parent then
						(
							t = curObj.transform * (inverse curObj.parent.transform)
							t.row4 = t.row4 * curObj.parent.scale
						)
						else
						(
						
							
						)
					)

					
				--	format " t: %\n" t
					
					-- write out relative transform coordinates
					writelong f 0
					rSceneDump.writeTransform f t s:s
				)
			)
		)
		format " animatedNodeNames: %\n" animatedNodeNames
		
		fclose f
		
		if objs.count > 0 then
			objs[1].name = oldRootName 
	
		-- Removes Prefixes object names to make them unique for the global game scope
		if not isAnimOrSke and classof prefix == String then
		(
			bf2RemoveNamePrefix objsPrefix prefix 
		)			

		return fname
		
		
	)
	else
	(
		format "Error! Could not create file!\n\t%\n" fname
		MessageBox ("Error! Could not create file:\n" + (fname as string))
	)



	
	
	return false
)

)

And sorry for my bad english.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...