Files
2025-09-29 00:52:08 +02:00

175 lines
4.2 KiB
Plaintext
Executable File

--
-- File:: matconvert.ms
-- Desc:: material converter
--
-- Author:: David Muir <david.muir@rockstarnorth.com>
-- Date:: Pre-GTA4, updated 5 December 2008
--
-----------------------------------------------------------------------------
-- Uses
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- Globals
-----------------------------------------------------------------------------
global RsCollConvertSourceMats = #()
global RsCollConvertTargetMats = #()
-----------------------------------------------------------------------------
-- Functions
-----------------------------------------------------------------------------
--
-- name: RsLoadConvertFile
-- desc: Load <common>/data/materials/mtl_convert.txt
--
fn RsLoadConvertFile filename =
(
-- Make sure we have latest version:
gRsPerforce.sync filename
RsCollConvertSourceMats = #()
RsCollConvertTargetMats = #()
datfile = openfile filename
if datfile == undefined then return false
while eof datfile == false do (
datline = readline datfile
if datline.count > 0 and datline[1] != "#" then (
lineTokens = filterstring datline " \t"
if ( 2 == lineTokens.count ) then
(
lineTokens[1] = toUpper lineTokens[1]
lineTokens[2] = toUpper lineTokens[2]
-- format "Map % ==> %\n" lineTokens[1] lineTokens[2]
append RsCollConvertSourceMats lineTokens[1]
append RsCollConvertTargetMats lineTokens[2]
)
)
)
close datfile
( RsCollConvertSourceMats.count == RsCollConvertTargetMats.count )
)
--
-- name: RsConvertCollisionOnMaterial
-- desc:
--
fn RsConvertCollisionOnMaterial mat =
(
if (isKindOf mat RexBoundMtl) do
(
-- Convert obsolete collision-types, or set to uppercase if it isn't already:
local matSurfType = RexGetCollisionName mat
local useSurfType = (toUpper matSurfType)
local idFound = finditem RsCollConvertSourceMats useSurfType
if (idFound != 0) do
(
useSurfType = RsCollConvertTargetMats[idFound]
)
if (useSurfType != matSurfType) do
(
format "%: converting material from % to %\n" mat.name matSurfType useSurfType
RexSetCollisionName mat useSurfType
)
)
)
--
-- name: RsConvertCollisionOnObjectCollision
-- desc:
--
fn RsConvertCollisionOnObjectCollision childobj =
(
if (getattrclass childobj != "Gta Collision") do return False
-- Convert obsolete collision-types attributes, or set to uppercase if it isn't already:
local idxSurfaceType = getattrindex "Gta Collision" "Coll Type"
local valSurfaceType = (getattr childobj idxSurfaceType)
local useSurfType = (toUpper valSurfaceType)
local idFound = finditem RsCollConvertSourceMats useSurfType
if (idFound != 0) do
(
useSurfType = RsCollConvertSourceMats[idFound]
)
if (useSurfType != valSurfaceType) do
(
format "%: converting attribute from % to %\n" childobj.name valSurfaceType useSurfType
setattr childobj idxSurfaceType useSurfType
)
-- Convert obsolete collision-material types:
if (isKindOf childObj Col_Mesh) do
(
case (classOf childobj.material) of
(
Multimaterial:
(
for childmat in childobj.material.materiallist do
(
if isKindOf childmat RexBoundMtl do
(
RsConvertCollisionOnMaterial childmat
)
)
)
RexBoundMtl:
(
RsConvertCollisionOnMaterial childobj.material
)
Default:
(
local boundmat = RexBoundMtl()
RexSetCollisionName boundmat RsCollConvertTargetMats[idFound]
childobj.material = Multimaterial()
childobj.material.materiallist[1] = boundmat
savetrans = childobj.transform
col2mesh childobj
numFaces = getnumfaces childobj
for i = 1 to numFaces do
(
SetfaceMatID childobj i 1
)
mesh2col childobj
childobj.transform = savetrans
)
)
)
)
--
-- name: RsConvertCollisionOnObject
-- desc:
--
fn RsConvertCollisionOnObject obj =
(
if getattrclass obj == "Gta Object" then
(
for childobj in obj.children do
(
RsConvertCollisionOnObjectCollision childobj
)
)
else
(
RsConvertCollisionOnObjectCollision obj
)
)