--Copyright Philippe Gibone for the modifications made on the original model by MB CORTIE --Extensive use of the model by MB Cortie and of the Superformula by Johan Gielis (modified) --Version 6 SeaShell={} function SeaShell:init() --Par défaut les paramètres sont ceux de l'ammonite self.ShellList = {"_Generating Curve", "_Structural", "Ammonite", "Cerith", "Codakia", "Conus", "Epitonium", "Helcion", "Lamellibranch", "Lyria", "Lyria + ripples", "Natalina", "Nautile", "Oxystele", "Planorbis", "Struthiolaria", "Turbo", "Turritella", "Waves"} self.Shell = 3 self.Amplitude = 0.19 self.DemiAxePrincipal = 0.1 self.DemiAxeSecondaire = 0.09 self.AdjustTo = 1 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 self.RealAlpha = 80 self.ImagAlpha = 0 self.RealBeta = 90 self.ImagBeta = 0 self.Phi = 1 self.Mu = 1 self.Omega = 1 self.NodulePlace = 10 self.NoduleHeight = 0.2 self.NoduleNombre = 15 self.NoduleWidth1 = 100 self.NoduleWidth2 = 20 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.NoduleStepDivider = 1 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = 0 self.SpiralAngleMax = 1200 self.SpiralAngleStep = 4 self.SpiralWireStepMultiplier = 5 self.EllipseAngleMin = -190 self.EllipseAngleMax = 190 self.EllipseAngleStep = 4 self.EllipseWireStepMultiplier = 5 self.RimSize = 0 self.StartValve = nil self.StartSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.sMu = sin(rad(self.Mu)) self.cMu = cos(rad(self.Mu)) self.sBeta = sin(rad(self.RealBeta)) self.cBeta = cos(rad(self.RealBeta)) self.tAlpha = tan(rad(self.RealAlpha)) self.Texture = "" self.TextureInterior = "" end function SeaShell:destroy() end function SeaShell:load(stream) local Version Version = stream:readByte() self.Amplitude = stream:readDouble() self.DemiAxePrincipal = stream:readDouble() self.DemiAxeSecondaire = stream:readDouble() self.RealAlpha = stream:readDouble() self.RealBeta = stream:readDouble() self.Phi = stream:readDouble() self.Mu = stream:readDouble() self.Omega = stream:readDouble() self.NodulePlace = stream:readDouble() self.NoduleHeight = stream:readDouble() self.NoduleNombre = stream:readDouble() self.NoduleWidth1 = stream:readDouble() self.NoduleWidth2 = stream:readDouble() self.NoduleStepDivider = stream:readDouble() self.RipplesNombre = stream:readDouble() self.RipplesAmplitude = stream:readDouble() self.WavesStartNumber = stream:readDouble() self.WavesEndNumber = stream:readDouble() self.WavesAmplitude = stream:readDouble() self.SpiralAngleMin = stream:readDouble() self.SpiralAngleMax = stream:readDouble() self.SpiralAngleStep = stream:readDouble() self.SpiralWireStepMultiplier = stream:readDouble() self.EllipseAngleMin = stream:readDouble() self.EllipseAngleMax = stream:readDouble() self.EllipseAngleStep = stream:readDouble() self.EllipseWireStepMultiplier = stream:readDouble() self.RimSize = stream:readDouble() self.Texture = stream:readString() self.TextureInterior = stream:readString() if Version > 1 then self.RipplesWidth = stream:readDouble() self.RipplesPlace = stream:readDouble() else self.RipplesWidth = 0 self.RipplesPlace = 0 end if Version > 2 then self.StartValve = stream:readBoolean() self.NoduleDecayWidth = stream:readDouble() self.NoduleDecaySpeed = stream:readDouble() self.NoduleDelta = stream:readDouble() else self.StartValve = nil self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 end if Version > 3 then self.NoiseEllipse = stream:readDouble() self.NoiseSpiral = stream:readDouble() self.NoiseHeight = stream:readDouble() self.NoiseOffset = stream:readDouble() self.StartSize = stream:readDouble() self.Sides = stream:readDouble() self.Power1 = stream:readDouble() self.Power2 = stream:readDouble() self.Power3 = stream:readDouble() else self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if Version > 4 then self.ImagAlpha = stream:readDouble() self.ImagBeta = stream:readDouble() else self.ImagAlpha = 0 self.ImagBeta = 0 end if Version > 5 then self.NoiseDensity = stream:readDouble() else self.NoiseDensity = 0 end self.sMu = sin(rad(self.Mu)) self.cMu = cos(rad(self.Mu)) self.sBeta = sin(rad(self.RealBeta)) self.cBeta = cos(rad(self.RealBeta)) self.tAlpha = tan(rad(self.RealAlpha)) end function SeaShell:save(stream) stream:writeByte(6) stream:writeDouble(self.Amplitude) stream:writeDouble(self.DemiAxePrincipal) stream:writeDouble(self.DemiAxeSecondaire) stream:writeDouble(self.RealAlpha) stream:writeDouble(self.RealBeta) stream:writeDouble(self.Phi) stream:writeDouble(self.Mu) stream:writeDouble(self.Omega) stream:writeDouble(self.NodulePlace) stream:writeDouble(self.NoduleHeight) stream:writeDouble(self.NoduleNombre) stream:writeDouble(self.NoduleWidth1) stream:writeDouble(self.NoduleWidth2) stream:writeDouble(self.NoduleStepDivider) stream:writeDouble(self.RipplesNombre) stream:writeDouble(self.RipplesAmplitude) stream:writeDouble(self.WavesStartNumber) stream:writeDouble(self.WavesEndNumber) stream:writeDouble(self.WavesAmplitude) stream:writeDouble(self.SpiralAngleMin) stream:writeDouble(self.SpiralAngleMax) stream:writeDouble(self.SpiralAngleStep) stream:writeDouble(self.SpiralWireStepMultiplier) stream:writeDouble(self.EllipseAngleMin) stream:writeDouble(self.EllipseAngleMax) stream:writeDouble(self.EllipseAngleStep) stream:writeDouble(self.EllipseWireStepMultiplier) stream:writeDouble(self.RimSize) stream:writeString(self.Texture) stream:writeString(self.TextureInterior) --Additifs V2 stream:writeDouble(self.RipplesWidth) stream:writeDouble(self.RipplesPlace) --Additifs V3 stream:writeBoolean(self.StartValve) stream:writeDouble(self.NoduleDecayWidth) stream:writeDouble(self.NoduleDecaySpeed) stream:writeDouble(self.NoduleDelta) --Additifs V4 stream:writeDouble(self.NoiseEllipse) stream:writeDouble(self.NoiseSpiral) stream:writeDouble(self.NoiseHeight) stream:writeDouble(self.NoiseOffset) stream:writeDouble(self.StartSize) stream:writeDouble(self.Sides) stream:writeDouble(self.Power1) stream:writeDouble(self.Power2) stream:writeDouble(self.Power3) --Additifs V5 stream:writeDouble(self.ImagAlpha) stream:writeDouble(self.ImagBeta) --Additifs V6 stream:writeDouble(self.NoiseDensity) end function SeaShell:getProperties() return "SeaShell", "A931A14288F2DF34", "0000000800000000".. "0000000700000000".. "0000007780000000".. "0000007778000000".. "0000077788000000".. "000087777F800000".. "0000877F77F00000".. "0008F77778700000".. "000F787778780000".. "00077888887F8000".. "000878877877F800".. "0000888788877700".. "0000088888887800".. "0000008877788000".. "0000000077780000".. "0000000008800000" end function SeaShell:getDialog(dialog) dialog:addSeparator("Sea Shell") self.ShellListID = dialog:addListBox(self.ShellList,self.Shell) dialog:addSeparator("Structural Curve Shape") self.AmplitudeID = dialog:addTextEdit("Amplitude (-100; 100):",self.Amplitude) self.RealAlphaID = dialog:addTextEdit("Real Alpha (-1800; 1800):",self.RealAlpha) self.ImagAlphaID = dialog:addTextEdit("Imaginary Alpha (-1800; 1800):",self.ImagAlpha) self.RealBetaID = dialog:addTextEdit("Real Beta (-1800; 1800):",self.RealBeta ) self.ImagBetaID = dialog:addTextEdit("Imaginary Beta (-1800; 1800):",self.ImagBeta ) dialog:addSeparator("Structural Curve Angles") self.SpiralAngleMinID = dialog:addTextEdit("Start (-3600; 3600):",self.SpiralAngleMin) self.SpiralAngleMaxID = dialog:addTextEdit("End (-3600; 3600):",self.SpiralAngleMax) self.SpiralAngleStepID = dialog:addTextEdit("Step (0.1; 120):",self.SpiralAngleStep) self.SpiralWireStepMultiplierID = dialog:addTextEdit("Wire multiplier (1; 100):",self.SpiralWireStepMultiplier) dialog:addSeparator("Generating Curve Shape") self.DemiAxePrincipalID = dialog:addTextEdit("Major Radius (-100; 100):",self.DemiAxePrincipal) self.DemiAxeSecondaireID = dialog:addTextEdit("Minor Radius (-100; 100):",self.DemiAxeSecondaire) self.SidesID = dialog:addTextEdit("Sides # (0; 100):",self.Sides) self.Power1ID = dialog:addTextEdit("Power 1 (0; 100):",self.Power1) self.Power2ID = dialog:addTextEdit("Power 2 (0; 100):",self.Power2) self.Power3ID = dialog:addTextEdit("Power 3 (0; 100):",self.Power3) dialog:addSeparator("Generating Curve Rotations") self.MuID = dialog:addTextEdit("Mu (-180; 180):",self.Mu ) self.PhiID = dialog:addTextEdit("Phi (-180; 180):",self.Phi ) self.OmegaID = dialog:addTextEdit("Omega (-180; 180):",self.Omega) dialog:addSeparator("Generating Curve Angles") self.EllipseAngleMinID = dialog:addTextEdit("Start (-3600; 3600):",self.EllipseAngleMin ) self.EllipseAngleMaxID = dialog:addTextEdit("End (-3600; 3600):",self.EllipseAngleMax ) self.EllipseAngleStepID = dialog:addTextEdit("Step (0.1; 120):",self.EllipseAngleStep) self.EllipseWireStepMultiplierID= dialog:addTextEdit("Wire multiplier (1; 100):",self.EllipseWireStepMultiplier) dialog:addSeparator("Adjust") self.AdjustToID = dialog:addTextEdit("Adjust to (0; 1000):",self.AdjustTo) self.AdjustID = dialog:addButton("Adjust") dialog:addSeparator("Nodules") self.NoduleNombreID = dialog:addTextEdit("Number (0; 36):",self.NoduleNombre) self.NodulePlaceID = dialog:addTextEdit("Place (-180; 180):",self.NodulePlace ) self.NoduleHeightID = dialog:addTextEdit("Height (-18; 18):",self.NoduleHeight) self.NoduleWidth1ID = dialog:addTextEdit("Width1 (1; 180):",self.NoduleWidth1) self.NoduleWidth2ID = dialog:addTextEdit("Width2 (1; 180):",self.NoduleWidth2) self.NoduleStepDividerID = dialog:addTextEdit("Step Divider (1; 100):",self.NoduleStepDivider) dialog:addSeparator("MultiplesNodules") self.NoduleDecayWidthID = dialog:addTextEdit("Decay Width (0; 360):",self.NoduleDecayWidth) self.NoduleDecaySpeedID = dialog:addTextEdit("Decay Speed (0; 20):",self.NoduleDecaySpeed) self.NoduleDeltaID = dialog:addTextEdit("Delta (1; 360):",self.NoduleDelta) dialog:addSeparator("Ripples") self.RipplesNombreID = dialog:addTextEdit("Number (-100; 100):",self.RipplesNombre) self.RipplesAmplitudeID = dialog:addTextEdit("Amplitude (-18; 18):",self.RipplesAmplitude) self.RipplesWidthID = dialog:addTextEdit("Width (0; 360):",self.RipplesWidth) self.RipplesPlaceID = dialog:addTextEdit("Place (-360; 360):",self.RipplesPlace) dialog:addSeparator("Waves") self.WavesStartNumberID = dialog:addTextEdit("Start (0; 100):",self.WavesStartNumber) self.WavesEndNumberID = dialog:addTextEdit("End (0; 100):",self.WavesEndNumber ) self.WavesAmplitudeID = dialog:addTextEdit("Amplitude (-18; 18):",self.WavesAmplitude ) dialog:addSeparator("Endings") self.RimSizeID = dialog:addTextEdit("Rim Size (0; 18):",self.RimSize) self.StartValveID = dialog:addCheckBox("Start Valve",self.StartValve) self.StartSizeID = dialog:addTextEdit("Start Size (0; 3600):",self.StartSize) dialog:addSeparator("Noise") self.NoiseEllipseID = dialog:addTextEdit("Along Ellipse (0; 10000):",self.NoiseEllipse) self.NoiseSpiralID = dialog:addTextEdit("Along Spiral (0; 10000):",self.NoiseSpiral) self.NoiseHeightID = dialog:addTextEdit("Height (0; 10):",self.NoiseHeight) self.NoiseDensityID = dialog:addTextEdit("Density (0; 1):",self.NoiseDensity) self.NoiseOffsetID = dialog:addTextEdit("Offset (0; 1000):",self.NoiseOffset) dialog:addSeparator("Texture") self.TextureID = dialog:addTexture(self.Texture) dialog:addSeparator("Interior Texture") self.TextureInteriorID = dialog:addTexture(self.TextureInterior) end function SeaShell:copy(from) self.ShellList = from.ShellList self.Shell = from.Shell self.Amplitude = from.Amplitude self.DemiAxePrincipal = from.DemiAxePrincipal self.DemiAxeSecondaire = from.DemiAxeSecondaire self.RealAlpha = from.RealAlpha self.RealBeta = from.RealBeta self.ImagAlpha = from.ImagAlpha self.ImagBeta = from.ImagBeta self.Phi = from.Phi self.Mu = from.Mu self.Omega = from.Omega self.NodulePlace = from.NodulePlace self.NoduleHeight = from.NoduleHeight self.NoduleNombre = from.NoduleNombre self.NoduleWidth1 = from.NoduleWidth1 self.NoduleWidth2 = from.NoduleWidth2 self.NoduleStepDivider = from.NoduleStepDivider self.NoduleDecayWidth = from.NoduleDecayWidth self.NoduleDecaySpeed = from.NoduleDecaySpeed self.NoduleDelta = from.NoduleDelta self.RipplesNombre = stream:readDouble() self.RipplesAmplitude = stream:readDouble() self.WavesStartNumber = from.WavesStartNumber self.WavesEndNumber = from.WavesEndNumber self.WavesAmplitude = from.WavesAmplitude self.SpiralAngleMin = from.SpiralAngleMin self.SpiralAngleMax = from.SpiralAngleMax self.SpiralAngleStep = from.SpiralAngleStep self.SpiralWireStepMultiplier = from.SpiralWireStepMultiplier self.EllipseAngleMin = from.EllipseAngleMin self.EllipseAngleMax = from.EllipseAngleMax self.EllipseAngleStep = from.EllipsAngleStep self.EllipseWireStepMultiplier = from.EllipseWireStepMultiplier self.RimSize = from.RimSize self.StartValve = from.StartValve self.NoiseEllipse = from.NoiseEllipse self.NoiseSpiral = from.NoiseSpiral self.NoiseHeight = from.NoiseHeight self.NoiseOffset = from.NoiseOffset self.NoiseDensity = from.NoiseDensity self.StartSize = from.StartSize self.Sides = from.Sides self.Power1 = from.Power1 self.Power2 = from.Power2 self.Power3 = from.Power3 self.Texture = from.Texture self.TextureInterior = from.TextureInterior self.RipplesWidth = from.RipplesWidth self.RipplesPlace = from.RipplesPlace self.sMu = from.sMu self.cMu = from.cMu self.sBeta = from.sBeta self.cBeta = from.cBeta self.tAlpha = from.tAlpha end function SeaShell:CheckNumber(Valeur, Minimum, Maximum) local Nombre, Retour Nombre = tonumber(tostring(Valeur)) if Nombre == nil then Retour = 0 elseif Nombre < tonumber(tostring(Minimum)) then Retour = -1 elseif Nombre > tonumber(tostring(Maximum)) then Retour = -2 else return 1 end messageBox("Error", "Enter a number between " .. Minimum .. " & " .. Maximum) return Retour end function SeaShell:valueChanged(id,value) local maxX, minX, maxZ, minZ, Facteur if id == self.ShellListID then self.Shell = value if self.Shell == 1 then --Generatrice self.Amplitude = 1 self.DemiAxePrincipal = 1 self.DemiAxeSecondaire = 1 self.RealAlpha = 90 self.RealBeta = 90 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 0 self.Mu = 0 self.Omega = 0 self.NodulePlace = 0 self.NoduleHeight = 0 self.NoduleNombre = 0 self.NoduleWidth1 = 100 self.NoduleWidth2 = 20 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 0 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = 0 self.SpiralAngleMax = 1 self.SpiralAngleStep = 1 self.EllipseAngleMin = -180 self.EllipseAngleMax = 180 self.EllipseAngleStep = 1 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 2 then --Structurale self.Amplitude = 1 self.DemiAxePrincipal = 1e-012 self.DemiAxeSecondaire = 1e-012 self.RealAlpha = 80 self.RealBeta = 60 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 0 self.Mu = 0 self.Omega = 0 self.NodulePlace = 0 self.NoduleHeight = 0 self.NoduleNombre = 0 self.NoduleWidth1 = 100 self.NoduleWidth2 = 20 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 0 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = 0 self.SpiralAngleMax = 1200 self.SpiralAngleStep = 5 self.EllipseAngleMin = 0 self.EllipseAngleMax = 10 self.EllipseAngleStep = 5 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 3 then --Ammonite self.Amplitude = 0.19 self.DemiAxePrincipal = 0.1 self.DemiAxeSecondaire = 0.09 self.RealAlpha = 80 self.RealBeta = 90 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 1 self.Mu = 1 self.Omega = 1 self.NodulePlace = 10 self.NoduleHeight = 0.2 self.NoduleNombre = 15 self.NoduleWidth1 = 100 self.NoduleWidth2 = 20 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = 0 self.SpiralAngleMax = 1200 self.SpiralAngleStep = 4 self.EllipseAngleMin = -190 self.EllipseAngleMax = 190 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 4 then --Cerith self.Amplitude = .55 self.DemiAxePrincipal = .13 self.DemiAxeSecondaire = .15 self.RealAlpha = 87 self.RealBeta = 3 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 1 self.Mu = 1 self.Omega = 1 self.NodulePlace = 20 self.NoduleHeight = 0.05 self.NoduleNombre = 10.2 self.NoduleWidth1 = 5 self.NoduleWidth2 = 5 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = 0 self.SpiralAngleMax = 3300 self.SpiralAngleStep = 4 self.EllipseAngleMin = -180 self.EllipseAngleMax = 100 self.EllipseAngleStep = 2 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 5 then --Codakia self.Amplitude = 1.05e-007 self.DemiAxePrincipal = 1e-007 self.DemiAxeSecondaire = 1.05e-007 self.RealAlpha = 37 self.RealBeta = 90 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 0 self.Mu = 1 self.Omega = 1 self.NodulePlace = 0 self.NoduleHeight = 0 self.NoduleNombre = 0 self.NoduleWidth1 = 110 self.NoduleWidth2 = 10 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = -180 self.SpiralAngleMax = 720 self.SpiralAngleStep = 4 self.EllipseAngleMin = -180 self.EllipseAngleMax = 180 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 6 then --Conus self.Amplitude = 7 self.DemiAxePrincipal = 5 self.DemiAxeSecondaire = 2 self.RealAlpha = 87 self.RealBeta = 0 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 88 self.Mu = 0 self.Omega = 0 self.NodulePlace = 0 self.NoduleHeight = 0 self.NoduleNombre = 0 self.NoduleWidth1 = 110 self.NoduleWidth2 = 10 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = -2160 self.SpiralAngleMax = 720 self.SpiralAngleStep = 4 self.EllipseAngleMin = -180 self.EllipseAngleMax = 2 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 7 then --Epitonium self.Amplitude = 5.6 self.DemiAxePrincipal = 1.5 self.DemiAxeSecondaire = 1.5 self.RealAlpha = 85 self.RealBeta = 7 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 0 self.Mu = 12 self.Omega = 55 self.NodulePlace = 0 self.NoduleHeight = 1 self.NoduleNombre = 7.23 self.NoduleWidth1 = 110 self.NoduleWidth2 = 10 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 50 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = -720 self.SpiralAngleMax = 1080 self.SpiralAngleStep = 4 self.EllipseAngleMin = -180 self.EllipseAngleMax = 180 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 8 then --Helcion self.Amplitude = 4.5e-017 self.DemiAxePrincipal = 4e-017 self.DemiAxeSecondaire = 3.1e-017 self.RealAlpha = 18 self.RealBeta = 90 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 0 self.Mu = 0 self.Omega = -40 self.NodulePlace = 0 self.NoduleHeight = 0 self.NoduleNombre = 0 self.NoduleWidth1 = 110 self.NoduleWidth2 = 10 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = 0 self.SpiralAngleMax = 720 self.SpiralAngleStep = 4 self.EllipseAngleMin = -180 self.EllipseAngleMax = 180 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 9 then --Lammelibranch self.Amplitude = 0.025 self.DemiAxePrincipal = 0.025 self.DemiAxeSecondaire = 0.04 self.RealAlpha = 45 self.RealBeta = 90 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 0 self.Mu = 0 self.Omega = 0 self.NodulePlace = 0 self.NoduleHeight = 0 self.NoduleNombre = 1 self.NoduleWidth1 = 1 self.NoduleWidth2 = 1 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 50 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = 0 self.SpiralAngleMax = 360 self.SpiralAngleStep = 4 self.EllipseAngleMin = -180 self.EllipseAngleMax = 180 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 10 then --Lyria self.Amplitude = 5.0 self.DemiAxePrincipal = 4.0 self.DemiAxeSecondaire = 1.4 self.RealAlpha = 84 self.RealBeta = -19 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 45 self.Mu = 1 self.Omega = -2 self.NodulePlace = 0 self.NoduleHeight = .8 self.NoduleNombre = 8 self.NoduleWidth1 = 6 self.NoduleWidth2 = 27 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = 0 self.SpiralAngleMax = 1120 self.SpiralAngleStep = 4 self.EllipseAngleMin = -50 self.EllipseAngleMax = 20 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 11 then --Lyria + Ripples self.Amplitude = 5.0 self.DemiAxePrincipal = 4.0 self.DemiAxeSecondaire = 1.4 self.RealAlpha = 84 self.RealBeta = -19 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 45 self.Mu = 1 self.Omega = -2 self.NodulePlace = 0 self.NoduleHeight = .8 self.NoduleNombre = 8 self.NoduleWidth1 = 6 self.NoduleWidth2 = 27 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 50 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = 0 self.SpiralAngleMax = 1120 self.SpiralAngleStep = 5 self.EllipseAngleMin = -50 self.EllipseAngleMax = 20 self.EllipseAngleStep = 5 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 12 then --Natalina self.Amplitude = 2.5 self.DemiAxePrincipal = 1.2 self.DemiAxeSecondaire = 1.6 self.RealAlpha = 80 self.RealBeta = 40 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 55 self.Mu = 10 self.Omega = 30 self.NodulePlace = 0 self.NoduleHeight = 0 self.NoduleNombre = 1 self.NoduleWidth1 = 1 self.NoduleWidth2 = 1 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = 0 self.SpiralAngleMax = 950 self.SpiralAngleStep = 4 self.EllipseAngleMin = -280 self.EllipseAngleMax = 100 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 13 then --Nautile self.Amplitude = 2.0 self.DemiAxePrincipal = 2.0 self.DemiAxeSecondaire = 1.5 self.RealAlpha = 80 self.RealBeta = 90 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 0 self.Mu = 0 self.Omega = 0 self.NodulePlace = 0 self.NoduleHeight = 0 self.NoduleNombre = 1 self.NoduleWidth1 = 1 self.NoduleWidth2 = 1 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = 0 self.SpiralAngleMax = 800 self.SpiralAngleStep = 4 self.EllipseAngleMin = -180 self.EllipseAngleMax = 180 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 14 then --Oxystèle self.Amplitude = 4.7 self.DemiAxePrincipal = 4.0 self.DemiAxeSecondaire = 1.9 self.RealAlpha = 84.9 self.RealBeta = 7 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = -36 self.Mu = 1 self.Omega = -2 self.NodulePlace = 0 self.NoduleHeight = 0 self.NoduleNombre = 1 self.NoduleWidth1 = 1 self.NoduleWidth2 = 1 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = -3600 self.SpiralAngleMax = 720 self.SpiralAngleStep = 4 self.EllipseAngleMin = -70 self.EllipseAngleMax = 70 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 15 then --Planorbis self.Amplitude = 4.5 self.DemiAxePrincipal = 2 self.DemiAxeSecondaire = 3 self.RealAlpha = 84 self.RealBeta = 85 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 10 self.Mu = 45 self.Omega = 5 self.NodulePlace = 0 self.NoduleHeight = 0 self.NoduleNombre = 0 self.NoduleWidth1 = 5 self.NoduleWidth2 = 5 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = -180 self.SpiralAngleMax = 720 self.SpiralAngleStep = 4 self.EllipseAngleMin = -150 self.EllipseAngleMax = 130 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 16 then --Struthiolaria self.Amplitude = 5.0 self.DemiAxePrincipal = 1.8 self.DemiAxeSecondaire = 1.6 self.RealAlpha = 86.9 self.RealBeta = 13 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 40 self.Mu = 10 self.Omega = 30 self.NodulePlace = -15 self.NoduleHeight = .5 self.NoduleNombre = 16 self.NoduleWidth1 = 5 self.NoduleWidth2 = 5 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = -2880 self.SpiralAngleMax = 720 self.SpiralAngleStep = 4 self.EllipseAngleMin = -168 self.EllipseAngleMax = 40 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 17 then --Turbo self.Amplitude = .5 self.DemiAxePrincipal = .3 self.DemiAxeSecondaire = .3 self.RealAlpha = 83 self.RealBeta = 45 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 30 self.Mu = 5 self.Omega = 5 self.NodulePlace = 30 self.NoduleHeight = .2 self.NoduleNombre = 5 self.NoduleWidth1 = 30 self.NoduleWidth2 = 30 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = -720 self.SpiralAngleMax = 900 self.SpiralAngleStep = 4 self.EllipseAngleMin = -230 self.EllipseAngleMax = 80 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 18 then --Turritella self.Amplitude = 1 self.DemiAxePrincipal = .13 self.DemiAxeSecondaire = .15 self.RealAlpha = 88 self.RealBeta = 5 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 55 self.Mu = 1 self.Omega = 0 self.NodulePlace = 0 self.NoduleHeight = 0 self.NoduleNombre = 1 self.NoduleWidth1 = 1 self.NoduleWidth2 = 1 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 0 self.WavesAmplitude = 1 self.SpiralAngleMin = 0 self.SpiralAngleMax = 3600 self.SpiralAngleStep = 4 self.EllipseAngleMin = -200 self.EllipseAngleMax = 70 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end if self.Shell == 19 then --Waves self.Amplitude = 5.6 self.DemiAxePrincipal = 1.5 self.DemiAxeSecondaire = 1.5 self.RealAlpha = 85 self.RealBeta = 7 self.ImagAlpha = 0 self.ImagBeta = 0 self.Phi = 0 self.Mu = 12 self.Omega = 55 self.NodulePlace = 0 self.NoduleHeight = 0 self.NoduleNombre = 1 self.NoduleWidth1 = 1 self.NoduleWidth2 = 1 self.NoduleDecayWidth = 0 self.NoduleDecaySpeed = 0 self.NoduleDelta = 0 self.RipplesNombre = 0 self.RipplesAmplitude = 1 self.RipplesWidth = 0 self.RipplesPlace = 0 self.WavesStartNumber = 0 self.WavesEndNumber = 20 self.WavesAmplitude = .5 self.SpiralAngleMin = -720 self.SpiralAngleMax = 1080 self.SpiralAngleStep = 4 self.EllipseAngleMin = -50 self.EllipseAngleMax = 168 self.EllipseAngleStep = 4 self.RimSize = 0 self.NoiseEllipse = 0 self.NoiseSpiral = 0 self.NoiseHeight = 0 self.NoiseOffset = 0 self.NoiseDensity = 0 self.StartSize = 0 self.Sides = 4 self.Power1 = 2 self.Power2 = 2 self.Power3 = 2 end self.sMu = sin(rad(self.Mu)) self.cMu = cos(rad(self.Mu)) self.sBeta = sin(rad(self.RealBeta)) self.cBeta = cos(rad(self.RealBeta)) self.tAlpha = tan(rad(self.RealAlpha)) self:redraw() end if id == self.RealAlphaID then if self:CheckNumber(value, -1800, 1800) == 1 then self.RealAlpha = tonumber(value) self.tAlpha = tan(rad(self.RealAlpha)) else value = self.RealAlpha end self:redraw() end if id == self.RealBetaID then if self:CheckNumber(value, -1800, 1800) == 1 then self.RealBeta = tonumber(value) self.sBeta = sin(rad(self.RealBeta)) self.cBeta = cos(rad(self.RealBeta)) else value = self.RealBeta end self:redraw() end if id == self.ImagAlphaID then if self:CheckNumber(value, -1800, 1800) == 1 then self.ImagAlpha = tonumber(value) else value = self.ImagAlpha end self:redraw() end if id == self.ImagBetaID then if self:CheckNumber(value, -1800, 1800) == 1 then self.ImagBeta = tonumber(value) else value = self.ImagBeta end self:redraw() end if id == self.MuID then if self:CheckNumber(value, -180, 180) == 1 then self.Mu = tonumber(value) self.sMu = sin(rad(self.Mu)) self.cMu = cos(rad(self.Mu)) else value = self.Mu end self:redraw() end if id == self.PhiID then if self:CheckNumber(value, -180, 180) == 1 then self.Phi = tonumber(value) else value = self.Phi end self:redraw() end if id == self.OmegaID then if self:CheckNumber(value, -180, 180) == 1 then self.Omega = tonumber(value) else value = self.Omega end self:redraw() end if id == self.AmplitudeID then if self:CheckNumber(value, -100, 100) == 1 then self.Amplitude = tonumber(value) else value = self.Amplitude end self:redraw() end if id == self.DemiAxePrincipalID then if self:CheckNumber(value, -100, 100) == 1 then self.DemiAxePrincipal = tonumber(value) else value = self.DemiAxePrincipal end self:redraw() end if id == self.DemiAxeSecondaireID then if self:CheckNumber(value, -100, 100) == 1 then self.DemiAxeSecondaire = tonumber(value) else value = self.DemiAxeSecondaire end self:redraw() end if id == self.AdjustToID then if self:CheckNumber(value, 0, 1000) == 1 then self.AdjustTo = tonumber(value) else value = self.AdjustTo end end if id == self.AdjustID then -- A revoir if self.AdjustTo > 0 then maxX = self.Amplitude*self.sBeta + self.DemiAxePrincipal * exp(rad(self.SpiralAngleMax)/self.tAlpha) minX = -maxX maxZ = -self.Amplitude*self.cBeta + self.DemiAxeSecondaire * exp(rad(self.SpiralAngleMax)/self.tAlpha) minZ = -self.Amplitude*self.cBeta - self.DemiAxeSecondaire * exp(rad(self.SpiralAngleMin)/self.tAlpha) if abs(maxX - minX) > abs(maxZ - minZ) then Facteur = 2*abs(maxX - minX) else Facteur = 2*abs(maxZ - minZ) end if Facteur > 0 then self.Amplitude = self.AdjustTo * self.Amplitude / Facteur self.DemiAxePrincipal = self.AdjustTo * self.DemiAxePrincipal / Facteur self.DemiAxeSecondaire = self.AdjustTo * self.DemiAxeSecondaire / Facteur self.NoduleHeight = self.AdjustTo * self.NoduleHeight / Facteur self.RipplesAmplitude = self.AdjustTo * self.RipplesAmplitude / Facteur self.WavesAmplitude = self.AdjustTo * self.WavesAmplitude / Facteur end end self:redraw() end if id == self.NoduleNombreID then if self:CheckNumber(value, 0, 36) == 1 then self.NoduleNombre = tonumber(value) else value = self.NoduleNombre end self:redraw() end if id == self.NodulePlaceID then if self:CheckNumber(value, -180, 180) == 1 then self.NodulePlace = tonumber(value) else value = self.NodulePlace end self:redraw() end if id == self.NoduleHeightID then if self:CheckNumber(value, -18, 18) == 1 then self.NoduleHeight = tonumber(value) else value = self.NoduleHeight end self:redraw() end if id == self.NoduleWidth1ID then if self:CheckNumber(value, 1, 180) == 1 then self.NoduleWidth1 = tonumber(value) else value = self.NoduleWidth1 end self:redraw() end if id == self.NoduleWidth2ID then if self:CheckNumber(value, 1, 180) == 1 then self.NoduleWidth2 = tonumber(value) else value = self.NoduleWidth2 end self:redraw() end if id == self.NoduleDecayWidthID then if self:CheckNumber(value, 0, 360) == 1 then self.NoduleDecayWidth = tonumber(value) else value = self.NoduleDecayWidth end self:redraw() end if id == self.NoduleDecaySpeedID then if self:CheckNumber(value, 0, 20) == 1 then self.NoduleDecaySpeed = tonumber(value) else value = self.NoduleDecaySpeed end self:redraw() end if id == self.NoduleDeltaID then if self:CheckNumber(value, 1, 360) == 1 then self.NoduleDelta = tonumber(value) else value = self.NoduleDelta end self:redraw() end if id == self.NoduleStepDividerID then if self:CheckNumber(value, 1, 100) == 1 then self.NoduleStepDivider = tonumber(value) else value = self.NoduleStepDivider end self:redraw() end if id == self.RipplesNombreID then if self:CheckNumber(value, -100, 100) == 1 then self.RipplesNombre = tonumber(value) else value = self.RipplesNombre end self:redraw() end if id == self.RipplesAmplitudeID then if self:CheckNumber(value, -18, 18) == 1 then self.RipplesAmplitude = tonumber(value) else value = self.RipplesAmplitude end self:redraw() end if id == self.RipplesWidthID then if self:CheckNumber(value, 0, 360) == 1 then self.RipplesWidth = tonumber(value) else value = self.RipplesWidth end self:redraw() end if id == self.RipplesPlaceID then if self:CheckNumber(value, -360, 360) == 1 then self.RipplesPlace = tonumber(value) else value = self.RipplesPlace end self:redraw() end if id == self.WavesStartNumberID then if self:CheckNumber(value, 0, 100) == 1 then self.WavesStartNumber = tonumber(value) else value = self.WavesStartNumber end self:redraw() end if id == self.WavesEndNumberID then if self:CheckNumber(value, 0, 100) == 1 then self.WavesEndNumber = tonumber(value) else value = self.WavesEndNumber end self:redraw() end if id == self.WavesAmplitudeID then if self:CheckNumber(value, -18, 18) == 1 then self.WavesAmplitude = tonumber(value) else value = self.WavesAmplitude end self:redraw() end if id == self.SpiralAngleMinID then if self:CheckNumber(value, -3600, 3600) == 1 then self.SpiralAngleMin = tonumber(value) else value = self.SpiralAngleMin end self:redraw() end if id == self.SpiralAngleMaxID then if self:CheckNumber(value, -3600, 3600) == 1 then self.SpiralAngleMax = tonumber(value) else value = self.SpiralAngleMax end self:redraw() end if id == self.SpiralAngleStepID then if self:CheckNumber(value, 0.1, 120) == 1 then self.SpiralAngleStep = tonumber(value) else value = self.SpiralAngleStep end self:redraw() end if id == self.SpiralWireStepMultiplierID then if self:CheckNumber(value, 1, 100) == 1 then self.SpiralWireStepMultiplier = tonumber(value) else value = self.SpiralWireStepMultiplier end self:redraw() end if id == self.EllipseAngleMinID then if self:CheckNumber(value, -3600, 3600) == 1 then self.EllipseAngleMin = tonumber(value) else value = self.EllipseAngleMin end self:redraw() end if id == self.EllipseAngleMaxID then if self:CheckNumber(value, -3600, 3600) == 1 then self.EllipseAngleMax = tonumber(value) else value = self.EllipseAngleMax end self:redraw() end if id == self.EllipseAngleStepID then if self:CheckNumber(value, 0.1, 120) == 1 then self.EllipseAngleStep = tonumber(value) else value = self.EllipseAngleStep end self:redraw() end if id == self.EllipseWireStepMultiplierID then if self:CheckNumber(value, 1, 100) == 1 then self.EllipseWireStepMultiplier = tonumber(value) else value = self.EllipseWireStepMultiplier end self:redraw() end if id == self.RimSizeID then if self:CheckNumber(value, 0, 18) == 1 then self.RimSize = tonumber(value) else value = self.RimSize end end if id == self.NoiseEllipseID then if self:CheckNumber(value, 0, 10000) == 1 then self.NoiseEllipse = tonumber(value) else value = self.NoiseEllipse end end if id == self.NoiseSpiralID then if self:CheckNumber(value, 0, 10000) == 1 then self.NoiseSpiral = tonumber(value) else value = self.NoiseSpiral end end if id == self.NoiseHeightID then if self:CheckNumber(value, 0, 10) == 1 then self.NoiseHeight = tonumber(value) else value = self.NoiseHeight end end if id == self.NoiseOffsetID then if self:CheckNumber(value, 0, 1000) == 1 then self.NoiseOffset = tonumber(value) else value = self.NoiseOffset end end if id == self.NoiseDensityID then if self:CheckNumber(value, 0, 1) == 1 then self.NoiseDensity = tonumber(value) else value = self.NoiseDensity end end if id == self.StartValveID then self.StartValve = value self:redraw() end if id == self.StartSizeID then if self:CheckNumber(value, 0, 3600) == 1 then self.StartSize = tonumber(value) else value = self.StartSize end self:redraw() end if id == self.SidesID then if self:CheckNumber(value, 0, 100) == 1 then self.Sides = tonumber(value) else value = self.Sides end self:redraw() end if id == self.Power1ID then if self:CheckNumber(value, 0, 100) == 1 then self.Power1 = tonumber(value) else value = self.Power1 end self:redraw() end if id == self.Power2ID then if self:CheckNumber(value, 0, 100) == 1 then self.Power2 = tonumber(value) else value = self.Power2 end self:redraw() end if id == self.Power3ID then if self:CheckNumber(value, 0, 100) == 1 then self.Power3 = tonumber(value) else value = self.Power3 end self:redraw() end if id == self.TextureID then self.Texture = value end if id == self.TextureInteriorID then self.TextureInterior = value end scene:invalidate() end function SeaShell:getInside(x,y,z) return nil end -- l_ --function SeaShell:NodulePosition(x) -- local pi = 3.141592 -- if self.NoduleNombre == 0 then -- return 1 -- else -- return (2*pi/self.NoduleNombre)*(self.NoduleNombre*abs(x)/(2*pi) - floor(self.NoduleNombre*abs(x)/(2*pi) + .5)) -- end --end function SeaShell:ch(x) return (exp(x)+ exp(-x))/2 end function SeaShell:sh(x) return (exp(x)- exp(-x))/2 end function SeaShell:NodulePositionSpirale(x) local pi = 3.141592 if self.NoduleNombre == 0 then return 1 ---???????????????? else return (2*pi/self.NoduleNombre)*(self.NoduleNombre*abs(x)/(2*pi) - floor(self.NoduleNombre*abs(x)/(2*pi) + .5)) end end function SeaShell:NodulePositionEllipse(x) local pi = 3.141592 local Delta = rad(self.NoduleDelta) if Delta == 0 then return abs(x-rad(self.NodulePlace)) else return Delta*(abs(x-rad(self.NodulePlace))/Delta - floor(abs(x-rad(self.NodulePlace))/(Delta) + .5)) end end function SeaShell:pow(x, y) return exp(y*log(x)) end function SeaShell:NoduleAttenuation(x) local Speed = self.NoduleDecaySpeed local Width = rad(self.NoduleDecayWidth) if Speed == 0 then return 0 end if Width == 0 then return 0 end return (2*Speed-1)*self:pow(abs(x-rad(self.NodulePlace)) / Width, 2*Speed)/(2*Speed) end function SeaShell:SuperFormula(x) -- SuperFormula originale return self:pow(self:pow(abs(cos(self.Sides*x/4)/self.DemiAxePrincipal), self.Power2) + self:pow(abs(sin(self.Sides*x/4)/self.DemiAxeSecondaire), self.Power3), 1/self.Power1) return self:pow(self:pow(abs(cos(self.Sides*x/4)), self.Power2)/self:pow(abs(self.DemiAxePrincipal), self.Power1) + self:pow(abs(sin(self.Sides*x/4)), self.Power3)/self:pow(abs(self.DemiAxeSecondaire), self.Power1), 1/self.Power1) end function SeaShell:ShellRadius(x,y) -- return (1/sqrt((cos(x)/self.DemiAxePrincipal)*(cos(x)/self.DemiAxePrincipal) + (sin(x)/self.DemiAxeSecondaire)*(sin(x)/self.DemiAxeSecondaire)) + self.NoduleHeight*exp(-(2*(x-rad(self.NodulePlace))/rad(self.NoduleWidth1))*(2*(x-rad(self.NodulePlace))/rad(self.NoduleWidth1)) - (2*self:NodulePosition(y)/rad(self.NoduleWidth2))*(2*self:NodulePosition(y)/rad(self.NoduleWidth2)))) -- return (1/sqrt((cos(x)/self.DemiAxePrincipal)*(cos(x)/self.DemiAxePrincipal) + (sin(x)/self.DemiAxeSecondaire)*(sin(x)/self.DemiAxeSecondaire)) + self.NoduleHeight*exp(-(2*(self:NodulePositionEllipse(x))/rad(self.NoduleWidth1))*(2*(self:NodulePositionEllipse(x))/rad(self.NoduleWidth1)) - self:NoduleAttenuation(x) - (2*self:NodulePositionSpirale(y)/rad(self.NoduleWidth2))*(2*self:NodulePositionSpirale(y)/rad(self.NoduleWidth2)))) return (1/self:SuperFormula(x) + self.NoduleHeight*exp(-(2*(self:NodulePositionEllipse(x))/rad(self.NoduleWidth1))*(2*(self:NodulePositionEllipse(x))/rad(self.NoduleWidth1)) - self:NoduleAttenuation(x) - (2*self:NodulePositionSpirale(y)/rad(self.NoduleWidth2))*(2*self:NodulePositionSpirale(y)/rad(self.NoduleWidth2)))) end function SeaShell:Ripples(x) local Gauss if (self.RipplesAmplitude == 0) then return 1 elseif (self.RipplesNombre == 0) then return 1 elseif (self.RipplesWidth == 0) then return (self.RipplesAmplitude * sqrt(self.RipplesNombre*self.RipplesNombre+2*self.RipplesNombre+2-2*(self.RipplesNombre+1)*cos(self.RipplesNombre*x))/self.RipplesNombre) + 1 - self.RipplesAmplitude else Gauss = exp(-(2*(x-rad(self.RipplesPlace))/rad(self.RipplesWidth))*(2*(x-rad(self.RipplesPlace))/rad(self.RipplesWidth))) return (self.RipplesAmplitude * Gauss * sqrt(self.RipplesNombre*self.RipplesNombre+2*self.RipplesNombre+2-2*(self.RipplesNombre+1)*cos(self.RipplesNombre*x))/self.RipplesNombre) + 1 - self.RipplesAmplitude * Gauss end end function SeaShell:Waves(x) local WavesNumber if (self.WavesStartNumber + self.WavesEndNumber == 0) then return 1 else WavesNumber = self.WavesStartNumber + (self.WavesEndNumber - self.WavesStartNumber)*(x - self.SpiralAngleMin)/(self.SpiralAngleMax - self.SpiralAngleMin) if (WavesNumber == 0) then WavesNumber = 0.1 end return (self.WavesAmplitude * sqrt(WavesNumber*WavesNumber+2*WavesNumber+2-2*(WavesNumber+1)*cos(WavesNumber*x))/WavesNumber) + 1 - self.WavesAmplitude --pour plus tard #declare Waves = function(x) { wa*(1 + sqrt(sqrt((cos(ww(x)*x)+1)/2)))/2 + 1 - wa} end end function SeaShell:Queue(x) if x < rad(self.SpiralAngleMin) then return (cos(3.141592*(rad(self.SpiralAngleMin) - x)/(rad(self.StartSize))) + 1) / 2 else return 1 end end function SeaShell:C1(y) return (self.sRealBeta*self.chImagBeta*cos(y*self.Facteur1)+ self.cRealBeta*self.shImagBeta*sin(y*self.Facteur1)) end function SeaShell:C2(y) return (self.cRealBeta*self.chImagBeta*cos(self.Facteur1*y)- self.sRealBeta*self.shImagBeta*sin(self.Facteur1*y)) end function SeaShell:fX(x, y) -- return ( self.Amplitude*self.sBeta*cos(y)+ self:Queue(y)*self:Waves(y)*self:Ripples(x)*self:ShellRadius(x,y)*(cos(x+rad(self.Phi))*cos(rad(self.Omega)+y) - sin(x+rad(self.Phi))*self.sMu*sin(y+rad(self.Omega)))) * exp(y/self.tAlpha) return self.Amplitude*(self.sRealBeta*self.chImagBeta*cos(y*self.Facteur1)+ self.cRealBeta*self.shImagBeta*sin(y*self.Facteur1)) * exp(self.Facteur2*y)*cos(y) + self:Queue(y)*self:Waves(y)*self:Ripples(x)*self:ShellRadius(x,y)*(cos(x+rad(self.Phi))*cos(rad(self.Omega)+y) - sin(x+rad(self.Phi))*self.sMu*sin(y+rad(self.Omega))) * exp(y/self.tAlpha) --Avec pseudo Frenet return self.Amplitude*self:C1(y) * exp(self.Facteur2*y) * cos(y) + self:Queue(y)*self:Waves(y)*self:Ripples(x)*self:ShellRadius(x,y)* ((self:C1(y)/sqrt(2*self:C1(y)*self:C1(y)+self:C2(y)*self:C2(y)))*cos(x+rad(self.Phi))*cos(rad(self.Omega)+y) - sin(x+rad(self.Phi))*self.sMu*sin(y+rad(self.Omega))) * exp(y/self.tAlpha) end --*(self:C1(y)/(2*self:C1(y)*self:C1(y)+self:C2(y)*self:C2(y)) function SeaShell:fY(x,y) -- return (-self.Amplitude*self.sBeta*sin(y)- self:Queue(y)*self:Waves(y)*self:Ripples(x)*self:ShellRadius(x,y)*(cos(x+rad(self.Phi))*sin(rad(self.Omega)+y) + sin(x+rad(self.Phi))*self.sMu*cos(y+rad(self.Omega)))) * exp(y/self.tAlpha) return -self.Amplitude*(self.sRealBeta*self.chImagBeta*cos(self.Facteur1*y)+ self.cRealBeta*self.shImagBeta*sin(self.Facteur1*y)) * exp(self.Facteur2*y)*sin(y) - self:Queue(y)*self:Waves(y)*self:Ripples(x)*self:ShellRadius(x,y)*(cos(x+rad(self.Phi))*sin(rad(self.Omega)+y) + sin(x+rad(self.Phi))*self.sMu*cos(y+rad(self.Omega))) * exp(y/self.tAlpha) --Avec pseudo Frenet return -self.Amplitude*self:C1(y) * exp(self.Facteur2*y) * sin(y) - self:Queue(y)*self:Waves(y)*self:Ripples(x)*self:ShellRadius(x,y)* ((self:C1(y)/sqrt(2*self:C1(y)*self:C1(y)+self:C2(y)*self:C2(y)))*cos(x+rad(self.Phi))*sin(rad(self.Omega)+y) + sin(x+rad(self.Phi))*self.sMu*cos(y+rad(self.Omega))) * exp(y/self.tAlpha) end function SeaShell:fZ(x,y) -- return (-self.Amplitude*self.cBeta + self:Queue(y)*self:Waves(y)*self:Ripples(x)*self:ShellRadius(x,y)*sin(x+rad(self.Phi))*self.cMu) * exp(y/self.tAlpha) return -self.Amplitude*(self.cRealBeta*self.chImagBeta*cos(self.Facteur1*y)- self.sRealBeta*self.shImagBeta*sin(self.Facteur1*y)) * exp(self.Facteur2*y) + self:Queue(y)*self:Waves(y)*self:Ripples(x)*self:ShellRadius(x,y)*sin(x+rad(self.Phi)) * self.cMu * exp(y/self.tAlpha) --Avec pseudo Frenet return -self.Amplitude*self:C2(y) * exp(self.Facteur2*y) + self:Queue(y)*self:Waves(y)*self:Ripples(x)*self:ShellRadius(x,y)*(self:C2(y)/sqrt(2*self:C1(y)*self:C1(y)+self:C2(y)*self:C2(y)))*sin(x+rad(self.Phi)) * self.cMu * exp(y/self.tAlpha) end --*self:C2(y)/(2*self:C1(y)*self:C1(y)+self:C2(y)*self:C2(y)) function SeaShell:wireframe(wire) local u, v local uStep, vStep local xStartCenter, yStartCenter, zStartCenter self.Facteur1 = (self:ch(rad(self.ImagAlpha)) * self:sh(rad(self.ImagAlpha)))/(cos(rad(self.RealAlpha))*cos(rad(self.RealAlpha))*self:sh(rad(self.ImagAlpha))*self:sh(rad(self.ImagAlpha)) + sin(rad(self.RealAlpha))*sin(rad(self.RealAlpha))*self:ch(rad(self.ImagAlpha))*self:ch(rad(self.ImagAlpha))) self.Facteur2 = sin(rad(self.RealAlpha))*cos(rad(self.RealAlpha))/(cos(rad(self.RealAlpha))*cos(rad(self.RealAlpha))*self:sh(rad(self.ImagAlpha))*self:sh(rad(self.ImagAlpha)) + sin(rad(self.RealAlpha))*sin(rad(self.RealAlpha))*self:ch(rad(self.ImagAlpha))*self:ch(rad(self.ImagAlpha))) self.sRealBeta = sin(rad(self.RealBeta)) self.cRealBeta = cos(rad(self.RealBeta)) self.chImagBeta = self:ch(rad(self.ImagBeta)) self.shImagBeta = self:sh(rad(self.ImagBeta)) uStep = self.EllipseAngleStep * self.EllipseWireStepMultiplier vStep = self.SpiralAngleStep * self.SpiralWireStepMultiplier -- a revoir Complètement ainsi que le pov if self.StartValve == 1 then u = self.EllipseAngleMin v = self.SpiralAngleMin xStartCenter = self.Amplitude*self.sBeta*cos(rad(v))*exp(rad(v)/self.tAlpha) yStartCenter = -self.Amplitude*self.sBeta*sin(rad(v))*exp(rad(v)/self.tAlpha) zStartCenter = -self.Amplitude*self.cBeta*exp(rad(v)/self.tAlpha) while (u <= self.EllipseAngleMax) do wire:line(xStartCenter, yStartCenter, zStartCenter,self:fX(rad(u), rad(v)), self:fY(rad(u),rad(v)), self:fZ(rad(u),rad(v))) u = u + uStep end end u = self.EllipseAngleMin while (u + uStep <= self.EllipseAngleMax ) do v = self.SpiralAngleMin - self.StartSize while (v + vStep <= self.SpiralAngleMax) do wire:line(self:fX(rad(u), rad(v)), self:fY(rad(u),rad(v)), self:fZ(rad(u),rad(v)), self:fX(rad(u), rad(v+vStep)) , self:fY(rad(u), rad(v+vStep)) , self:fZ(rad(u), rad(v+vStep))) wire:line(self:fX(rad(u), rad(v)), self:fY(rad(u),rad(v)), self:fZ(rad(u),rad(v)), self:fX(rad(u+uStep), rad(v)), self:fY(rad(u+uStep), rad(v)), self:fZ(rad(u+uStep), rad(v))) v = v + vStep end wire:line(self:fX(rad(u), rad(v)), self:fY(rad(u),rad(v)), self:fZ(rad(u),rad(v)), self:fX(rad(u+uStep), rad(v)), self:fY(rad(u+uStep), rad(v)), self:fZ(rad(u+uStep), rad(v))) u = u + uStep end v = self.SpiralAngleMin - self.StartSize while (v + vStep <= self.SpiralAngleMax) do wire:line(self:fX(rad(u), rad(v)), self:fY(rad(u),rad(v)), self:fZ(rad(u),rad(v)), self:fX(rad(u), rad(v+vStep)) , self:fY(rad(u), rad(v+vStep)) , self:fZ(rad(u), rad(v+vStep))) v = v + vStep end end function SeaShell:toPOV(pov) pov:write("#include \"functions.inc\"") pov:write("#declare MajorRadius = ", self.DemiAxePrincipal, ";") pov:write("#declare b = ", self.DemiAxeSecondaire, ";") pov:write("#declare A = ", self.Amplitude, ";") pov:write("#declare RealAlpha = radians(", self.RealAlpha, ");"); pov:write("#declare RealBeta = radians(", self.RealBeta, ");"); pov:write("#declare ImagAlpha = radians(", self.ImagAlpha, ");"); pov:write("#declare ImagBeta = radians(", self.ImagBeta, ");"); pov:write("#declare Mu = radians(", self.Mu, ");"); pov:write("#declare Phi = radians(", self.Phi, ");"); pov:write("#declare Omega = radians(", self.Omega, ");"); pov:write("#declare Sides = ", self.Sides, ";") pov:write("#declare Power1 = ", self.Power1, ";") pov:write("#declare Power2 = ", self.Power2, ";") pov:write("#declare Power3 = ", self.Power3, ";") pov:write("#declare L = ", self.NoduleHeight, ";") pov:write("#declare P = radians(", self.NodulePlace, ");") pov:write("#declare W1 = radians(", self.NoduleWidth1, ");"); pov:write("#declare W2 = radians(", self.NoduleWidth2, ");"); pov:write("#declare N = ", self.NoduleNombre, ";") pov:write("#declare Speed = ", self.NoduleDecaySpeed, ";"); pov:write("#declare Width = radians(", self.NoduleDecayWidth, ");"); pov:write("#declare Delta = radians(", self.NoduleDelta, ");") pov:write("#declare m = ", self.RipplesNombre, ";") pov:write("#declare ra = ", self.RipplesAmplitude, ";") pov:write("#declare rW = radians(", self.RipplesWidth, ");") pov:write("#declare rP = radians(", self.RipplesPlace, ");") pov:write("#declare minw = ", self.WavesStartNumber, ";") pov:write("#declare maxw = ", self.WavesEndNumber, ";") pov:write("#declare wa = ", self.WavesAmplitude, ";") pov:write("#declare rr = ", self.RimSize,";") pov:write("#declare vvMin = ", self.SpiralAngleMin, ";") pov:write("#declare vvMax = ", self.SpiralAngleMax, ";") pov:write("#declare vvStep = ", self.SpiralAngleStep, ";") pov:write("#declare uuMin = ", self.EllipseAngleMin, ";") pov:write("#declare uuMax = ", self.EllipseAngleMax, ";") pov:write("#declare uuStep = ", self.EllipseAngleStep, ";") pov:write("#declare NoiseEllipse = ", self.NoiseEllipse, ";") pov:write("#declare NoiseSpiral = ", self.NoiseSpiral, ";") pov:write("#declare NoiseHeight = ", self.NoiseHeight, ";") pov:write("#declare NoiseOffset = ", self.NoiseOffset, ";") pov:write("#declare NoiseDensity = ", max(self.NoiseDensity, 0.0001), ";") pov:write("#declare StartSize = ", self.StartSize, ";") pov:write("#declare uuNum = floor((uuMax - uuMin) / uuStep);") pov:write("#declare vvNum = floor((vvMax - vvMin + StartSize) / vvStep);") pov:write("#declare sMu = sin(Mu);") pov:write("#declare cMu = cos(Mu);") pov:write("#declare sBeta = sin(RealBeta);") pov:write("#declare cBeta = cos(RealBeta);") pov:write("#declare tAlpha = tan(RealAlpha);") pov:write("#declare Facteur1 = cosh(ImagAlpha) * sinh(ImagAlpha)/(cos(RealAlpha)*cos(RealAlpha)*sinh(ImagAlpha)*sinh(ImagAlpha) + sin(RealAlpha)*sin(RealAlpha)*cosh(ImagAlpha)*cosh(ImagAlpha));") -- self.Facteur1 = (self:ch(rad(self.ImagAlpha)) * self:sh(rad(self.ImagAlpha)))/(cos(rad(self.RealAlpha))*cos(rad(self.RealAlpha))*self:sh(rad(self.ImagAlpha))*self:sh(rad(self.ImagAlpha)) + sin(rad(self.RealAlpha))*sin(rad(self.RealAlpha))*self:ch(rad(self.ImagAlpha))*self:ch(rad(self.ImagAlpha))) pov:write("#declare Facteur2 = sin(RealAlpha)*cos(RealAlpha) /(cos(RealAlpha)*cos(RealAlpha)*sinh(ImagAlpha)*sinh(ImagAlpha) + sin(RealAlpha)*sin(RealAlpha)*cosh(ImagAlpha)*cosh(ImagAlpha));") -- self.Facteur2 = sin(rad(self.RealAlpha))*cos(rad(self.RealAlpha))/(cos(rad(self.RealAlpha))*cos(rad(self.RealAlpha))*self:sh(rad(self.ImagAlpha))*self:sh(rad(self.ImagAlpha)) + sin(rad(self.RealAlpha))*sin(rad(self.RealAlpha))*self:ch(rad(self.ImagAlpha))*self:ch(rad(self.ImagAlpha))) pov:write("#declare sRealBeta = sin(RealBeta);") pov:write("#declare cRealBeta = cos(RealBeta);") pov:write("#declare chImagBeta = cosh(ImagBeta);") pov:write("#declare shImagBeta = sinh(ImagBeta);") pov:write("#ifdef (round)") pov:write(" #undef round") pov:write("#end") pov:write("#ifdef (l_)") pov:write(" #undef l_") pov:write("#end") pov:write("#ifdef (ShellRadius)") pov:write(" #undef ShellRadius") pov:write("#end") pov:write("#ifdef (Ripples)") pov:write(" #undef Ripples") pov:write("#end") pov:write("#ifdef (Waves)") pov:write(" #undef Waves") pov:write("#end") pov:write("#ifdef (ww)") pov:write(" #undef ww") pov:write("#end") pov:write("#ifdef (SuperFormula)") pov:write(" #undef SuperFormula") pov:write("#end") pov:write("#ifdef (Queue)") pov:write(" #undef Queue") pov:write("#end") pov:write("#ifdef (nps)") pov:write(" #undef nps") pov:write("#end") pov:write("#ifdef (npe)") pov:write(" #undef npe") pov:write("#end") pov:write("#ifdef (att)") pov:write(" #undef att") pov:write("#end") pov:write("#ifdef (X_)") pov:write(" #undef X_") pov:write("#end") pov:write("#ifdef (Y_)") pov:write(" #undef Y_") pov:write("#end") pov:write("#ifdef (Z_)") pov:write(" #undef Z_") pov:write("#end") pov:write("#declare round = function(x) {int(x+.5)}") pov:write("#if (N = 0)") pov:write(" #declare nps = function(y) {1}") --??????????????? pov:write("#else") pov:write(" #declare nps = function(y) {(2*pi/N)* (N*abs(y)/(2*pi) - round(N*abs(y)/(2*pi)))} ") pov:write("#end") pov:write("#if (Delta = 0)") pov:write(" #declare npe = function(y) {abs(y - P)}") pov:write("#else") pov:write(" #declare npe = function(y) {Delta*(abs(y-P)/Delta - round(abs(y-P)/Delta))}") pov:write("#end") pov:write("#if (Speed = 0)") pov:write(" #declare att = function(y) {0}") pov:write("#else") pov:write(" #if (Width = 0)") pov:write(" #declare att = function(y) {0}") pov:write(" #else") pov:write(" #declare att = function(y) {(2*Speed-1)*pow(abs(y-P) / Width, 2*Speed)/(2*Speed)}") pov:write(" #end") pov:write("#end") -- SuperFormule originale pov:write("#declare SuperFormula = function(x) {pow(pow(abs(cos(Sides*x/4)/MajorRadius), Power2) + pow(abs(sin(Sides*x/4)/b), Power3), 1/Power1)}") pov:write("#declare SuperFormula = function(x) {pow(pow(abs(cos(Sides*x/4)), Power2)/pow(MajorRadius,Power1) + pow(abs(sin(Sides*x/4)), Power3)/pow(b,Power1), 1/Power1)}") pov:write("#if (N = 0)") pov:write(" #declare l_ = function(y) {0} ") pov:write(" #declare L = 0;") pov:write("#else ") pov:write(" #declare l_ = function(y) {(2*pi/N)*(N*abs(y)/(2*pi) - round(N*abs(y)/(2*pi)))} ") pov:write("#end") -- pov:write("#declare ShellRadius = function(x,y) { 1/sqrt((cos(x)/MajorRadius)*(cos(x)/MajorRadius) + (sin(x)/b)*(sin(x)/b)) + L*exp(-(2*(x-P)/W1)*(2*(x-P)/W1) - (2*l_(y)/W2)*(2*l_(y)/W2))}") --20/7 pov:write("#if (NoiseHeight*(NoiseEllipse+NoiseSpiral) = 0)") --20/7 pov:write(" #declare ShellRadius = function(x,y) {(1/sqrt((cos(x)/MajorRadius)*(cos(x)/MajorRadius) + (sin(x)/b)*(sin(x)/b)) + L*exp(-(2*(npe(x)/W1)*2*(npe(x)/W1)) - att(x) - (2*nps(y)/W2)*(2*nps(y)/W2)))}") --20/7 pov:write("#else") --20/7 pov:write(" #declare ShellRadius = function(x,y) {((1/sqrt((cos(x)/MajorRadius)*(cos(x)/MajorRadius) + (sin(x)/b)*(sin(x)/b)) + L*exp(-(2*(npe(x)/W1)*2*(npe(x)/W1)) - att(x) - (2*nps(y)/W2)*(2*nps(y)/W2))))*(1+ f_snoise3d(x*NoiseEllipse + NoiseOffset,y*NoiseSpiral + NoiseOffset, 0)* NoiseHeight)}") pov:write(" #declare ShellRadius = function(x,y) {((1/SuperFormula(x) + L*exp(-(2*(npe(x)/W1)*2*(npe(x)/W1)) - att(x) - (2*nps(y)/W2)*(2*nps(y)/W2))))*(1+ max(f_snoise3d(x*NoiseEllipse + NoiseOffset,y*NoiseSpiral + NoiseOffset, 0) - (1-NoiseDensity), 0) * NoiseHeight / NoiseDensity)}") --20/7 pov:write("#end") pov:write("#if (m = 0)") pov:write(" #declare Ripples = function(x) {1}") pov:write("#else") pov:write(" #if (ra = 0)") pov:write(" #declare Ripples = function(x) {1}") pov:write(" #else") pov:write(" #if (rW = 0)") pov:write(" #declare Ripples = function(x) {(ra*sqrt(m*m+2*m+2-2*(m+1)*cos(m*x))/m)+1-ra}") pov:write(" #else") pov:write(" #declare Ripples = function(x) {(ra*exp(-(2*(x-rP)/rW)*(2*(x-rP)/rW))*sqrt(m*m+2*m+2-2*(m+1)*cos(m*x))/m)+1-ra*exp(-(2*(x-rP)/rW)*(2*(x-rP)/rW))}") pov:write(" #end") pov:write(" #end") pov:write("#end") pov:write("#if (minw + maxw = 0)") pov:write(" #declare Waves = function(x) {1}") pov:write("#else") pov:write(" #declare ww = function(x) {max(minw + (maxw-minw)*(x-vvMin)/(vvMax-vvMin), 0.001)}") pov:write(" #declare Waves = function(x) {wa*sqrt(ww(x)*ww(x)+2*ww(x)+2-2*(ww(x)+1)*cos(ww(x)*x))/ww(x) + 1 - wa}") pov:write("#end ") pov:write("#declare Queue = function(x) {(x=radians(vvMin))}") -- .000000001 = ignoble astuce pour éviter une division par 0 -- pov:write("#declare X_ = function(x,y) {( A*sBeta*cos(y)+Queue(y)*Waves(y)*Ripples(x)*ShellRadius(x,y)*(cos(x+Phi)*cos(Omega+y) - sin(x+Phi)*sMu*sin(y+Omega)))*exp(y/tAlpha)}") pov:write("#declare X_ = function(x,y) { A*(sRealBeta*chImagBeta*cos(y*Facteur1)+ cRealBeta*shImagBeta*sin(y*Facteur1)) * exp(Facteur2*y)*cos(y) + Queue(y)*Waves(y)*Ripples(x)*ShellRadius(x,y)*(cos(x+Phi)*cos(Omega+y) - sin(x+Phi)*sMu*sin(y+Omega)) * exp(y/tAlpha)}") -- pov:write("#declare Y_ = function(x,y) {(-A*sBeta*sin(y)-Queue(y)*Waves(y)*Ripples(x)*ShellRadius(x,y)*(cos(x+Phi)*sin(Omega+y) + sin(x+Phi)*sMu*cos(y+Omega)))*exp(y/tAlpha)}") pov:write("#declare Y_ = function(x,y) {-A*(sRealBeta*chImagBeta*cos(y*Facteur1)+ cRealBeta*shImagBeta*sin(y*Facteur1)) * exp(Facteur2*y)*sin(y) - Queue(y)*Waves(y)*Ripples(x)*ShellRadius(x,y)*(cos(x+Phi)*sin(Omega+y) + sin(x+Phi)*sMu*cos(y+Omega)) * exp(y/tAlpha)}") -- pov:write("#declare Z_ = function(x,y) {(-A*cBeta + Queue(y)*Waves(y)*Ripples(x)*ShellRadius(x,y)*sin(x+Phi)*cMu) * exp(y/tAlpha)}") pov:write("#declare Z_ = function(x,y) {-A*(cRealBeta*chImagBeta*cos(y*Facteur1)- sRealBeta*shImagBeta*sin(y*Facteur1)) * exp(Facteur2*y) + Queue(y)*Waves(y)*Ripples(x)*ShellRadius(x,y)*sin(x+Phi) * cMu * exp(y/tAlpha)}") if self.RimSize > 0 then pov:write("union {") end pov:write("mesh2 {") if self.StartValve == 1 then pov:write("vertex_vectors { (uuNum + 1) * (vvNum + 1) + 1,") else pov:write("vertex_vectors { (uuNum + 1) * (vvNum + 1),") end pov:write("#declare uu = uuMin;") pov:write("#while (uu <= uuMax)") pov:write(" #declare vv = vvMin - StartSize;") pov:write(" #while (vv <= vvMax )") pov:write(" ") pov:write(" #declare vv = vv + vvStep;") pov:write(" #end") pov:write(" #declare uu = uu + uuStep;") pov:write("#end") if self.StartValve == 1 then pov:write("") end pov:write(" }") pov:write("face_indices {") if self.StartValve == 1 then pov:write("uuNum*vvNum*2 + uuNum,") else pov:write("uuNum*vvNum*2,") end pov:write("#declare uu = 0;") pov:write("#while (uu < uuNum)") pov:write(" #declare vv = 0;") pov:write(" #while (vv < vvNum )") pov:write(" <(vvNum+1)*uu + vv,(vvNum+1)*(uu+1) + vv, (vvNum+1)*(uu+1) + vv + 1>") pov:write(" <(vvNum+1)*uu + vv,(vvNum+1)*(uu+1) + vv + 1, (vvNum+1)*uu + vv + 1>") pov:write(" #declare vv = vv + 1;") pov:write(" #end") pov:write(" #declare uu = uu + 1;") pov:write("#end") if self.StartValve == 1 then pov:write("#declare uu = 0;") pov:write("#while (uu < uuNum)") pov:write(" #declare vv = 0;") pov:write(" <(vvNum+1)*(uu+1) + vv, (vvNum+1)*uu + vv, (uuNum + 1) * (vvNum + 1) >") pov:write(" #declare uu = uu + 1;") pov:write("#end ") end pov:write("}") if self.RimSize > 0 then pov:write("}") pov:write("#declare uu = uuMin;") pov:write("#declare vv = vvMin - StartSize + vvNum*vvStep;") pov:write("#while (uu + uuStep<= uuMax) ") pov:write(" sphere {, rr}") pov:write(" cylinder {,") pov:write(" , rr}") pov:write(" #declare uu = uu + uuStep;") pov:write("#end") end if self.TextureInterior == "" then pov:texture(gsub(self.Texture, "%s", "%_") ) else pov:write("interior_texture{", gsub(self.Texture, "%s", "%_"),"}") pov:texture(gsub(self.TextureInterior, "%s", "%_") ) end pov:transforms(self.xforms) pov:write("}") end registerClass(SeaShell,"SeaShell")