spike={} --double_object function spike:init() self.SpikeExterieur = 1 --1 = Spikes vers l'extérieur de la sphère self.SpikeInterieur = nil --1 = Spikes soustraits de la sphère self.grande_difference = nil --dif spike moins sphere centrale self.SphereRadius = 2 --Annulé Radius of the main sphere self.difference_sphere = nil --Annulé differende dee spike sur la sphére centrale self.central_sphere_scale = 2 --scale sphere centrale self.SphereCovering = 100 --ratio de couverture de la sp central ou couverture juste pour irregulier self.SpikeNumber = 50 --nombre de piques ori 150 self.SpikeRegular = nil --cone de dif regulier self.SpikeRoundBase = 1 --base spike ronde (1 = Round, nil = Square) self.SpikeSquareBase = nil --base spike carré ou prism self.SpikeOutsideHeight = 3 --Height of the spikes outside the sphere self.SpikeInsideHeight = 0.1 --Height of the spikes inside the sphere (Total Spike length = SpikeInsideHeight + SpikeOutsideHeight) self.SpikeRandomness = 0 --force random sur Ht self.SpikeBaseRadius = 0.2 --Radius at the base of the spikes self.SpikeEndRadius = 0.4 --Radius at the end of the spikes self.SpikeConeOpen = nil --cones open ou non self.EndSphereAdjust = nil --Flag pour savoir s'il faut ajuster le rayon de la sphère ou non self.difference_SphereEnd = nil --checkbox pour faire une difference spike moins SphereEnd-- self.EndSphereRadius = 0 --rayon petites spheres (0 pas de sphères))//ori 0 self.RadialScale = 1 --effet de sc type lentilles sur les sp du bouts ou scale sur x et y self.MeridianScale = 1 --transfo sphere end self.ParallelScale = 1 --transfo sphere end self.difference_ToriiEnd = nil --annulé--checkbox pour faire une difference spike moins ToriiEnd-- self.EndTorusMajorRadius = 0 --Major Radius des tores (0 = pas de tores) // ori 0 self.EndTorusMinorRadius = 0 --Minor Radius des tores ori 0 self.EndTorusScaleRadial = 1 --scale des Tores du bout self.EndToriiRotate = 90 --rotation des Tores du bout self.EndToriiScaleWidth = 1 --largeur des Tores du bout self.bouton_sphere = 1 --pour oui difference spheresEnd sur spike self.bouton_torus = nil --pour oui diffrence toriusEnd sur spike self.TextureSphere = "" self.TextureSpike = "" self.TextureSphereEnd = "" self.TextureTorusEnd = "" end function spike:destroy() end function spike:load(stream) stream:readByte() --ori comprend pas -- self.SpikeExterieur = stream:readBoolean() -- if self.SpikeExterieur == 1 then -- self.SpikeInterieur = nil -- else -- self.SpikeInterieur = 1 -- end --fin ori self.SpikeExterieur = stream:readBoolean() self.SpikeInterieur = stream:readBoolean() self.grande_difference = stream:readBoolean() self.SphereRadius = stream:readDouble() self.difference_sphere = stream:readBoolean() self.central_sphere_scale = stream:readDouble() self.SphereCovering = stream:readDouble() self.SpikeRegular = stream:readBoolean() self.SpikeNumber = stream:readDouble() self.SpikeRoundBase = stream:readBoolean() if self.SpikeRoundBase == 1 then self.SpikeSquareBase = nil else self.SpikeSquareBase = 1 end self.SpikeOutsideHeight = stream:readDouble() self.SpikeInsideHeight = stream:readDouble() self.SpikeRandomness = stream:readDouble() self.SpikeBaseRadius = stream:readDouble() self.SpikeEndRadius = stream:readDouble() self.SpikeConeOpen = stream:readBoolean() self.difference_SphereEnd = stream:readBoolean() self.EndSphereRadius = stream:readDouble() self.RadialScale = stream:readDouble() self.MeridianScale = stream:readDouble() self.ParallelScale = stream:readDouble() self.EndSphereAdjust = stream:readBoolean() self.difference_ToriiEnd = stream:readBoolean() self.EndTorusMajorRadius = stream:readDouble() self.EndTorusMinorRadius = stream:readDouble() self.EndTorusScaleRadial = stream:readDouble() self.EndToriiRotate = stream:readDouble() self.EndToriiScaleWidth = stream:readDouble() self.bouton_sphere=stream:readBoolean() self.bouton_torus=stream:readBoolean() self.TextureSpike = stream:readString() self.TextureSphere = stream:readString() self.TextureSphereEnd = stream:readString() self.TextureTorusEnd = stream:readString() end -- Save it function spike:save(stream) stream:writeByte(1) stream:writeBoolean(self.SpikeExterieur) stream:writeBoolean(self.SpikeInterieur) stream:writeBoolean(self.grande_difference) stream:writeDouble(self.SphereRadius) stream:writeBoolean(self.difference_sphere) stream:writeDouble(self.central_sphere_scale) stream:writeDouble(self.SphereCovering) stream:writeBoolean(self.SpikeRegular) stream:writeDouble(self.SpikeNumber) stream:writeBoolean(self.SpikeRoundBase) stream:writeDouble(self.SpikeOutsideHeight) stream:writeDouble(self.SpikeInsideHeight) stream:writeDouble(self.SpikeRandomness) stream:writeDouble(self.SpikeBaseRadius) stream:writeDouble(self.SpikeEndRadius) stream:writeBoolean(self.SpikeConeOpen) stream:writeBoolean(self.difference_SphereEnd) stream:writeDouble(self.EndSphereRadius) stream:writeDouble(self.RadialScale) stream:writeDouble(self.MeridianScale) stream:writeDouble(self.ParallelScale) stream:writeBoolean(self.EndSphereAdjust) stream:writeBoolean(self.difference_ToriiEnd) stream:writeDouble(self.EndTorusMajorRadius) stream:writeDouble(self.EndTorusMinorRadius) stream:writeDouble(self.EndTorusScaleRadial) stream:writeDouble(self.EndToriiRotate) stream:writeDouble(self.EndToriiScaleWidth) stream:writeBoolean(self.bouton_sphere) stream:writeBoolean(self.bouton_torus) stream:writeString(self.TextureSpike) stream:writeString(self.TextureSphere) stream:writeString(self.TextureSphereEnd) stream:writeString(self.TextureTorusEnd) end function spike:getProperties() return "Spike", "25FE25420002CCCE", "F000000000000000".. "F000000C00000000".. "F000000C00000000".. "F000C0CC00C00000".. "F0000CCCCCCC0000".. "F000CC9CC99C0000".. "F0CCC9C99C900000".. "F000CCCC99CCC000".. "F0000C9999C00C00".. "F00C0C999CCCC000".. "F00CC00CC0CC0000".. "F00C000CC0CC0000".. "F000000CC0000000".. "F0000000C0000000".. "F000000000000000".. "FFFFFFFFFFFFFFFF" end function spike:getDialog(dialog) dialog:addSeparator("Spikes : ") self.helpID = dialog:addButton("Help") self.SpikeExterieurID = dialog:addRadioButton("External",self.SpikeExterieur) self.SpikeInterieurID = dialog:addRadioButton("Internal",self.SpikeInterieur) self.grande_differenceID = dialog:addRadioButton("Grande Difference",self.grande_difference) -- self.SphereRadiusID = dialog:addEditBox("Sphere Radius:",self.SphereRadius,0,8,2) -- self.difference_sphereID = dialog:addCheckBox("Difference Sphere" ,self.difference_sphere) self.central_sphere_scaleID = dialog:addEditBox("Sphere_Scale :",self.central_sphere_scale,0,12,3) self.SphereCoveringID = dialog:addEditBox("Covering :",self.SphereCovering,1,100,0) self.SpikeRegularID = dialog:addCheckBox("Regular On/Off:",self.SpikeRegular) dialog:addSeparator("") dialog:addSeparator("Spikes or Holes:") self.SpikeNumberID = dialog:addEditBox("Element # :",self.SpikeNumber,0,500,0) self.SpikeRoundBaseID = dialog:addRadioButton("Round Base",self.SpikeRoundBase) self.SpikeSquareBaseID = dialog:addRadioButton("Square Base",self.SpikeSquareBase) self.SpikeOutsideHeightID = dialog:addEditBox("External Height :",self.SpikeOutsideHeight,0,10,1) self.SpikeInsideHeightID = dialog:addEditBox("Internal Height :",self.SpikeInsideHeight,-10,10,1) self.SpikeRandomnessID = dialog:addEditBox("Height Random :",self.SpikeRandomness,0,100,0) self.SpikeBaseRadiusID = dialog:addEditBox("Base Radius :",self.SpikeBaseRadius,0.0,10,2) self.SpikeEndRadiusID = dialog:addEditBox("End Radius :",self.SpikeEndRadius,0.0,10,2) self.SpikeConeOpenID = dialog:addCheckBox("Open On/Off:",self.SpikeConeOpen) dialog:addSeparator("End Spheres :") self.EndSphereAdjustID = dialog:addCheckBox("Adjust On/Off:",self.EndSphereAdjust) self.EndSphereRadiusID = dialog:addEditBox("Radius :",self.EndSphereRadius,0,5,2) self.MeridianScaleID = dialog:addEditBox("Meridian Scale :",self.MeridianScale,0,5,2) self.ParallelScaleID = dialog:addEditBox("ParallelScale :",self.ParallelScale,0,2,2) self.RadialScaleID = dialog:addEditBox("RadialScale :",self.RadialScale,0,5,2) dialog:addSeparator("End Torii :") --self.difference_ToriiEndID = dialog:addCheckBox("Difference Torii:",self.difference_ToriiEnd) self.EndTorusMajorRadiusID = dialog:addEditBox("Major Radius :",self.EndTorusMajorRadius,0,8,2) self.EndTorusMinorRadiusID = dialog:addEditBox("Minor Radius :",self.EndTorusMinorRadius,0,8,2) self.EndTorusScaleRadialID = dialog:addEditBox("Scale Radial:",self.EndTorusScaleRadial,0,8,2) self.EndToriiScaleWidthID = dialog:addEditBox("Scale Width :",self.EndToriiScaleWidth,0,8,2) self.EndToriiRotateID = dialog:addEditBox("Rotate :",self.EndToriiRotate,0,90,0) self.difference_SphereEndID = dialog:addCheckBox("End Difference ON/OFF:",self.difference_SphereEnd) self.bouton_sphereID=dialog:addRadioButton("Sphere" ,self.bouton_sphere) self.bouton_torusID=dialog:addRadioButton("Torus" ,self.bouton_torus) dialog:addSeparator("Textures :") dialog:addSeparator("Spike ") self.TextureSpikeID = dialog:addTexture(self.TextureSpike) dialog:addSeparator("Center Sphere :") self.TextureSphereID = dialog:addTexture(self.TextureSphere) dialog:addSeparator("End Sphere :") self.TextureSphereEndID = dialog:addTexture(self.TextureSphereEnd) dialog:addSeparator("End Torus :") self.TextureTorusEndID = dialog:addTexture(self.TextureTorusEnd) end function spike:valueChanged(index,value) if index == self.helpID then messageBox("About SPIKE ", --titre "Caballeros y Caballeras. \n".. "A great part of these Plug-ins came from the Net. I just rewrite .inc files or macros in Lua format, through Fullmoon \n".. "create by Mr LEIRADELLA. http://www.geocities.com/andre_leiradella/ Email:leiradella@bigfoot.com \n".. "To use with MORAY3.x. \n".. "From les Iles Caiman. \n".. "C'est la vie.\n".. "Friendly. \n".. "Sylvain. Email:sylvain@potar-hurlant.com \n".. "Ps: I build this plugin for fun. It not a professional work. Don't be cruel and have fun. \n".. "A special thank to Mr PH. GIBONE, who helps me a lot to clean code and wireframe.\n\n\n".. "-SPIKE- \n".. "At the start, a few groups of spikes... Now many things. Just test it. \n".. " \n".. " -Kind 1 = External: Central sphere + Spikes. We can put at the end of the spike, SphereEnd or TorusEnd. \n".. "We can transform then. \n".. "Adjust On/Off means: I force the ray of the EndSphere with the same value as the end of \n".. "endconespike (EndSphereRadius = SpikeEndRadius), in order to have an object smooth in \n".. "the case of the cone with EndSphere. \n".. " \n".. " -Kind 2 = Internal: Sphere with holes. Difference of spikes on the surface of a sphere, and an add texture for holes \n".. " \n".. " -Kind 3 = Grande difference: Spike minus sphere at the center. \n".. " \n".. " Strongly inspired by PAUL T. DAWSON's -SPIKE.POV- Email:ptdawson@voicenet.com \n".. " \n".. " " ) return end if index==self.SpikeExterieurID then self.SpikeExterieur=value self.SpikeInterieur=nil self.grande_difference=nil self:redraw() end if index==self.SpikeInterieurID then self.grande_difference=nil self.SpikeExterieur=nil self.SpikeInterieur=value self:redraw() end if index==self.grande_differenceID then self.grande_difference=value self.SpikeExterieur=nil self.SpikeInterieur=nil end if index == self.SpikeNumberID then self.SpikeNumber=value self:redraw() end if index == self.SpikeOutsideHeightID then self.SpikeOutsideHeight=value self:redraw() end if index == self.SpikeBaseRadiusID then self.SpikeBaseRadius=value self:redraw() end if index == self.SpikeEndRadiusID then self.SpikeEndRadius = value if self.EndSphereAdjust ~= nil then self.EndSphereRadius = self.SpikeEndRadius end self:redraw() end if index==self.difference_sphereID then self.difference_sphere=value self:redraw() end if index == self.SphereRadiusID then self.SphereRadius=value self:redraw() end if index == self.EndSphereRadiusID then self.EndSphereRadius= value self.EndSphereAdjust= nil self:redraw() end if index == self.EndSphereAdjustID then self.EndSphereAdjust = value if self.EndSphereAdjust ~= nil then self.EndSphereRadius = self.SpikeEndRadius end self:redraw() end if index == self.SpikeRegularID then self.SpikeRegular=value self:redraw() end if index == self.SpikeInsideHeightID then self.SpikeInsideHeight=value self:redraw() end if index == self.central_sphere_scaleID then self.central_sphere_scale=value self:redraw() end if index == self.SphereCoveringID then self.SphereCovering=value self:redraw() end if index == self.SpikeConeOpenID then self.SpikeConeOpen=value self:redraw() end if index==self.difference_ToriiEndID then self.difference_ToriiEnd=value self:redraw() end if index == self.EndTorusScaleRadialID then self.EndTorusScaleRadial=value self:redraw() end if index == self.EndTorusMajorRadiusID then self.EndTorusMajorRadius=value self:redraw() end if index == self.EndTorusMinorRadiusID then self.EndTorusMinorRadius=value self:redraw() end if index == self.EndToriiRotateID then self.EndToriiRotate=value self:redraw() end if index == self.EndToriiScaleWidthID then self.EndToriiScaleWidth=value self:redraw() end if index == self.RadialScaleID then self.RadialScale=value self:redraw() end if index == self.MeridianScaleID then self.MeridianScale=value self:redraw() end if index == self.ParallelScaleID then self.ParallelScale=value self:redraw() end if index == self.SpikeRandomnessID then self.SpikeRandomness=value self:redraw() end if index == self.SpikeRoundBaseID then self.SpikeRoundBase=value self.SpikeSquareBase=nil self:redraw() end if index == self.SpikeSquareBaseID then self.SpikeRoundBase=nil self.SpikeSquareBase=value self:redraw() end if index == self.TextureSphereID then self.TextureSphere=value end if index == self.TextureSpikeID then self.TextureSpike=value end if index == self.TextureSphereEndID then self.TextureSphereEnd=value end if index == self.TextureTorusEndID then self.TextureTorusEnd=value end scene:invalidate() if index==self.difference_SphereEndID then self.difference_SphereEnd=value self:redraw() end if index==self.bouton_sphereID then self.bouton_sphere=value self.bouton_torus=nil self:redraw() end if index==self.bouton_torusID then self.bouton_sphere=nil self.bouton_torus=value self:redraw() end end function spike:getInside(x,y,z) return nil end function spike:wireframe(wire) local i, Theta, Phi wire:circleX(0,0,0,self.central_sphere_scale) wire:circleY(0,0,0,self.central_sphere_scale) wire:circleZ(0,0,0,self.central_sphere_scale) if self.difference_sphere == 1 then if self.SpikeExterieur == nil then --Spikes vers l'intérieur --sphere centre --wire:sphere(0, 0, 0, self.SphereRadius) wire:circleX(0,0,0,self.SphereRadius) wire:circleY(0,0,0,self.SphereRadius) wire:circleZ(0,0,0,self.SphereRadius) --spheres i = 0 randomseed(0) -- pour avoir toujours les mêmes sphere while (i < self.SpikeNumber ) do Theta = random(0, 1) * PI * self.SphereCovering / 100 Phi = random(0, 1) * 2* PI SpikeHeight = self.SpikeOutsideHeight * (1 - (random(0, 1) * self.SpikeRandomness / 150)) wire:line( self.SphereRadius * sin(Theta) * cos(Phi), self.SphereRadius * sin(Theta) * sin(Phi), self.SphereRadius * cos(Theta) , (self.SphereRadius - SpikeHeight) * sin(Theta) * cos(Phi), (self.SphereRadius - SpikeHeight) * sin(Theta) * sin(Phi), (self.SphereRadius - SpikeHeight) * cos(Theta) ) i = i + 1 end end else if self.SpikeExterieur == 1 then --les spikes originaux --sphere centre --wire:sphere(0, 0, 0, self.SphereRadius) wire:circleX(0,0,0,self.SphereRadius) wire:circleY(0,0,0,self.SphereRadius) wire:circleZ(0,0,0,self.SphereRadius) --piques i = 0 randomseed(0) -- pour avoir toujours les mêmes spikes while (i < self.SpikeNumber ) do Theta = random(0, 1) * PI * self.SphereCovering / 100 Phi = random(0, 1) * 2* PI SpikeHeight = self.SpikeOutsideHeight * (1 - (random(0, 1) * self.SpikeRandomness / 150)) wire:line( self.SphereRadius * sin(Theta) * cos(Phi), self.SphereRadius * sin(Theta) * sin(Phi), self.SphereRadius * cos(Theta) , (self.SphereRadius + SpikeHeight) * sin(Theta) * cos(Phi), (self.SphereRadius + SpikeHeight) * sin(Theta) * sin(Phi), (self.SphereRadius + SpikeHeight) * cos(Theta) ) i = i + 1 end end end if self.SpikeExterieur == nil then --Spikes vers l'intérieur --sphere centre --wire:sphere(0, 0, 0, self.SphereRadius) wire:circleX(0,0,0,self.SphereRadius) wire:circleY(0,0,0,self.SphereRadius) wire:circleZ(0,0,0,self.SphereRadius) --spheres i = 0 randomseed(0) -- pour avoir toujours les mêmes sphere while (i < self.SpikeNumber ) do Theta = random(0, 1) * PI * self.SphereCovering / 100 Phi = random(0, 1) * 2* PI SpikeHeight = self.SpikeOutsideHeight * (1 - (random(0, 1) * self.SpikeRandomness / 150)) wire:line( self.SphereRadius * sin(Theta) * cos(Phi), self.SphereRadius * sin(Theta) * sin(Phi), self.SphereRadius * cos(Theta) , (self.SphereRadius - SpikeHeight) * sin(Theta) * cos(Phi), (self.SphereRadius - SpikeHeight) * sin(Theta) * sin(Phi), (self.SphereRadius - SpikeHeight) * cos(Theta) ) i = i + 1 end end end function spike:toPOV(pov) local SpikeOutsideHeighte,SpikeBaseRadiuse,EndSphereRadius, SpikeRegular,SpikeInsideHeight,SphereCovering,SpikeEndSphere,SpikeConeOpen,SpikeEndTorus, EndTorusScaleRadial,RadialScale ,SpikeRandomness,SpikeHeight,MeridianScale, ParallelScale,EndToriiRotate,EndToriiScaleWidth,central_sphere_scale SpikeOutsideHeighte = self.SpikeOutsideHeight SpikeBaseRadiuse = self.SpikeBaseRadius SpikeEndRadiuse = self.SpikeEndRadius SphereRadiuse = self.SphereRadius EndSphereRadius = self.EndSphereRadius SpikeRegular = self.SpikeRegular SpikeInsideHeight = self.SpikeInsideHeight central_sphere_scale = self.central_sphere_scale SphereCovering = self.SphereCovering coveringo = self.SphereCovering * 40 SpikeEndSphere = self.SpikeEndSphere SpikeConeOpen = self.SpikeConeOpen SpikeEndTorus = self.SpikeEndTorus EndTorusScaleRadial = self.EndTorusScaleRadial RadialScale = self.RadialScale SpikeRandomness = self.SpikeRandomness MeridianScale = self.MeridianScale ParallelScale = self.ParallelScale EndToriiScaleWidth = self.EndToriiScaleWidth EndToriiRotate = self.EndToriiRotate SphereCoveringregular = self.SphereCovering*2 pov:write("#declare R1 = seed(1);") if self.SpikeRegular == nil then -- spike non régulier pov:write("#declare Number_Of_Cones = ",self.SpikeNumber,";") pov:write("#declare Spike = union { ") pov:write("#declare nb = 0 ; ") pov:write("#while ( nb < Number_Of_Cones )") pov:write("// Get the random numbers for rotating this cone. ") pov:write ("#declare Theta = rand(R1) * pi * ", self.SphereCovering / 100, ";")-- pov:write ("#declare Phi = rand(R1) * 2 * pi;") else pov:write("#declare Number_Of_Cones = ",1.818*sqrt(self.SpikeNumber / ( self.SphereCovering / 100))- 0.8,";") pov:write("#declare Number_Of_Cones = ",1.751*sqrt((self.SpikeNumber / ( self.SphereCovering / 100)) - 2) + 0.6,";") pov:write("#declare nb_sections = (Number_Of_Cones / 2) *1;") pov:write("#declare nb=0;") pov:write("#declare Spike = union { ") pov:write("#while (nb < nb_sections + 1)") pov:write(" #if (nb >= nb_sections)") if (self.SphereCovering == 100) then pov:write(" #declare nb_sphere2 = 2; ") else pov:write(" #declare nb_sphere2 = 1; ") end pov:write(" #else") pov:write(" #declare nb_sphere2 = int(Number_Of_Cones*sin((pi/nb_sections)*nb));") pov:write(" #declare Angle_1 = 2*pi/nb_sphere2;") pov:write(" #end") pov:write(" #declare Count=0;") pov:write(" #while (Count < nb_sphere2)") pov:write(" #if (nb >= nb_sections)") pov:write(" #if (Count = 0)") pov:write(" #declare Theta = 0;") pov:write(" #declare Phi = 0;") pov:write(" #else") pov:write(" #declare Theta = pi;") pov:write(" #declare Phi = 0;") pov:write(" #end") pov:write(" #else ") pov:write(" #declare Theta = (pi/nb_sections)*nb * 1;") pov:write(" #declare Phi = 2*pi/nb_sphere2 * Count;") pov:write(" #end") end pov:write ("#declare SpikeHeight = ", self.SpikeOutsideHeight, "-.75 * (1 - (rand(R1) * ", self.SpikeRandomness / 100,"));") if self.difference_SphereEnd==nil then pov:write("union {") if self.EndSphereRadius ~= 0 then if self.bouton_sphere==nil then else pov:write("sphere { < 0, 0, 0 >, ", self.EndSphereRadius) pov:write("scale <",MeridianScale,",",ParallelScale,", ",self.RadialScale,">") pov:write(" translate < 0, 0, SpikeHeight> ") pov:texture(self.TextureSphereEnd) pov:write("}") end end if self.SpikeRoundBase == 1 then --pour les bases rondes type 1 pov:write(" ") pov:write("cone { <0, 0, ",-self.SpikeInsideHeight,"> ,",self.SpikeBaseRadius,", <0,0,SpikeHeight>, ",self.SpikeEndRadius) if self.SpikeConeOpen ~= nil then --cone ou spike ouvert au bout oui pov:write(" open ") end pov:texture(self.TextureSpike) pov:write("}") end end if self.difference_SphereEnd==1 then if self.bouton_sphere==1 then pov:write("difference{")-- if self.SpikeRoundBase == 1 then --pour les bases rondes type 1 pov:write(" ") pov:write("cone { <0, 0, ",-self.SpikeInsideHeight,"> ,",self.SpikeBaseRadius,", <0,0,SpikeHeight>, ",self.SpikeEndRadius) if self.SpikeConeOpen ~= nil then --cone ou spike ouvert au bout oui pov:write(" open ") end pov:texture(self.TextureSpike) pov:write("} ") pov:write("sphere { < 0, 0, 0 >, ", self.EndSphereRadius) pov:write("scale <",MeridianScale,",",ParallelScale,", ",self.RadialScale,">") pov:write(" translate < 0, 0, SpikeHeight> ") pov:texture(self.TextureSphereEnd) pov:write("}") end if self.EndSphereRadius ~= 0 then end else pov:write("difference{")-- if self.SpikeRoundBase == 1 then --pour les bases rondes type 1 pov:write(" ") pov:write("cone { <0, 0, ",-self.SpikeInsideHeight,"> ,",self.SpikeBaseRadius,", <0,0,SpikeHeight>, ",self.SpikeEndRadius) if self.SpikeConeOpen ~= nil then --cone ou spike ouvert au bout oui pov:write(" open ") end pov:texture(self.TextureSpike) pov:write("} ") end if self.SpikeRoundBase == 1 then --pour les bases rondes type 1 pov:write(" //End Torus ") pov:write(" torus{",self.EndTorusMajorRadius,", ",self.EndTorusMinorRadius," scale <",EndToriiScaleWidth,",",self.EndTorusScaleRadial,",",EndToriiScaleWidth,">") pov:write(" rotate < ",EndToriiRotate,", 0, 0> ") pov:write(" translate < 0, 0, SpikeHeight>") pov:texture(self.TextureTorusEnd) pov:write(" }") end end end if self.difference_SphereEnd==nil then if self.SpikeRoundBase == 1 then --pour les bases rondes type 1 if self.EndTorusMajorRadius ~= 0 then --SpikeEndTorus oui pov:write(" ") pov:write(" torus{",self.EndTorusMajorRadius,", ",self.EndTorusMinorRadius," scale <",EndToriiScaleWidth,",",self.EndTorusScaleRadial,",",EndToriiScaleWidth,">") pov:write(" rotate < ",EndToriiRotate,", 0, 0> ") pov:write(" translate < 0, 0, SpikeHeight>") pov:texture(self.TextureTorusEnd) pov:write(" }") pov:write("sphere { < 0, 0, 0 >, ", self.EndSphereRadius) pov:write("scale <",MeridianScale,",",ParallelScale,", ",self.RadialScale,">") pov:write(" translate < 0, 0, SpikeHeight> ") pov:texture(self.TextureSphereEnd) pov:write("}") end end end if self.SpikeSquareBase == 1 then --pour les bases carres type 1 if (self.SpikeBaseRadius > self.SpikeEndRadius) then pov:write("#declare Facteur = ", 1 - self.SpikeEndRadius / self.SpikeBaseRadius, ";") pov:write("#declare TranslateFacteur = 1 / Facteur;") pov:write("#declare ScaleFacteur = -1 / Facteur;") elseif (self.SpikeEndRadius > self.SpikeBaseRadius) then pov:write("#declare Facteur = ", 1 - self.SpikeBaseRadius / self.SpikeEndRadius,";") pov:write("#declare ScaleFacteur = 1 / Facteur;") pov:write("#declare TranslateFacteur = 1 - (1 / Facteur);") else pov:write("#declare Facteur = 0.000001;") pov:write("#declare TranslateFacteur = 1 / Facteur;") pov:write("#declare ScaleFacteur = -1 / Facteur;") end pov:write(" //essais de pyramides ") pov:write(" prism { // TaperSweep001 ") pov:write(" conic_sweep ") pov:write(" linear_spline ") pov:write(" 1-Facteur , 1 ") pov:write(" 5 // control points ") pov:write(" <-1.0, -1.0>, ") pov:write(" < 1.0, -1.0>, ") pov:write(" < 1.0, 1.0>, ") pov:write(" <-1.0, 1.0>, ") pov:write(" <-1.0, -1.0> ") pov:write(" rotate <90,0,0> ") if (self.SpikeBaseRadius >= self.SpikeEndRadius) then pov:write(" scale <", self.SpikeBaseRadius, ",", self.SpikeBaseRadius, ",(", self.SpikeInsideHeight," + SpikeHeight) * ScaleFacteur> ") pov:write(" translate <0, 0, -(1+ScaleFacteur)* ",self.SpikeInsideHeight, " + SpikeHeight * TranslateFacteur>") else pov:write(" scale <", self.SpikeEndRadius, ",", self.SpikeEndRadius, ", (", self.SpikeInsideHeight," + SpikeHeight) * ScaleFacteur> ") pov:write(" translate <0, 0, - (1/Facteur) * ",self.SpikeInsideHeight," + SpikeHeight * TranslateFacteur>") end pov:texture(self.TextureSpike) pov:write(" } ") if self.grande_difference == 1 then if self.EndTorusMajorRadius >= 0.1 then pov:write(" torus{",self.EndTorusMajorRadius,", ",self.EndTorusMinorRadius," scale <",EndToriiScaleWidth,",",self.EndTorusScaleRadial,",",EndToriiScaleWidth,">") pov:write(" rotate < ",EndToriiRotate,", 0, 0> ") pov:write(" translate < 0, 0, SpikeHeight>") pov:texture(self.TextureTorusEnd) pov:write(" }") end end if self.SpikeExterieur == 1 then if self.bouton_sphere==1 then pov:write("sphere { < 0, 0, 0 >, ", self.EndSphereRadius) pov:write("scale <",MeridianScale,",",ParallelScale,", ",self.RadialScale,">") pov:write(" translate < 0, 0, SpikeHeight> ") pov:texture(self.TextureSphereEnd) pov:write("} ") if self.SpikeSquareBase == 1 then pov:write(" torus{",self.EndTorusMajorRadius,", ",self.EndTorusMinorRadius," scale <",EndToriiScaleWidth,",",self.EndTorusScaleRadial,",",EndToriiScaleWidth,">") pov:write(" rotate < ",EndToriiRotate,", 0, 0> ") pov:write(" translate < 0, 0, SpikeHeight>") pov:texture(self.TextureTorusEnd) pov:write(" }") end else pov:write(" torus{",self.EndTorusMajorRadius,", ",self.EndTorusMinorRadius," scale <",EndToriiScaleWidth,",",self.EndTorusScaleRadial,",",EndToriiScaleWidth,">") pov:write(" rotate < ",EndToriiRotate,", 0, 0> ") pov:write(" translate < 0, 0, SpikeHeight>") pov:texture(self.TextureTorusEnd) pov:write(" }") end end end if self.SpikeExterieur == nil then pov:write("translate <0, 0, -1.3>// scale <1,1,-1>")--pourquoi le scale pour le translate c'est moi end pov:write("translate <0,0,", self.SphereRadius, "> ") if self.SpikeRegular == nil then pov:write("rotate <0,Theta*180/pi, Phi*180/pi> ") else pov:write("rotate <0,Theta*",SphereCoveringregular,"/pi, Phi*180/pi> ") end pov:write("}") if self.SpikeRegular ~= nil then pov:write(" #declare Count=Count+1;") pov:write(" #end") end pov:write("#declare nb = nb + 1 ; ") pov:write("#end ") pov:write("} // End of union. ") if self.SpikeExterieur ==1 then pov:write("union {// total spike") pov:write("sphere {<0,0,0>",central_sphere_scale,"*",self.SphereRadius,"/2 ") pov:texture(self.TextureSphere) pov:write(" }//blabla") pov:write("object { Spike } ") elseif self.SpikeInterieur ~=1 then pov:write("difference {//pellicule") pov:write("object { Spike } ") pov:write("sphere {<0,0,0>",central_sphere_scale,"*",self.SphereRadius,"/2 ") pov:texture(self.TextureSphere) pov:write(" }//bleble }") pov:write(" //} ") pov:write("// ") else pov:write("difference { //sphere moins spike ou trou ") pov:write("sphere {<0,0,0>",central_sphere_scale,"*",self.SphereRadius,"/2 ") pov:texture(self.TextureSphere) pov:write(" }") pov:write("object { Spike } //blibli ") end pov:transforms(self.xforms) pov:write("}") end registerClass(spike,"spike")