Skip to main content
Skip to main content

MaterialManager

MaterialManager

Description

This class handles all materials

Parent

AbstractManager

Functions

addBaseMaterial

Description

Adds a new base material

Definition

addBaseMaterial(string materialName, integer materialId)

Arguments

stringmaterialNamematerialName
integermaterialIdinternal material id

Code

function MaterialManager:addBaseMaterial(materialName, materialId)
self.baseMaterialsByName[ string.upper(materialName)] = materialId
table.insert( self.baseMaterials, materialId)
end

addMaterial

Description

Adds a new material type

Definition

addMaterial(integer fillTypeIndex, string materialType, integer materialIndex, integer materialId)

Arguments

integerfillTypeIndexfilltype index
stringmaterialTypematerialType
integermaterialIndexmaterial index
integermaterialIdinternal material id

Code

function MaterialManager:addMaterial(fillTypeIndex, materialType, materialIndex, materialId)
self:addMaterialToTarget( self.materials, fillTypeIndex, materialType, materialIndex, materialId)
end

addMaterialToTarget

Description

Adds a new material type to given target table

Definition

addMaterialToTarget(table target, integer fillTypeIndex, string materialType, integer materialIndex, integer materialId)

Arguments

tabletargettarget table
integerfillTypeIndexfilltype index
stringmaterialTypematerialType
integermaterialIndexmaterial index
integermaterialIdinternal material id

Code

function MaterialManager:addMaterialToTarget(target, fillTypeIndex, materialType, materialIndex, materialId)
if fillTypeIndex = = nil or materialType = = nil or materialIndex = = nil or materialId = = nil then
return
end

if target[fillTypeIndex] = = nil then
target[fillTypeIndex] = { }
end
local fillTypeMaterials = target[fillTypeIndex]

if fillTypeMaterials[materialType] = = nil then
fillTypeMaterials[materialType] = { }
end
local materialTypes = fillTypeMaterials[materialType]

if g_showDevelopmentWarnings and materialTypes[materialIndex] ~ = nil then
local fillType = g_fillTypeManager:getFillTypeByIndex(fillTypeIndex)
Logging.devWarning( "Material type '%s' already exists for fillType '%s'.It will be overwritten!" , tostring(materialType), tostring(fillType.name))
end

materialTypes[materialIndex] = materialId
end

addMaterialType

Description

Adds a new material type

Definition

addMaterialType(string name)

Arguments

stringnamename

Code

function MaterialManager:addMaterialType(name)
if not ClassUtil.getIsValidIndexName(name) then
printWarning( "Warning: '" .. tostring(name) .. "' is not a valid name for a materialType.Ignoring it!" )
return nil
end

name = string.upper(name)

if self.nameToIndex[name] = = nil then
table.insert( self.materialTypes, name)
self.nameToIndex[name] = # self.materialTypes
end

return nil
end

addModMaterialHolder

Description

Returns material for given properties

Definition

addModMaterialHolder()

Arguments

anyfilename

Code

function MaterialManager:addModMaterialHolder(filename)
self.modMaterialHoldersToLoad[filename] = filename
end

addParticleMaterial

Description

Adds a new particle material type

Definition

addParticleMaterial(integer fillTypeIndex, string materialType, integer materialIndex, integer materialId)

Arguments

integerfillTypeIndexfilltype index
stringmaterialTypematerialType
integermaterialIndexmaterial index
integermaterialIdinternal material id

Code

function MaterialManager:addParticleMaterial(fillTypeIndex, materialType, materialIndex, materialId)
self:addMaterialToTarget( self.particleMaterials, fillTypeIndex, materialType, materialIndex, materialId)
end

getBaseMaterialByName

Description

Returns base material by given name

Definition

getBaseMaterialByName(string materialName)

Arguments

stringmaterialNamematerialName

Return Values

stringmaterialIdinternal material id

Code

function MaterialManager:getBaseMaterialByName(materialName)
if materialName ~ = nil then
return self.baseMaterialsByName[ string.upper(materialName)]
end

return nil
end

getFontMaterial

Description

Definition

getFontMaterial()

Arguments

anymaterialName
anycustomEnvironment

Code

