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