Allows a 3D model of multiple quads
Requires Dave's 3D engine script.
The newest version and full example files are always available at http://www.dubbus.com/devnull
-- 3DModel v7.1 Copyright 1998 Dave Cole
--
-- This object represents a general model made up of several 3DQuad
-- objects represented by Quads. Use this object and any of the
-- proprietary model datafile formats to instantiate a 3D model
-- in director.
-- Model Formats supported so far:
--
-- 0: No format to be directly imported, placeholder object instantiated
-- 1: Field based "D3D" (Dave's 3D) Model (see docs on format)
-- 2: File based "D3D" (Dave's 3D) Model (see docs on format)
-- 3: Field based "P3D" (Point-based Dave's 3D) Model (see docs)
-- 4: File based "P3D" Model
-- 5: .OBJ format pre-imported into a field (Alias Wavefront, etc.)
-- 6: .OBJ files
-- modelformat = Which model format to import, modeldescriptor = the file/field name of the model to import,
-- beginningSpriteChannel = which sprite channel to begin allocating sprites for the model at (counts up)
on new me, modelformat, modeldescriptor, beginningSpriteChannel, highestSpriteChannel, argList
set mFormat = modelformat
set mDescriptor = modeldescriptor
set mBeginSprite = beginningSpriteChannel
set curSprite = mBeginSprite
set maxSprite = highestSpriteChannel
highestUsedSpriteChannel = mBeginSprite
set mMatrix = [[1000, 0, 0, 0], [0, 1000, 0, 0], [0, 0, 1000, 0], [0, 0, 0, 1000]]
set mObjectList = []
case mFormat of
0: -- create empty shell of a 3DModel object
on kill me
-- repeat with i = mBeginSprite to highestUsedSpriteChannel
-- puppetsprite(i, false)
-- end repeat
-- updateStage
-- repeat with i = mBeginSprite to highestUsedSpriteChannel
-- puppetsprite(i, true)
-- sprite(i).visible = 1
-- end repeat
put "3dmodel kill"
z = count(mObjectList)
repeat with i = 1 to z
kill(mObjectList[i])
end repeat
end
on setMouseWithin me, scriptName
repeat with n in mObjectList
n.scriptEvents = 1
n.mySprite.scriptInstanceList.deleteOne(n)
n.mYSprite.scriptInstanceList.add(n)
n.mouseWithinS = scriptName
end repeat
end
on setMouseDown me, scriptName
repeat with n in mObjectList
n.scriptEvents = 1
n.mySprite.scriptInstanceList.deleteOne(n)
n.mYSprite.scriptInstanceList.add(n)
n.mouseDownS = scriptName
end repeat
end
on setMouseUp me, scriptName
repeat with n in mObjectList
n.scriptEvents = 1
n.mySprite.scriptInstanceList.deleteOne(n)
n.mYSprite.scriptInstanceList.add(n)
n.mouseUpS = scriptName
end repeat
end
on setMouseLeave me, scriptName
repeat with n in mObjectList
n.scriptEvents = 1
n.mySprite.scriptInstanceList.deleteOne(n)
n.mYSprite.scriptInstanceList.add(n)
n.mouseLeaveS = scriptName
end repeat
end
on importD3D me, mDescriptor
set z = the number of lines in field mDescriptor
set l = 0
set t = []
set curSprite = curSprite - 1
repeat with i = 1 to z
set m = line i of field mDescriptor
if char 1 to 2 of m = "--" then
nothing
else if word 1 of m = "NEWFACE" then
set mInk = value(word 2 of m)
set mBlend = value(word 3 of m)
set mDCue = value(word 4 of m)
set mMember = word 5 of m
set l = 0
set t = []
set curSprite = curSprite + 1
if curSprite > maxSprite then
exit repeat
end if
else if the number of items in m = 3 then
set l = l + 1
if l = 4 then
add(t, [value(item 1 of m), value(item 2 of m), value(item 3 of m), 1.0])
add(mObjectList, new(script "3DQuad", t, curSprite, mInk, mBlend, mDCue, mMember))
else if l < 4 then
add(t, [value(item 1 of m), value(item 2 of m), value(item 3 of m), 1.0])
end if
end if
end repeat
if curSprite > maxSprite then
highestUsedSpriteChannel = maxSprite
else
highestUsedSpriteChannel = curSprite
end if
repeat with i = (highestUsedSpriteChannel) + 1 to maxSprite
sprite(i).visible = false
end repeat
end
on importP3D me, mDescriptor
set z = the number of lines in field mDescriptor
set l = 0
set t = []
set curSprite = curSprite - 1
repeat with i = 1 to z
set m = line i of field mDescriptor
if char 1 to 2 of m = "--" then
nothing
else if word 1 of m = "VERTEX" AND the number of words in m >= 10 then
set curSprite = curSprite + 1
if curSprite > maxSprite then
exit repeat
end if
--x, y, z, memberName, spriteNumber, theInk, theBlend, dCue_scale, dCue_blend, dCue_memberchange, lowMem, highMem
if the number of words in m < 12 then
set lm = 0
set hm = 0
else
set lm = value(word 11 of m)
set hm = value(word 12 of m)
end if
add(mObjectList, new(script "3DSprite", value(word 2 of m), value(word 3 of m), value(word 4 of m), word 5 of m, curSprite, value(word 6 of m), value(word 7 of m), value(word 8 of m), value(word 9 of m), value(word 10 of m), lm, hm))
end if
end repeat
if curSprite > maxSprite then
highestUsedSpriteChannel = maxSprite
else
highestUsedSpriteChannel = curSprite
end if
end
on importOBJ me, mDescript, mInk, mBlend, mMember
set vertexList = []
set z = the number of lines in field mDescript
set curSprite = curSprite - 1
repeat with i = 1 to z
set m = line i of field mDescript
if word 1 of m = "v" then
add(vertexList, [value(word 2 of m), value(word 3 of m), value(word 4 of m), 1.0])
else if word 1 of m = "f" then
curSprite = curSprite + 1
if curSprite <= maxSprite then
set t = []
set x = getAt(vertexList, value(word 2 of m))
add(t, x)
add(t, getAt(vertexList, value(word 3 of m)))
add(t, getAt(vertexList, value(word 4 of m)))
add(t, x)
add(mObjectList, new(script "3DQuad", t,curSprite, mInk, mBlend, 0, mMember))
else
exit repeat
end if
end if
end repeat
if curSprite > maxSprite then
highestUsedSpriteChannel = maxSprite
else
highestUsedSpriteChannel = curSprite
end if
set vertexList = []
end
on importText me, fileN, fieldName
io = new (xtra "fileio")
io.openFile(fileN, 1)
if the number of member fieldName = -1 then
set n = new(#field)
set the name of n = fieldName
end if
put cr2lf(me, readFile(io)) into field fieldName
return fieldName
end
-- LF (RETURN) = 13, CR (unwanted) = 10
on cr2lf me, str
if str contains numtochar(10) then
set str2 = EMPTY
repeat with i = 1 to the number of chars in str
if (char i of str = numtochar(10)) then
put RETURN after str2
else
put char i of str after str2
end if
end repeat
else
return str
end if
return str2
end
-- Save current ModelView matrix into this Model's memory to be recalled
on saveMatrix me
set mMatrix = mModelView
end
-- Take the ModelView matrix stored in this Model's memory and make it
-- the current ModelView matrix (overwrites the previous ModelView).
on imposeMatrix me
set mModelView = mMatrix
end
-- Take the ModelView matrix stored in this Model's memory, multiply it
-- against the current ModelView matrix and make that the current ModelView Matrix.
on affectModelViewMatrix me
set mModelView = Matrix4x4Mult(mMatrix, mModelView)
end
-- Multiply the current ModelView matrix against the locally saved matrix
on affectLocalMatrix me
set mMatrix = Matrix4x4Mult(mModelView, mMatrix)
end
-- Transform all the vertices in the model
on Transform me
repeat with n in mObjectList
Transform(n)
end repeat
end
-- Draw the model
on drawMe me
if sortSprites then
zSort(mObjectList)
end if
repeat with n in mObjectList
drawMe(n)
end repeat
end
Contact
MMI
36 South Court Sq
Suite 300
Newnan, GA 30263
USA