function MaterialManager:getFontMaterial(materialName, customEnvironment)
if customEnvironment ~ = nil and customEnvironment ~ = "" then
local customMaterialName = customEnvironment .. "." .. materialName
if self.fontMaterialsByName[customMaterialName] ~ = nil then
return self.fontMaterialsByName[customMaterialName]
end
end

return self.fontMaterialsByName[materialName]
end

getMaterial

Description

Returns material for given properties

Definition

getMaterial(integer fillType, string materialTypeName, integer materialIndex)

Arguments

integerfillTypefill type
stringmaterialTypeNamename of material type
integermaterialIndexindex of material

Return Values

integermaterialIdid of material

Code

function MaterialManager:getMaterial(fillType, materialTypeName, materialIndex)
return self:getMaterialFromTarget( self.materials, fillType, materialTypeName, materialIndex)
end

getMaterialFromTarget

Description

Returns material for given properties

Definition

getMaterialFromTarget(integer fillType, string materialTypeName, integer materialIndex, )

Arguments

integerfillTypefill type
stringmaterialTypeNamename of material type
integermaterialIndexindex of material
anymaterialIndex

Return Values

anymaterialIdid of material

Code

function MaterialManager:getMaterialFromTarget(target, fillType, materialTypeName, materialIndex)
if fillType = = nil or materialTypeName = = nil or materialIndex = = nil then
return nil
end

local materialType = self:getMaterialTypeByName(materialTypeName)
if materialType = = nil then
return nil
end

local fillTypeMaterials = target[fillType]
if fillTypeMaterials = = nil then
--#debug Logging.warning("missing fillType materials for fillType %s(materialTypeName %s, materialIndex %s)", g_fillTypeManager:getFillTypeNameByIndex(fillType), materialTypeName, materialIndex)
return nil
end

local materials = fillTypeMaterials[materialType]
if materials = = nil then
--#debug Logging.warning("missing fillType materials for materialType %s", materialType)
return nil
end

return materials[materialIndex]
end

getMaterialTypeByName

Description

Returns a materialType by name

Definition

getMaterialTypeByName(string name)

Arguments

stringnamename of material type

Return Values

stringmaterialTypethe real material name, nil if not defined

Code

function MaterialManager:getMaterialTypeByName(name)
if name ~ = nil then
name = string.upper(name)

-- atm we just return the uppercase name because a material type is only defined as a base string
if self.nameToIndex[name] ~ = nil then
return name
end
end

return nil
end

getParticleMaterial

Description

Returns material for given properties

Definition

getParticleMaterial(integer fillType, string materialTypeName, integer materialIndex)

Arguments

integerfillTypefill type
stringmaterialTypeNamename of material type
integermaterialIndexindex of material

Return Values

integermaterialIdid of material

Code

function MaterialManager:getParticleMaterial(fillType, materialTypeName, materialIndex)
return self:getMaterialFromTarget( self.particleMaterials, fillType, materialTypeName, materialIndex)
end

initDataStructures

Description

Initialize data structures

Definition

initDataStructures()

Code

function MaterialManager:initDataStructures()
self.nameToIndex = { }
self.materialTypes = { }
self.materials = { }
self.particleMaterials = { }
self.modMaterialHoldersToLoad = { }
self.fontMaterials = { }
self.fontMaterialsByName = { }

self.baseMaterials = { }
self.baseMaterialsByName = { }

self.loadedMaterialHolderNodes = { }
end

loadFontMaterialsXML

Description

Definition

loadFontMaterialsXML()

Arguments

anyxmlFilename
anycustomEnvironment
anybaseDirectory

Code

function MaterialManager:loadFontMaterialsXML(xmlFilename, customEnvironment, baseDirectory)
self.xmlFile = XMLFile.load( "TempFonts" , xmlFilename, MaterialManager.fontMaterialXMLSchema)
if self.xmlFile ~ = nil then
self.xmlFile.references = 0

self.xmlFile:iterate( "fonts.font" , function (index, key)
self.xmlFile.references = self.xmlFile.references + 1

local fontMaterial = FontMaterial.new()
fontMaterial:loadFromXML( self.xmlFile, key, customEnvironment, baseDirectory, function (success)
if self.xmlFile ~ = nil then
self.xmlFile.references = self.xmlFile.references - 1
if self.xmlFile.references = = 0 then
self.xmlFile:delete()
self.xmlFile = nil

if self.finishedLoadingCallback ~ = nil then
self.finishedLoadingCallback( self.callbackTarget)
self.finishedLoadingCallback = nil
self.callbackTarget = nil
end
end
end

if success then
table.insert( self.fontMaterials, fontMaterial)
self.fontMaterialsByName[fontMaterial.name] = fontMaterial
end
end )
end )
end

