Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --------------------------------------------------------------------
- -------------------------------Globals------------------------------
- --------------------------------------------------------------------
- local Beveled = false
- local Conglomerate = false
- local Scale = 1/10
- --------------------------------------------------------------------
- -----------------------Implementation Globals-----------------------
- --------------------------------------------------------------------
- -- Not applicable
- --------------------------------------------------------------------
- --------------------------Helper Functions--------------------------
- --------------------------------------------------------------------
- function SaveLimitedString(Str,Nami)
- local File = script:FindFirstChild(Nami)
- if File == nil then
- File = Instance.new("StringValue")
- File.Name = Nami
- File.Parent = script
- end
- File.Value = Str
- end
- function SaveString(Str,Nami)
- local Max = 128000
- if string.len(Str) > Max then
- for i=1,math.ceil(string.len(Str)/Max) do
- if i == math.ceil(string.len(Str)/Max) then
- SaveLimitedString(string.sub(Str,(i-1)*Max+1,string.len(Str)),Nami.."(Part"..NumPrefix(i)..")")
- else
- SaveLimitedString(string.sub(Str,(i-1)*Max+1,i*Max),Nami.."(Part"..NumPrefix(i)..")")
- end
- end
- else
- SaveLimitedString(Str,Nami)
- end
- end
- function PartsList(Par,List)
- if List == nil then List = {} end
- local c = Par:GetChildren()
- for i=1,#c do
- if c[i]:IsA("BasePart") then
- List[#List+1] = c[i]
- end
- List = PartsList(c[i],List)
- end
- return List
- end
- function Append(T1,T2)
- for i=1,#T2 do
- T1[#T1+1] = T2[i]
- end
- return T1
- end
- function Vector3ToObjString(Vector)
- return ""..Vector.x.." "..Vector.y.." "..Vector.z
- end
- function TableToObjString(Table)
- local Str = ""
- for i=1,#Table do
- if i == 1 then
- Str = Str..Table[i]
- else
- Str = Str.." "..Table[i]
- end
- end
- return Str
- end
- function NumPrefix(Number)
- if Number >= 99 then
- return Number
- elseif Number >= 9 then
- return "0"..Number
- else
- return "00"..Number
- end
- end
- function OriginTag()
- return "# Generated with Roblox BuildIn Plugin"
- end
- function MtlLibTag(PlaceName)
- return "mtllib "..PlaceName..".mtl"
- end
- function ObjectTag(Type,MeshesMade)
- return "g Mesh_"..Type.."."..NumPrefix(MeshesMade)
- end
- function VertTag(Vector)
- return "v "..Vector3ToObjString(Vector)
- end
- function FaceTag(Vertlist)
- return "f "..TableToObjString(Vertlist)
- end
- function MaterialTag(MaterialV,Index)
- return {"newmtl Material."..NumPrefix(Index),
- "d "..1-MaterialV[2],
- "Ns 96.0",
- "Ka 0.3 0.3 0.3",
- "Kd ".. MaterialV[1].r .." ".. MaterialV[1].g .." ".. MaterialV[1].b ,
- "Ks 1.0 1.0 1.0",
- "illum 2"}
- end
- --------------------------------------------------------------------
- ---------------------------Basic Exporting--------------------------
- --------------------------------------------------------------------
- "Head""Sphere"
- end
- function CylinderFaceList(CF,Size)
- local Verts = {Vector3.new(0.000000,-1.000000,-1.000000),Vector3.new(0.000000,1.000000,-1.000000),Vector3.new(0.195090,-1.000000,-0.980785),Vector3.new(0.195090,1.000000,-0.980785),Vector3.new(0.382683,-1.000000,-0.923880),Vector3.new(0.382683,1.000000,-0.923880),Vector3.new(0.555570,-1.000000,-0.831470),Vector3.new(0.555570,1.000000,-0.831470),Vector3.new(0.707107,-1.000000,-0.707107),Vector3.new(0.707107,1.000000,-0.707107),Vector3.new(0.831470,-1.000000,-0.555570),Vector3.new(0.831470,1.000000,-0.555570),Vector3.new(0.923880,-1.000000,-0.382683),Vector3.new(0.923880,1.000000,-0.382683),Vector3.new(0.980785,-1.000000,-0.195090),Vector3.new(0.980785,1.000000,-0.195090),Vector3.new(1.000000,-1.000000,-0.000000),Vector3.new(1.000000,1.000000,-0.000000),Vector3.new(0.980785,-1.000000,0.195090),Vector3.new(0.980785,1.000000,0.195090),Vector3.new(0.923880,-1.000000,0.382683),Vector3.new(0.923880,1.000000,0.382683),Vector3.new(0.831470,-1.000000,0.555570),Vector3.new(0.831470,1.000000,0.555570),Vector3.new(0.707107,-1.000000,0.707107),Vector3.new(0.707107,1.000000,0.707107),Vector3.new(0.555570,-1.000000,0.831470),Vector3.new(0.555570,1.000000,0.831470),Vector3.new(0.382683,-1.000000,0.923880),Vector3.new(0.382683,1.000000,0.923880),Vector3.new(0.195090,-1.000000,0.980785),Vector3.new(0.195090,1.000000,0.980785),Vector3.new(-0.000000,-1.000000,1.000000),Vector3.new(-0.000000,1.000000,1.000000),Vector3.new(-0.195091,-1.000000,0.980785),Vector3.new(-0.195091,1.000000,0.980785),Vector3.new(-0.382684,-1.000000,0.923879),Vector3.new(-0.382684,1.000000,0.923879),Vector3.new(-0.555571,-1.000000,0.831469),Vector3.new(-0.555571,1.000000,0.831469),Vector3.new(-0.707107,-1.000000,0.707106),Vector3.new(-0.707107,1.000000,0.707106),Vector3.new(-0.831470,-1.000000,0.555570),Vector3.new(-0.831470,1.000000,0.555570),Vector3.new(-0.923880,-1.000000,0.382683),Vector3.new(-0.923880,1.000000,0.382683),Vector3.new(-0.980785,-1.000000,0.195089),Vector3.new(-0.980785,1.000000,0.195089),Vector3.new(-1.000000,-1.000000,-0.000001),Vector3.new(-1.000000,1.000000,-0.000001),Vector3.new(-0.980785,-1.000000,-0.195091),Vector3.new(-0.980785,1.000000,-0.195091),Vector3.new(-0.923879,-1.000000,-0.382684),Vector3.new(-0.923879,1.000000,-0.382684),Vector3.new(-0.831469,-1.000000,-0.555571),Vector3.new(-0.831469,1.000000,-0.555571),Vector3.new(-0.707106,-1.000000,-0.707108),Vector3.new(-0.707106,1.000000,-0.707108),Vector3.new(-0.555569,-1.000000,-0.831470),Vector3.new(-0.555569,1.000000,-0.831470),Vector3.new(-0.382682,-1.000000,-0.923880),Vector3.new(-0.382682,1.000000,-0.923880),Vector3.new(-0.195089,-1.000000,-0.980786),Vector3.new(-0.195089,1.000000,-0.980786),Vector3.new(0.000000,1.000000,-1.000000),Vector3.new(0.195090,1.000000,-0.980785),Vector3.new(0.382683,1.000000,-0.923880),Vector3.new(0.555570,1.000000,-0.831470),Vector3.new(0.707107,1.000000,-0.707107),Vector3.new(0.831470,1.000000,-0.555570),Vector3.new(0.923880,1.000000,-0.382683),Vector3.new(0.980785,1.000000,-0.195090),Vector3.new(1.000000,1.000000,-0.000000),Vector3.new(0.980785,1.000000,0.195090),Vector3.new(0.923880,1.000000,0.382683),Vector3.new(0.831470,1.000000,0.555570),Vector3.new(0.707107,1.000000,0.707107),Vector3.new(0.555570,1.000000,0.831470),Vector3.new(0.382683,1.000000,0.923880),Vector3.new(0.195090,1.000000,0.980785),Vector3.new(-0.000000,1.000000,1.000000),Vector3.new(-0.195091,1.000000,0.980785),Vector3.new(-0.382684,1.000000,0.923879),Vector3.new(-0.555571,1.000000,0.831469),Vector3.new(-0.707107,1.000000,0.707106),Vector3.new(-0.831470,1.000000,0.555570),Vector3.new(-0.923880,1.000000,0.382683),Vector3.new(-0.980785,1.000000,0.195089),Vector3.new(-1.000000,1.000000,-0.000001),Vector3.new(-0.980785,1.000000,-0.195091),Vector3.new(-0.923879,1.000000,-0.382684),Vector3.new(-0.831469,1.000000,-0.555571),Vector3.new(-0.707106,1.000000,-0.707108),Vector3.new(-0.555569,1.000000,-0.831470),Vector3.new(-0.382682,1.000000,-0.923880),Vector3.new(-0.195089,1.000000,-0.980786),Vector3.new(0.000000,-1.000000,-1.000000),Vector3.new(0.195090,-1.000000,-0.980785),Vector3.new(0.382683,-1.000000,-0.923880),Vector3.new(0.555570,-1.000000,-0.831470),Vector3.new(0.707107,-1.000000,-0.707107),Vector3.new(0.831470,-1.000000,-0.555570),Vector3.new(0.923880,-1.000000,-0.382683),Vector3.new(0.980785,-1.000000,-0.195090),Vector3.new(1.000000,-1.000000,-0.000000),Vector3.new(0.980785,-1.000000,0.195090),Vector3.new(0.923880,-1.000000,0.382683),Vector3.new(0.831470,-1.000000,0.555570),Vector3.new(0.707107,-1.000000,0.707107),Vector3.new(0.555570,-1.000000,0.831470),Vector3.new(0.382683,-1.000000,0.923880),Vector3.new(0.195090,-1.000000,0.980785),Vector3.new(-0.000000,-1.000000,1.000000),Vector3.new(-0.195091,-1.000000,0.980785),Vector3.new(-0.382684,-1.000000,0.923879),Vector3.new(-0.555571,-1.000000,0.831469),Vector3.new(-0.707107,-1.000000,0.707106),Vector3.new(-0.831470,-1.000000,0.555570),Vector3.new(-0.923880,-1.000000,0.382683),Vector3.new(-0.980785,-1.000000,0.195089),Vector3.new(-1.000000,-1.000000,-0.000001),Vector3.new(-0.980785,-1.000000,-0.195091),Vector3.new(-0.923879,-1.000000,-0.382684),Vector3.new(-0.831469,-1.000000,-0.555571),Vector3.new(-0.707106,-1.000000,-0.707108),Vector3.new(-0.555569,-1.000000,-0.831470),Vector3.new(-0.382682,-1.000000,-0.923880),Vector3.new(-0.195089,-1.000000,-0.980786)}
- for i=1,#Verts do
- Verts[i] = (CF.p+(CF-CF.p)*(Verts[i]*(Size/2)))*Scale
- end
- local Faces = {{1,2,4,3},{3,4,6,5},{5,6,8,7},{7,8,10,9},{9,10,12,11},{11,12,14,13},{13,14,16,15},{15,16,18,17},{17,18,20,19},{19,20,22,21},{21,22,24,23},{23,24,26,25},{25,26,28,27},{27,28,30,29},{29,30,32,31},{31,32,34,33},{33,34,36,35},{35,36,38,37},{37,38,40,39},{39,40,42,41},{41,42,44,43},{43,44,46,45},{45,46,48,47},{47,48,50,49},{49,50,52,51},{51,52,54,53},{53,54,56,55},{55,56,58,57},{57,58,60,59},{59,60,62,61},{2,1,63,64},{61,62,64,63},{66,65,96},{66,96,95},{66,95,67},{95,94,67},{94,68,67},{94,93,68},{93,69,68},{93,92,69},{92,70,69},{92,91,70},{91,71,70},{91,90,71},{90,72,71},{90,89,72},{89,73,72},{89,88,73},{88,74,73},{88,87,74},{87,75,74},{87,86,75},{86,76,75},{86,85,76},{85,77,76},{85,84,77},{84,78,77},{84,83,78},{83,79,78},{83,82,79},{82,80,79},{82,81,80},{97,98,128},{98,127,128},{98,99,127},{99,126,127},{99,100,126},{100,125,126},{100,101,125},{101,124,125},{101,102,124},{102,123,124},{102,103,123},{103,122,123},{103,104,122},{104,121,122},{104,105,121},{105,120,121},{105,106,120},{106,119,120},{106,107,119},{107,118,119},{107,108,118},{108,117,118},{108,109,117},{109,116,117},{109,110,116},{110,115,116},{110,111,115},{111,114,115},{111,112,114},{112,113,114}}
- return Verts,Faces,"Cylinder"
- end
- function CornerWedgeFaceList(CF,Size)
- local Verts = {Vector3.new(-1,-1,-1),Vector3.new(1,-1,-1),Vector3.new(1,-1,1),Vector3.new(-1,-1,1),Vector3.new(1,1,-1)}
- for i=1,#Verts do
- Verts[i] = (CF.p+(CF-CF.p)*(Verts[i]*(Size/2)))*Scale
- end
- local Faces = {{1,2,3,4},{5,1,4},{3,5,4},{2,5,3},{1,5,2}}
- return Verts,Faces,"CornerWedge"
- end
- function WedgeFaceList(CF,Size)
- local Verts = {Vector3.new(-1,-1,-1),Vector3.new(1,-1,-1),Vector3.new(1,-1,1),Vector3.new(-1,-1,1),Vector3.new(-1,1,1),Vector3.new(1,1,1)}
- for i=1,#Verts do
- Verts[i] = (CF.p+(CF-CF.p)*(Verts[i]*(Size/2)))*Scale
- end
- local Faces = {{1,2,3,4},{1,5,6,2},{5,1,4},{3,6,5,4},{2,6,3}}
- return Verts,Faces,"Wedge"
- end
- function CubicFaceList(CF,Size)
- local Verts = {Vector3.new(1,-1,-1),Vector3.new(1,-1,1),Vector3.new(-1,-1,1),Vector3.new(-1,-1,-1),Vector3.new(1,1,-1),Vector3.new(1,1,1),Vector3.new(-1,1,1),Vector3.new(-1,1,-1)}
- for i=1,#Verts do
- Verts[i] = (CF.p+(CF-CF.p)*(Verts[i]*(Size/2)))*Scale
- end
- local Faces = {{1,2,3,4},{5,8,7,6},{1,5,6,2},{2,6,7,3},{3,7,8,4},{5,1,4,8}}
- return Verts,Faces,"Cube"
- end
- --------------------------------------------------------------------
- -------------------------Advanced Exporting-------------------------
- --------------------------------------------------------------------
- function BasePartFaceList(BPart)
- local OMesh = nil
- local c = BPart:GetChildren()
- for i=1,#c do
- if c[i]:IsA("DataModelMesh") then
- OMesh = c[i]
- end
- end
- if OMesh == nil then
- if BPart.className == "Part" then
- if BPart.Shape == Enum.PartType.Block then
- return CubicFaceList(BPart.CFrame,BPart.Size)
- elseif BPart.Shape == Enum.PartType.Ball then
- return SphereFaceList(BPart.CFrame,BPart.Size)
- elseif BPart.Shape == Enum.PartType.Cylinder then
- return CylinderFaceList(BPart.CFrame,BPart.Size)
- end
- elseif BPart.className == "WedgePart" then
- return WedgeFaceList(BPart.CFrame,BPart.Size)
- elseif BPart.className == "CornerWedgePart" then
- return CornerWedgeFaceList(BPart.CFrame,BPart.Size)
- end
- else
- if OMesh.className == "BlockMesh" then
- return CubicFaceList(BPart.CFrame+(BPart.CFrame-BPart.CFrame.p)*OMesh.Offset,BPart.Size*OMesh.Scale)
- elseif OMesh.className == "CylinderMesh" then
- if BPart.Size.X < BPart.Size.Z then
- return CylinderFaceList(BPart.CFrame+(BPart.CFrame-BPart.CFrame.p)*OMesh.Offset,Vector3.new(BPart.Size.X,BPart.Size.Y,BPart.Size.X)*Vector3.new(OMesh.Scale.X,OMesh.Scale.Y,OMesh.Scale.X))
- else
- return CylinderFaceList(BPart.CFrame+(BPart.CFrame-BPart.CFrame.p)*OMesh.Offset,Vector3.new(BPart.Size.Z,BPart.Size.Y,BPart.Size.Z)*Vector3.new(OMesh.Scale.X,OMesh.Scale.Y,OMesh.Scale.X))
- end
- elseif OMesh.className == "SpecialMesh" then
- --Offset isn't implemented for SpecialMeshes yet, so I won't implement it either
- if OMesh.MeshType == Enum.MeshType.Brick then
- return CubicFaceList(BPart.CFrame,BPart.Size*OMesh.Scale)
- elseif OMesh.MeshType == Enum.MeshType.Wedge then
- return WedgeFaceList(BPart.CFrame,BPart.Size*OMesh.Scale)
- elseif OMesh.MeshType == Enum.MeshType.CornerWedge then
- return CornerWedgeFaceList(BPart.CFrame,BPart.Size*OMesh.Scale)
- elseif OMesh.MeshType == Enum.MeshType.Cylinder then
- if BPart.Size.X < BPart.Size.Z then
- return CylinderFaceList(BPart.CFrame,Vector3.new(BPart.Size.X,BPart.Size.Y,BPart.Size.X)*Vector3.new(OMesh.Scale.X,OMesh.Scale.Y,OMesh.Scale.X))
- else
- return CylinderFaceList(BPart.CFrame,Vector3.new(BPart.Size.Z,BPart.Size.Y,BPart.Size.Z)*Vector3.new(OMesh.Scale.X,OMesh.Scale.Y,OMesh.Scale.X))
- end
- elseif OMesh.MeshType == Enum.MeshType.Sphere then
- return SphereFaceList(BPart.CFrame,BPart.Size*OMesh.Scale)
- elseif OMesh.MeshType == Enum.MeshType.Head then
- if BPart.Size.X < BPart.Size.Z then
- return HeadFaceList(BPart.CFrame,Vector3.new(BPart.Size.X,BPart.Size.Y,BPart.Size.X)*Vector3.new(OMesh.Scale.X,OMesh.Scale.Y,OMesh.Scale.X))
- else
- return HeadFaceList(BPart.CFrame,Vector3.new(BPart.Size.Z,BPart.Size.Y,BPart.Size.Z)*Vector3.new(OMesh.Scale.X,OMesh.Scale.Y,OMesh.Scale.X))
- end
- elseif OMesh.MeshType == Enum.MeshType.Torso then
- --NOTE
- end
- end
- end
- end
- function ObjVFListInstance(Par)
- local Verts = {}
- local Faces = {}
- local Materials = {}
- local OBegs = {}
- local Parts = PartsList(Par)
- for m=1,#Parts do
- local LVerts,LFaces,PType = BasePartFaceList(Parts[m])
- if LVerts ~= nil and LFaces ~= nil then
- local LMaterial = {Parts[m].BrickColor.Color,Parts[m].Transparency}
- local MIndex = -1
- for i=1,#Materials do
- if Materials[i][1] == LMaterial[1] and Materials[i][2] == LMaterial[2] then
- MIndex = i
- break
- end
- end
- if MIndex == -1 then
- Materials[#Materials+1] = LMaterial
- OBegs[#OBegs+1] = {#Verts+1,#Faces+1,#Materials,PType}
- else
- OBegs[#OBegs+1] = {#Verts+1,#Faces+1,MIndex,PType}
- end
- for i=1,#LFaces do
- local LFace = {}
- for k=1,#LFaces[i] do
- LFace[k] = LFaces[i][k]+#Verts
- end
- Faces[#Faces+1] = LFace
- end
- for i=1,#LVerts do
- Verts[#Verts+1] = LVerts[i]
- end
- end
- end
- return Verts,Faces,Materials,OBegs
- end
- function VFListToStringTable(Verts,Faces,Materials,OBegs)
- local ObjTable = {}
- local MtlTable = {}
- for i=1,#Materials do
- MtlTable = Append(MtlTable,MaterialTag(Materials[i],i))
- end
- if Conglomerate then
- ObjTable[#ObjTable+1] = ObjectTag("RobloxPlace",1)
- for i=1,#Verts do
- ObjTable[#ObjTable+1] = VertTag(Verts[i])
- end
- for b=1,#OBegs do
- local EndObeg = {}
- if b == #OBegs then
- EndOBeg = {#Verts+1,#Faces+1,"nil"}
- else
- EndOBeg = OBegs[b+1]
- end
- if OBegs[b][3] ~= nil then
- ObjTable[#ObjTable+1] = "usemtl Material."..NumPrefix(OBegs[b][3])
- end
- if OBegs[b][4] == "Sphere" or OBegs[b][4] == "Head" or OBegs[b][4] == "Cylinder" then
- ObjTable[#ObjTable+1] = "s 1"
- else
- ObjTable[#ObjTable+1] = "s off"
- end
- for i=OBegs[b][2],EndOBeg[2]-1 do
- ObjTable[#ObjTable+1] = FaceTag(Faces[i])
- end
- end
- else
- for b=1,#OBegs do
- local EndObeg = {}
- if b == #OBegs then
- EndOBeg = {#Verts+1,#Faces+1,"nil"}
- else
- EndOBeg = OBegs[b+1]
- end
- ObjTable[#ObjTable+1] = ObjectTag(OBegs[b][4],b)
- for i=OBegs[b][1],EndOBeg[1]-1 do
- ObjTable[#ObjTable+1] = VertTag(Verts[i])
- end
- if OBegs[b][3] ~= nil then
- ObjTable[#ObjTable+1] = "usemtl Material."..NumPrefix(OBegs[b][3])
- end
- if OBegs[b][4] == "Sphere" or OBegs[b][4] == "Head" or OBegs[b][4] == "Cylinder" then
- ObjTable[#ObjTable+1] = "s 1"
- else
- ObjTable[#ObjTable+1] = "s off"
- end
- for i=OBegs[b][2],EndOBeg[2]-1 do
- ObjTable[#ObjTable+1] = FaceTag(Faces[i])
- end
- end
- end
- return ObjTable,MtlTable
- end
- function ExportPlaceAsObj(PlaceName)
- local ObjStr = OriginTag().."\n"..MtlLibTag(PlaceName)
- local MtlStr = OriginTag()
- local ObjTable, MtlTable = VFListToStringTable(ObjVFListInstance(game.Workspace))
- for i=1,#ObjTable do
- ObjStr = ObjStr.."\n"..ObjTable[i]
- end
- for i=1,#MtlTable do
- MtlStr = MtlStr.."\n"..MtlTable[i]
- end
- return ObjStr,MtlStr
- end
- --------------------------------------------------------------------
- ---------------------------Implementation---------------------------
- --------------------------------------------------------------------
- obj, mtl = ExportPlaceAsObj("PlaceName")
- -- Change "PlaceName" to the name of the .obj and .mtl files you will use
- SaveString(mtl,".mtl")
- SaveString(obj,".obj")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement