n_sidedPrism={} -- club initialization... function n_sidedPrism:init() self.Sides = 8 -- nombre de cotés self.BottomRadius = 2 -- Rayon bas du prisme self.TopRadius = 2 -- Rayon haut du prisme self.Height = 2 -- Hauteur du prisme self.ScaleStar = 1 -- Facteur définissant le rayon des pointes (scale = 1 : pas de pointes) self.Hole = 0 -- Facteur définissant le trou intérieur (0 = pas de trou, .99 = trou maximum) self.HoleTexture = "" -- Texture du trou self.PrismeTexture = "" -- Texture extérieure end function n_sidedPrism:destroy() end function n_sidedPrism:load(stream) stream:readByte() self.Sides = stream:readDouble() self.BottomRadius = stream:readDouble() self.TopRadius = stream:readDouble() self.Height = stream:readDouble() self.ScaleStar = stream:readDouble() self.Hole = stream:readDouble() self.HoleTexture = stream:readString() self.PrismeTexture = stream:readString() end -- Save it function n_sidedPrism:save(stream) stream:writeByte(1) stream:writeDouble(self.Sides) stream:writeDouble(self.BottomRadius) stream:writeDouble(self.TopRadius) stream:writeDouble(self.Height) stream:writeDouble(self.ScaleStar) stream:writeDouble(self.Hole) stream:writeString(self.HoleTexture) stream:writeString(self.PrismeTexture) end function n_sidedPrism:valueChanged(index,value) if index == self.helpID then messageBox("ABOUT N_SIDED PRISM ", "A great part of these Plug-ins came from the net. I just rewrit .inc files in Lua format, through Fullmoon of Mr Leiradella, \n".. --A la ligne = \n\n".. "to use with MORAY3.x . It'a miscellany of codes, \n".. "A special thank to Mr Ph.Gibone who helps me a lot. \n".. "From les Iles Caiman. \n".. "C'est la vie.\n".. "Friendly. Sylvain.\n".. "Ps:I build this Plugin for fun. It not a professional work. Don't be cruel. Have fun. \n\n".. " Author: Mr INGO \n".. "There are 4 kinds of N_Sided Prism.\n".. " Typo 1 = Makes a cylinder with n sides: \n".. " Typo 2 = Makes a cone with n sides: \n".. " Typo 3 = Makes a star-shaped-cylinder with n points: \n".. " Typo 4 = Makes a star-shaped-cone with n points: \n".. " The whole with hole at the center: \n".. " Textures: inside and outside \n\n".. "Thanks to Mr INGO\n".. " ") return end if index == self.SidesID then self.Sides=value self:redraw() end if index == self.BottomRadiusID then self.BottomRadius=value self:redraw() end if index == self.TopRadiusID then self.TopRadius=value self:redraw() end if index == self.HeightID then self.Height=value self:redraw() end if index == self.ScaleStarID then self.ScaleStar=value self:redraw() end if index == self.HoleID then self.Hole=value self:redraw() end if index == self.HoleTextureID then self.HoleTexture=value end if index == self.PrismeTextureID then self.PrismeTexture=value end scene:invalidate() end function n_sidedPrism:getProperties() return "n_sidedPrism", "FFFC254FFFF2CCCE", "4444444444444444".. "4444444333444444".. "4444443333344444".. "4444333333344444".. "4333333333334444".. "3333333333333444".. "3333333333333334".. "4333333333333333".. "4433333333333334".. "4433333333333344".. "4433333333333444".. "4433333333334444".. "4433333333334444".. "4433334333334444".. "4444444433344444".. "4444444443444444" end function n_sidedPrism:getDialog(dialog) dialog:addSeparator(" N_Sided Prism :") self.helpID=dialog:addButton("Help") self.SidesID = dialog:addEditBox("# Sides :",self.Sides,3,40,0) self.BottomRadiusID = dialog:addEditBox("Bottom_Rad :",self.BottomRadius,0.01,3,2) self.TopRadiusID = dialog:addEditBox("Top_Rad :",self.TopRadius,0.01,6,2) self.HeightID = dialog:addEditBox("Height :",self.Height,0.01,10,2) self.ScaleStarID = dialog:addEditBox("Scale Star :",self.ScaleStar,0,3,2) self.HoleID = dialog:addEditBox("Scale Hole :",self.Hole,0,.999,3) dialog:addSeparator("Tex-Ext:") self.PrismeTextureID = dialog:addTexture(self.PrismeTexture) dialog:addSeparator("Tex-Hole:") self.HoleTextureID = dialog:addTexture(self.HoleTexture) end function n_sidedPrism:getInside(x,y,z) return nil end function n_sidedPrism:wireframe(wire) local i, TopSecondaryRadius, BottomSecondaryRadius i = 0 TopSecondaryRadius = self.ScaleStar * cos(3.141592/self.Sides) * self.TopRadius BottomSecondaryRadius = self.ScaleStar * cos(3.141592/self.Sides) * self.BottomRadius while (i < self.Sides) do if (self.ScaleStar == 1) then wire:line(self.BottomRadius*cos(2*3.141592*i/self.Sides), self.BottomRadius*sin(2*3.141592*i/self.Sides), 0 , self.BottomRadius*cos(2*3.141592*(i+1)/self.Sides),self.BottomRadius*sin(2*3.141592*(i+1)/self.Sides), 0) wire:line(self.TopRadius*cos(2*3.141592*i/self.Sides) , self.TopRadius*sin(2*3.141592*i/self.Sides) , self.Height, self.TopRadius*cos(2*3.141592*(i+1)/self.Sides) ,self.TopRadius*sin(2*3.141592*(i+1)/self.Sides) , self.Height) wire:line(self.BottomRadius*cos(2*3.141592*i/self.Sides), self.BottomRadius*sin(2*3.141592*i/self.Sides), 0 , self.TopRadius*cos(2*3.141592*i/self.Sides) ,self.TopRadius*sin(2*3.141592*i/self.Sides) , self.Height) else wire:line(self.BottomRadius*cos(2*3.141592*i/self.Sides) , self.BottomRadius*sin(2*3.141592*i/self.Sides) , 0 , BottomSecondaryRadius*cos(2*3.141592*(i+.5)/self.Sides), BottomSecondaryRadius*sin(2*3.141592*(i+.5)/self.Sides), 0) wire:line(BottomSecondaryRadius*cos(2*3.141592*(i+.5)/self.Sides), BottomSecondaryRadius*sin(2*3.141592*(i+.5)/self.Sides), 0 , self.BottomRadius*cos(2*3.141592*(i+1)/self.Sides) , self.BottomRadius*sin(2*3.141592*(i+1)/self.Sides) , 0) wire:line(self.TopRadius*cos(2*3.141592*i/self.Sides) , self.TopRadius*sin(2*3.141592*i/self.Sides) , self.Height, TopSecondaryRadius*cos(2*3.141592*(i+.5)/self.Sides) , TopSecondaryRadius*sin(2*3.141592*(i+.5)/self.Sides) , self.Height) wire:line(TopSecondaryRadius*cos(2*3.141592*(i+.5)/self.Sides) , TopSecondaryRadius*sin(2*3.141592*(i+.5)/self.Sides) , self.Height, self.TopRadius*cos(2*3.141592*(i+1)/self.Sides) , self.TopRadius*sin(2*3.141592*(i+1)/self.Sides) , self.Height) wire:line(self.BottomRadius*cos(2*3.141592*i/self.Sides) , self.BottomRadius*sin(2*3.141592*i/self.Sides) , 0 , self.TopRadius*cos(2*3.141592*i/self.Sides) , self.TopRadius*sin(2*3.141592*i/self.Sides) , self.Height) wire:line(BottomSecondaryRadius*cos(2*3.141592*(i+.5)/self.Sides), BottomSecondaryRadius*sin(2*3.141592*(i+.5)/self.Sides), 0 , TopSecondaryRadius*cos(2*3.141592*(i+.5)/self.Sides) , TopSecondaryRadius*sin(2*3.141592*(i+.5)/self.Sides) , self.Height) end if (self.Hole ~= 0) then if (self.ScaleStar == 1) then wire:line(self.Hole*self.BottomRadius*cos(2*3.141592*i/self.Sides), self.Hole*self.BottomRadius*sin(2*3.141592*i/self.Sides), 0 , self.Hole*self.BottomRadius*cos(2*3.141592*(i+1)/self.Sides),self.Hole*self.BottomRadius*sin(2*3.141592*(i+1)/self.Sides), 0) wire:line(self.Hole*self.TopRadius*cos(2*3.141592*i/self.Sides) , self.Hole*self.TopRadius*sin(2*3.141592*i/self.Sides) , self.Height, self.Hole*self.TopRadius*cos(2*3.141592*(i+1)/self.Sides) ,self.Hole*self.TopRadius*sin(2*3.141592*(i+1)/self.Sides) , self.Height) wire:line(self.Hole*self.BottomRadius*cos(2*3.141592*i/self.Sides), self.Hole*self.BottomRadius*sin(2*3.141592*i/self.Sides), 0 , self.Hole*self.TopRadius*cos(2*3.141592*i/self.Sides) ,self.Hole*self.TopRadius*sin(2*3.141592*i/self.Sides) , self.Height) else wire:line(self.Hole*self.BottomRadius*cos(2*3.141592*i/self.Sides) , self.Hole*self.BottomRadius*sin(2*3.141592*i/self.Sides) , 0 , self.Hole*BottomSecondaryRadius*cos(2*3.141592*(i+.5)/self.Sides), self.Hole*BottomSecondaryRadius*sin(2*3.141592*(i+.5)/self.Sides), 0) wire:line(self.Hole*BottomSecondaryRadius*cos(2*3.141592*(i+.5)/self.Sides), self.Hole*BottomSecondaryRadius*sin(2*3.141592*(i+.5)/self.Sides), 0 , self.Hole*self.BottomRadius*cos(2*3.141592*(i+1)/self.Sides) , self.Hole*self.BottomRadius*sin(2*3.141592*(i+1)/self.Sides) , 0) wire:line(self.Hole*self.TopRadius*cos(2*3.141592*i/self.Sides) , self.Hole*self.TopRadius*sin(2*3.141592*i/self.Sides) , self.Height, self.Hole*TopSecondaryRadius*cos(2*3.141592*(i+.5)/self.Sides) , self.Hole*TopSecondaryRadius*sin(2*3.141592*(i+.5)/self.Sides) , self.Height) wire:line(self.Hole*TopSecondaryRadius*cos(2*3.141592*(i+.5)/self.Sides) , self.Hole*TopSecondaryRadius*sin(2*3.141592*(i+.5)/self.Sides) , self.Height, self.Hole*self.TopRadius*cos(2*3.141592*(i+1)/self.Sides) , self.Hole*self.TopRadius*sin(2*3.141592*(i+1)/self.Sides) , self.Height) wire:line(self.Hole*self.BottomRadius*cos(2*3.141592*i/self.Sides) , self.Hole*self.BottomRadius*sin(2*3.141592*i/self.Sides) , 0 , self.Hole*self.TopRadius*cos(2*3.141592*i/self.Sides) , self.Hole*self.TopRadius*sin(2*3.141592*i/self.Sides) , self.Height) wire:line(self.Hole*BottomSecondaryRadius*cos(2*3.141592*(i+.5)/self.Sides), self.Hole*BottomSecondaryRadius*sin(2*3.141592*(i+.5)/self.Sides), 0 , self.Hole*TopSecondaryRadius*cos(2*3.141592*(i+.5)/self.Sides) , self.Hole*TopSecondaryRadius*sin(2*3.141592*(i+.5)/self.Sides) , self.Height) end end i = i + 1 end end function n_sidedPrism:toPOV(pov) pov:write("# declare n_sidedPrism= object{union{ ") if self.BottomRadius == self.TopRadius then -- Cylindre if self.ScaleStar == 1 then -- Polygone pov:write("// By: Ingo ") pov:write("// This macro makes a cylinder with n sides: ") pov:write("// n_Sided_Cylinder (number of sides, base_type, radius/length, height) ") pov:write("// Base_type: 1 = Inscribed (=default) ") pov:write("// 2 = Circumscribed ") pov:write("// 3 = Length of one side ") pov:write("// object{ n_Sided_Cylinder(8, 3, 0.5, 2) pigment{color White}} ") pov:write("#macro n_Sided_Cylinder(n,b,rl,h)") pov:write("// select the base-type and set the radius accordingly. ") pov:write(" #switch (b)") pov:write(" #case (2)") pov:write(" #local ru= rl/cos(radians(180/n)); ") pov:write(" #break ") pov:write(" #case (3)") pov:write(" #local ru= (0.5*rl)/sin(radians(180/n)); ") pov:write(" #break ") pov:write(" #else ") pov:write(" #local ru= rl; ") pov:write(" #end ") pov:write(" #local Rot=0; ") pov:write(" #local Count=0; ") pov:write(" // Create the points and extrude ") pov:write(" prism {") pov:write(" linear_sweep ") pov:write(" linear_spline ") pov:write(" 0, h, n+1, ") pov:write(" #while (Count<=n)") pov:write(" ") pov:write(" #local Rot=Rot+(360/n); //ici tour complet 360 ou non ") pov:write(" #local Count=Count+1; ") pov:write(" #end ") pov:write(" sturm ") pov:write(" } ") pov:write("#end") pov:write("#declare n_sidedPrism = object { ") pov:write(" n_Sided_Cylinder(", self.Sides,", 1, ",self.BottomRadius,", ",self.Height,")") pov:write(" rotate <90,0,0> ") pov:texture(self.PrismeTexture) pov:write("}") else -- Etoiles pov:write(" // By: Ingo ") pov:write("// This macro makes a star-shaped-cylinder with n points: ") pov:write("// n_Star_Cylinder (number of point, radius_Outside, radius_Inside, height) ") pov:write("#macro n_Star_Cylinder(n,rO,rI,h)") pov:write(" #local Rot=0; ") pov:write(" #local Count=0; ") pov:write(" #local n=n*2; ") pov:write(" // Create the points and extrude ") pov:write(" prism { ") pov:write(" linear_sweep ") pov:write(" linear_spline ") pov:write(" 0, h, n+1, ") pov:write(" #while (Count <= n) ") pov:write(" #if (mod(Count,2)= 0) ") pov:write(" ") pov:write(" #end ") pov:write(" #if (mod(Count,2) != 0) ") pov:write(" ") pov:write(" #end ") pov:write(" #local Rot=Rot+360/n; //ici rot total 360 ou non ") pov:write(" #local Count=Count+1; ") pov:write(" #end ") pov:write(" sturm ") pov:write(" } ") pov:write("#end ") pov:write("#declare n_sidedPrism =object { ") pov:write(" n_Star_Cylinder(", self.Sides, ", ",self.BottomRadius,", ",self.ScaleStar * cos(3.141592/self.Sides) * self.BottomRadius,", ",self.Height,") ") pov:write(" rotate <90,0,0> ") pov:texture(self.PrismeTexture) pov:write("}") end else -- Cône if self.ScaleStar == 1 then -- Polygone pov:write(" // By: Ingo ") pov:write("// This macro makes a cone with n sides: ") pov:write("// ") pov:write("// n_Sided_Cone (number of sides, base_type, radius/lenght Bottom, radius/length Top, height) ") pov:write("//") pov:write("// Base type: 1 = Inscribed (=default) ") pov:write("// 2 = Circumscribed ") pov:write("// 3 = Length of one side ") pov:write("#macro n_Sided_Cone(n,b,rlB,rlT,h)") pov:write(" // select the base-type and set the radius accordingly. ") pov:write(" #switch (b) ") pov:write(" #case (2)") pov:write(" #local rB= rlB/cos(radians(180/n)); ") pov:write(" #local rT= rlT/cos(radians(180/n)); ") pov:write(" #break ") pov:write(" #case (3)") pov:write(" #local rB= (0.5*rlB)/sin(radians(180/n)); ") pov:write(" #local rT= (0.5*rlT)/sin(radians(180/n)); ") pov:write(" #break ") pov:write(" #else ") pov:write(" #local rB= rlB; ") pov:write(" #local rT= rlT; ") pov:write(" #end ") pov:write(" // Check wether the top or base has the biggest radius and ") pov:write(" // determine the startpoint to get the right top-radius. ") pov:write(" #if (rB=rT)") pov:write(' #debug "\n WARNING: Both radii of the cone are equal!"') pov:write(' #debug "\n This wil give unexpected results."') pov:write(' #debug "\n Change one radius, or use n_Sided_Cylinder.\n"') pov:write(" #end ") pov:write(" #if (rT ") pov:write(" #local Rot=Rot+(360/n); ") pov:write(" #local Count=Count+1; ") pov:write(" #end ") pov:write(" sturm ") pov:write(" } ") pov:write(" // Put the cone on its base, and scale to the right size. ") pov:write(" // The way its done depends on the radii. ") pov:write(" #local ScY=h*(1/(1-D)); ") pov:write(" #if (rT ") pov:write(" translate <0, 1, 0> ") pov:write(" scale ") pov:write(" #end ") pov:write(" #if (rB ") pov:write(" scale ") pov:write(" #end ") pov:write("#end ") pov:write(" #declare n_sidedPrism =object { ") pov:write(" n_Sided_Cone(",self.Sides,", 1, ",self.BottomRadius,", ",self.TopRadius,", ",self.Height," ) ") pov:write(" rotate <90,0,0> ") pov:texture(self.PrismeTexture) pov:write("}") else -- Etoiles pov:write("// By: Ingo ") pov:write("// This macro makes a star-shaped-cone with n points: ") pov:write("// n_Star_Cone(number of sides, radius_Bottom_Outside, radius_Bottom_Inside, radius_Top_Outside, height) ") pov:write("#macro n_Star_Cone(n,rBO,rBI,rTO,h)") pov:write(" // Check wether the top or base has the biggest radius and ") pov:write(" // determine the startpoint to get the right top-radius. ") pov:write(" #if (rBO=rTO)") pov:write(' #debug "\n WARNING: Both, basis and top radius are equal!"') pov:write(' #debug "\n This wil give unexpected results."') pov:write(' #debug "\n Change one radius, or use N_Sided_Cylinder.\n"') pov:write(" #end ") pov:write(" #if (rTO") pov:write(" #end ") pov:write(" #if (mod(Count,2) != 0) ") pov:write(" ") pov:write(" #end ") pov:write(" #local Rot=Rot + 360/n; ") pov:write(" #local Count=Count+1; ") pov:write(" #end ") pov:write(" sturm ") pov:write(" } ") pov:write(" // Put the cone on its base, and scale to the right size.") pov:write(" // The way its done depends on the radii. ") pov:write(" #local ScY=h*(1/(1-D)); ") pov:write(" #if (rTO ") pov:write(" translate <0, 1, 0> ") pov:write(" scale ") pov:write(" #end ") pov:write(" #if (rBO ") pov:write(" scale ") pov:write(" #end ") pov:write("#end ") pov:write("#declare n_sidedPrism = object { ") pov:write(" n_Star_Cone ( ",self.Sides,", ",self.BottomRadius,", ",self.ScaleStar * cos(3.141592/self.Sides) * self.BottomRadius,", ",self.TopRadius,", ",self.Height," ) ") pov:write(" rotate <90,0,0> ") pov:texture(self.PrismeTexture) pov:write("} ") end end pov:write("}}") pov:write(" // CSG CSG CSG CGS CGS ") if self.Hole == 0 then -- Ya pas de trou pov:write(" object { n_sidedPrism ") else pov:write(" difference { // CSG001 ") pov:write(" object { n_sidedPrism } ") pov:write(" object { n_sidedPrism ") pov:texture(self.HoleTexture) pov:write(" scale <1*",self.Hole,",1*",self.Hole,",1.1>translate<0,0,-0.01>}") end pov:transforms(self.xforms) pov:write("}") end registerClass(n_sidedPrism,"n_sidedPrism")