if self.xmlFile = = nil or self.xmlFile.references = = 0 then
if self.xmlFile ~ = nil then
self.xmlFile:delete()
self.xmlFile = nil
end
if self.finishedLoadingCallback ~ = nil then
self.finishedLoadingCallback( self.callbackTarget)
self.finishedLoadingCallback = nil
self.callbackTarget = nil
end
end
end

loadMapData

Description

Load data on map load

Definition

loadMapData()

Arguments

anyxmlFile
anymissionInfo
anybaseDirectory
anyfinishedLoadingCallback
anycallbackTarget

Return Values

anytrueif loading was successful else false

Code

function MaterialManager:loadMapData(xmlFile, missionInfo, baseDirectory, finishedLoadingCallback, callbackTarget)
MaterialManager:superClass().loadMapData( self )

self:addMaterialType( "fillplane" )
self:addMaterialType( "icon" )
self:addMaterialType( "unloading" )
self:addMaterialType( "smoke" )
self:addMaterialType( "straw" )
self:addMaterialType( "chopper" )
self:addMaterialType( "soil" )
self:addMaterialType( "sprayer" )
self:addMaterialType( "spreader" )
self:addMaterialType( "pipe" )
self:addMaterialType( "mower" )
self:addMaterialType( "belt" )
self:addMaterialType( "belt_cropDirt" )
self:addMaterialType( "belt_cropClean" )
self:addMaterialType( "leveler" )
self:addMaterialType( "washer" )
self:addMaterialType( "pickup" )

MaterialType = self.nameToIndex

-- called after last font material was loaded
self.finishedLoadingCallback = finishedLoadingCallback
self.callbackTarget = callbackTarget

self:loadFontMaterialsXML( MaterialManager.DEFAULT_FONT_MATERIAL_XML, nil , self.baseDirectory)

return true
end

loadModMaterialHolders

Description

Definition

loadModMaterialHolders()

Code

function MaterialManager:loadModMaterialHolders()
for filename, _ in pairs( self.modMaterialHoldersToLoad) do
g_i3DManager:loadI3DFileAsync(filename, true , true , MaterialManager.materialHolderLoaded, self , nil )
end
end

materialHolderLoaded

Description

Definition

materialHolderLoaded()

Arguments

anyi3dNode
anyfailedReason
anyargs

Code

function MaterialManager:materialHolderLoaded(i3dNode, failedReason, args)
if i3dNode ~ = 0 then
for i = getNumOfChildren(i3dNode) - 1 , 0 , - 1 do
local child = getChildAt(i3dNode, i)
unlink(child)
table.insert( self.loadedMaterialHolderNodes, child)
end

delete(i3dNode)
end
end

new

Description

Creating manager

Definition

new()

Arguments

anycustomMt

Return Values

anyinstanceinstance of object

Code

function MaterialManager.new(customMt)
local self = AbstractManager.new(customMt or MaterialManager _mt)

MaterialManager.fontMaterialXMLSchema = XMLSchema.new( "fontMaterials" )
FontMaterial.registerXMLPaths( MaterialManager.fontMaterialXMLSchema)

return self
end

unloadMapData

Description

Definition

unloadMapData()

Code

function MaterialManager:unloadMapData()
for _, node in ipairs( self.loadedMaterialHolderNodes) do
delete(node)
end

if self.xmlFile ~ = nil then
self.xmlFile:delete()
self.xmlFile = nil
end

for _, font in ipairs( self.fontMaterials) do
delete(font.materialNode)
if font.materialNodeNoNormal ~ = nil then
delete(font.materialNodeNoNormal)
end
if font.characterShape ~ = nil then
delete(font.characterShape)
end
if font.sharedLoadRequestId ~ = nil then
g_i3DManager:releaseSharedI3DFile(font.sharedLoadRequestId)
end
end

MaterialManager:superClass().unloadMapData( self )
end