mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
Egg Model importer now works.
This commit is contained in:
parent
3b064600a0
commit
9bf60050f6
@ -1,5 +1,10 @@
|
|||||||
--------------------------------------------------------------------
|
--------------------------------------------------------------------
|
||||||
-- Egg Model Importer
|
-- Egg Model Importer
|
||||||
|
--
|
||||||
|
-- Drop this script into your 3DSMax scripts/startup folder.
|
||||||
|
--
|
||||||
|
-- You will find 'Egg Model Importer' in your MaxScript Utility panel.
|
||||||
|
--
|
||||||
--------------------------------------------------------------------
|
--------------------------------------------------------------------
|
||||||
|
|
||||||
utility EggModelImporter "Egg Model Importer" silentErrors:false
|
utility EggModelImporter "Egg Model Importer" silentErrors:false
|
||||||
@ -16,6 +21,7 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
local threshold
|
local threshold
|
||||||
local file
|
local file
|
||||||
local token
|
local token
|
||||||
|
local plaintoken
|
||||||
local suppress
|
local suppress
|
||||||
local vertexPos
|
local vertexPos
|
||||||
local vertexUV
|
local vertexUV
|
||||||
@ -41,7 +47,7 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
local index = findItem textureId id
|
local index = findItem textureId id
|
||||||
if (index == 0) then (
|
if (index == 0) then (
|
||||||
append textureId id
|
append textureId id
|
||||||
append textureFile id
|
append textureFile (id+".png")
|
||||||
index = textureId.count
|
index = textureId.count
|
||||||
)
|
)
|
||||||
return index
|
return index
|
||||||
@ -58,6 +64,18 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
return (vertexPoolOffs[index])
|
return (vertexPoolOffs[index])
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fn errorContext =
|
||||||
|
(
|
||||||
|
if (file == undefined) then return ""
|
||||||
|
local pos = filePos file
|
||||||
|
local target = pos - 100
|
||||||
|
if (target < 0) then target=0
|
||||||
|
seek file target
|
||||||
|
local data = readChars file (50+(pos - target))
|
||||||
|
seek file pos
|
||||||
|
return "---------------\nFile Position = "+(pos as string)+"\n---------------\n"+data+"\n---------------"
|
||||||
|
)
|
||||||
|
|
||||||
fn abortParse msg =
|
fn abortParse msg =
|
||||||
(
|
(
|
||||||
if (suppress == false) then (
|
if (suppress == false) then (
|
||||||
@ -66,11 +84,13 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
pos = filePos file
|
pos = filePos file
|
||||||
pos = pos as string
|
pos = pos as string
|
||||||
)
|
)
|
||||||
local fmsg = msg + " (filepos=" + pos + ")"
|
local ectxt = errorContext()
|
||||||
|
local fmsg = msg + "\n" + ectxt
|
||||||
messageBox fmsg
|
messageBox fmsg
|
||||||
suppress = true
|
suppress = true
|
||||||
if (file != undefined) then close file
|
if (file != undefined) then close file
|
||||||
token = undefined
|
token = undefined
|
||||||
|
plaintoken = false
|
||||||
file = undefined
|
file = undefined
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -79,6 +99,7 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
(
|
(
|
||||||
if (suppress) then (
|
if (suppress) then (
|
||||||
token = undefined
|
token = undefined
|
||||||
|
plaintoken = false
|
||||||
return undefined
|
return undefined
|
||||||
)
|
)
|
||||||
local res = token
|
local res = token
|
||||||
@ -88,8 +109,10 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
c = readChar file
|
c = readChar file
|
||||||
if (findString whiteSpace c != undefined) then (
|
if (findString whiteSpace c != undefined) then (
|
||||||
token = undefined
|
token = undefined
|
||||||
) else if (eof(file)) then (
|
plaintoken = false
|
||||||
|
) else if (eof(file)) or (c=="{") or (c=="}") then (
|
||||||
token = c
|
token = c
|
||||||
|
plaintoken = false
|
||||||
) else if (c=="/") then (
|
) else if (c=="/") then (
|
||||||
c = readChar file
|
c = readChar file
|
||||||
if (c=="/") then (
|
if (c=="/") then (
|
||||||
@ -100,14 +123,18 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
token = "/" + c
|
token = "/" + c
|
||||||
if (eof(file) == false) then
|
if (eof(file) == false) then
|
||||||
token += readDelimitedString file whiteSpace
|
token += readDelimitedString file whiteSpace
|
||||||
|
plaintoken = true
|
||||||
)
|
)
|
||||||
) else if (c=="<") then (
|
) else if (c=="<") then (
|
||||||
token = readDelimitedString file ">"
|
token = readDelimitedString file ">"
|
||||||
token = "<" + token + ">"
|
token = "<" + token + ">"
|
||||||
|
plaintoken = false
|
||||||
) else if (c == "\"") then (
|
) else if (c == "\"") then (
|
||||||
token = readDelimitedString file c
|
token = readDelimitedString file "\"\n"
|
||||||
|
plaintoken = true
|
||||||
) else (
|
) else (
|
||||||
token = c + readDelimitedString file whiteSpace
|
token = c + readDelimitedString file whiteSpace
|
||||||
|
plaintoken = true
|
||||||
)
|
)
|
||||||
local pos = filePos file
|
local pos = filePos file
|
||||||
if (pos > threshold) or (eof(file)) then (
|
if (pos > threshold) or (eof(file)) then (
|
||||||
@ -119,34 +146,33 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
fn plainToken =
|
|
||||||
(
|
|
||||||
return (token != undefined) and (token[1] != "<") and (token != "{") and (token != "}")
|
|
||||||
)
|
|
||||||
|
|
||||||
fn tagToken =
|
fn tagToken =
|
||||||
(
|
(
|
||||||
return (token != undefined) and (token[1] == "<")
|
return (plaintoken == false) and (token != undefined) and (token[1] == "<")
|
||||||
)
|
)
|
||||||
|
|
||||||
fn readSpecificToken id =
|
fn readSpecificToken id =
|
||||||
(
|
(
|
||||||
local res = readToken()
|
if plaintoken or (token != id) then (
|
||||||
if (res != id) then (
|
|
||||||
local expect = "Expected '" + id + "'"
|
local expect = "Expected '" + id + "'"
|
||||||
abortParse expect
|
abortParse expect
|
||||||
)
|
)
|
||||||
|
return readToken()
|
||||||
)
|
)
|
||||||
|
|
||||||
fn readPlainToken =
|
fn readPlainToken =
|
||||||
(
|
(
|
||||||
if (plainToken() == false) then
|
if (plaintoken == false) then
|
||||||
abortParse "expected a plain token"
|
abortParse "expected a plain token"
|
||||||
return readToken()
|
return readToken()
|
||||||
)
|
)
|
||||||
|
|
||||||
fn readFloatToken =
|
fn readFloatToken =
|
||||||
(
|
(
|
||||||
|
if (plaintoken == false) then (
|
||||||
|
abortParse "expected a floating point number"
|
||||||
|
return 0.0
|
||||||
|
)
|
||||||
local res = readToken()
|
local res = readToken()
|
||||||
try (
|
try (
|
||||||
return (res as float)
|
return (res as float)
|
||||||
@ -158,11 +184,15 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
|
|
||||||
fn readIntegerToken =
|
fn readIntegerToken =
|
||||||
(
|
(
|
||||||
|
if (plaintoken == false) then (
|
||||||
|
abortParse "expected an integer"
|
||||||
|
return 0.0
|
||||||
|
)
|
||||||
local res = readToken()
|
local res = readToken()
|
||||||
try (
|
try (
|
||||||
return (res as integer)
|
return (res as integer)
|
||||||
) catch (
|
) catch (
|
||||||
abortParse "expected an integer number"
|
abortParse "expected an integer"
|
||||||
return 0
|
return 0
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -171,9 +201,9 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
(
|
(
|
||||||
if (tagToken() == false) then abortParse "Expected a tag-token"
|
if (tagToken() == false) then abortParse "Expected a tag-token"
|
||||||
local tok = readToken()
|
local tok = readToken()
|
||||||
while plainToken() do readToken()
|
while plaintoken do readToken()
|
||||||
readSpecificToken "{"
|
readSpecificToken "{"
|
||||||
while plainToken() do readToken()
|
while plaintoken do readToken()
|
||||||
while tagToken() do readSectionIgnore()
|
while tagToken() do readSectionIgnore()
|
||||||
readSpecificToken "}"
|
readSpecificToken "}"
|
||||||
)
|
)
|
||||||
@ -233,7 +263,7 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
(
|
(
|
||||||
readSpecificToken "<Polygon>"
|
readSpecificToken "<Polygon>"
|
||||||
readSpecificToken "{"
|
readSpecificToken "{"
|
||||||
local tref = undefined
|
local tref = "texture"
|
||||||
local vpool = undefined
|
local vpool = undefined
|
||||||
local vlist = #()
|
local vlist = #()
|
||||||
while tagToken() do case token of (
|
while tagToken() do case token of (
|
||||||
@ -246,7 +276,7 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
"<VertexRef>" : (
|
"<VertexRef>" : (
|
||||||
readToken()
|
readToken()
|
||||||
readSpecificToken "{"
|
readSpecificToken "{"
|
||||||
while (plainToken()) do (
|
while (plaintoken) do (
|
||||||
local vid = readIntegerToken()
|
local vid = readIntegerToken()
|
||||||
append vlist vid
|
append vlist vid
|
||||||
)
|
)
|
||||||
@ -354,12 +384,13 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
local indices = #()
|
local indices = #()
|
||||||
readSpecificToken "<VertexRef>"
|
readSpecificToken "<VertexRef>"
|
||||||
readSpecificToken "{"
|
readSpecificToken "{"
|
||||||
while (plainToken()) do (
|
while (plaintoken) do (
|
||||||
local index = readIntegerToken()
|
local index = readIntegerToken()
|
||||||
append indices index
|
append indices index
|
||||||
)
|
)
|
||||||
readSpecificToken "<Scalar>"
|
readSpecificToken "<Scalar>"
|
||||||
readSpecificToken "membership"
|
local tok = readPlainToken()
|
||||||
|
if (tok != "membership") then abortParse "expected 'membership'"
|
||||||
readSpecificToken "{"
|
readSpecificToken "{"
|
||||||
local strength = readFloatToken()
|
local strength = readFloatToken()
|
||||||
readSpecificToken "}"
|
readSpecificToken "}"
|
||||||
@ -380,7 +411,8 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
fn readSectionGroup =
|
fn readSectionGroup =
|
||||||
(
|
(
|
||||||
local kind = readToken()
|
local kind = readToken()
|
||||||
local id = readPlainToken()
|
local id = "UNKNOWN"
|
||||||
|
if plaintoken then id = readToken()
|
||||||
if (kind == "<Joint>") then (
|
if (kind == "<Joint>") then (
|
||||||
local parent = jointStack[1]
|
local parent = jointStack[1]
|
||||||
local index = joints.count + 1
|
local index = joints.count + 1
|
||||||
@ -521,7 +553,7 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
setTVFace theMesh f polygonVerts[f]
|
setTVFace theMesh f polygonVerts[f]
|
||||||
)
|
)
|
||||||
|
|
||||||
fn buildSkeleton =
|
fn getSkeletonThickness =
|
||||||
(
|
(
|
||||||
if (joints.count == 0) then return 0
|
if (joints.count == 0) then return 0
|
||||||
local zlo = joints[1].pos.z
|
local zlo = joints[1].pos.z
|
||||||
@ -532,11 +564,29 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
if (z > zhi) then zhi = z
|
if (z > zhi) then zhi = z
|
||||||
)
|
)
|
||||||
local thickness = (zhi - zlo) * 0.025
|
local thickness = (zhi - zlo) * 0.025
|
||||||
|
return thickness
|
||||||
|
)
|
||||||
|
|
||||||
|
fn buildSkeletonPreserve =
|
||||||
|
(
|
||||||
|
local thickness = getSkeletonThickness()
|
||||||
for i = 1 to joints.count do (
|
for i = 1 to joints.count do (
|
||||||
local joint = joints[i]
|
local joint = joints[i]
|
||||||
chooseEndPos joint thickness
|
chooseEndPos joint thickness
|
||||||
local bone = BoneSys.createBone joint.pos joint.endpos joint.zaxis
|
local len = length (joint.endpos - joint.pos)
|
||||||
|
local xv = joint.xv
|
||||||
|
local yv = joint.yv
|
||||||
|
local zv = joint.zv
|
||||||
|
local txv = normalize (joint.endpos - joint.pos)
|
||||||
|
local tzv = joint.zaxis
|
||||||
|
local tyv = cross tzv txv
|
||||||
|
local row1 = [dot txv xv, dot txv yv, dot txv zv]
|
||||||
|
local row2 = [dot tyv xv, dot tyv yv, dot tyv zv]
|
||||||
|
local row3 = [dot tzv xv, dot tzv yv, dot tzv zv]
|
||||||
|
local epx = joint.xv * len + joint.pos
|
||||||
|
local bone = BoneSys.createBone joint.pos epx joint.zv
|
||||||
joint.node = bone
|
joint.node = bone
|
||||||
|
bone.objectOffsetRot = (matrix3 row1 row2 row3 [0,0,0]) as quat
|
||||||
bone.width = joint.thick
|
bone.width = joint.thick
|
||||||
bone.height = joint.thick
|
bone.height = joint.thick
|
||||||
bone.name = joint.id
|
bone.name = joint.id
|
||||||
@ -544,6 +594,21 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
-- fn buildSkeletonStandard =
|
||||||
|
-- (
|
||||||
|
-- local thickness = getSkeletonThickness()
|
||||||
|
-- for i = 1 to joints.count do (
|
||||||
|
-- local joint = joints[i]
|
||||||
|
-- chooseEndPos joint thickness
|
||||||
|
-- local bone = BoneSys.createBone joint.pos joint.endpos joint.zaxis
|
||||||
|
-- joint.node = bone
|
||||||
|
-- bone.width = joint.thick
|
||||||
|
-- bone.height = joint.thick
|
||||||
|
-- bone.name = joint.id
|
||||||
|
-- bone.parent = joint.parent.node
|
||||||
|
-- )
|
||||||
|
-- )
|
||||||
|
|
||||||
fn buildSkin =
|
fn buildSkin =
|
||||||
(
|
(
|
||||||
if (theMesh == undefined) then return 0
|
if (theMesh == undefined) then return 0
|
||||||
@ -562,7 +627,6 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
local weights = vertexWeights[i]
|
local weights = vertexWeights[i]
|
||||||
local bones = vertexBones[i]
|
local bones = vertexBones[i]
|
||||||
skinOps.replaceVertexWeights theSkin i bones weights
|
skinOps.replaceVertexWeights theSkin i bones weights
|
||||||
format "weights for vertex % are % %\n" i bones weights
|
|
||||||
)
|
)
|
||||||
for i = joints.count to 1 by -1 do (
|
for i = joints.count to 1 by -1 do (
|
||||||
if (joints[i].anyvertex == false) then (
|
if (joints[i].anyvertex == false) then (
|
||||||
@ -603,6 +667,7 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
y_up = false
|
y_up = false
|
||||||
threshold = 0
|
threshold = 0
|
||||||
token = undefined
|
token = undefined
|
||||||
|
plaintoken = false
|
||||||
file = undefined
|
file = undefined
|
||||||
suppress = false
|
suppress = false
|
||||||
textureId = #()
|
textureId = #()
|
||||||
@ -651,7 +716,7 @@ utility EggModelImporter "Egg Model Importer" silentErrors:false
|
|||||||
rotateFromYUp()
|
rotateFromYUp()
|
||||||
adjustScale()
|
adjustScale()
|
||||||
buildMesh()
|
buildMesh()
|
||||||
buildSkeleton()
|
buildSkeletonPreserve()
|
||||||
buildSkin()
|
buildSkin()
|
||||||
buildMaterial()
|
buildMaterial()
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user