{"id":1975,"date":"2025-11-24T13:41:24","date_gmt":"2025-11-24T13:41:24","guid":{"rendered":"https:\/\/altsl.com\/?page_id=1975"},"modified":"2026-04-21T13:35:49","modified_gmt":"2026-04-21T21:35:49","slug":"lsl-particle-generator","status":"publish","type":"page","link":"https:\/\/altsl.com\/fr\/tools\/lsl-particle-generator\/","title":{"rendered":"G\u00e9n\u00e9rateur de particules LSL"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1975\" class=\"elementor elementor-1975\" data-elementor-post-type=\"page\">\n\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-06a856b e-flex e-con-boxed e-con e-parent\" data-id=\"06a856b\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-a2af690 e-con-full e-flex e-con e-child\" data-id=\"a2af690\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-97dade6 elementor-widget elementor-widget-heading\" data-id=\"97dade6\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">LSL Particle System Generator<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dc1319d elementor-widget elementor-widget-heading\" data-id=\"dc1319d\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Generate flawless LSL scripted particles for your objects<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-30fa649 elementor-widget elementor-widget-html\" data-id=\"30fa649\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0\/css\/all.min.css\">\r\n\r\n<style>\r\n    .sl-nice-donate {\r\n        display: inline-flex;\r\n        align-items: center;\r\n        gap: 12px;\r\n        background: rgba(255, 255, 255, 0.03);\r\n        backdrop-filter: blur(8px);\r\n        -webkit-backdrop-filter: blur(8px);\r\n        padding: 6px 16px 6px 8px;\r\n        border-radius: 40px;\r\n        border: 1px solid rgba(179, 102, 255, 0.25);\r\n        cursor: pointer;\r\n        transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);\r\n        font-family: 'Segoe UI', Roboto, sans-serif;\r\n    }\r\n\r\n    .sl-nice-donate:hover {\r\n        background: rgba(68, 0, 102, 0.4);\r\n        border-color: #d199ff;\r\n        transform: translateY(-1px);\r\n    }\r\n\r\n    .linden-circle {\r\n        background: linear-gradient(135deg, #440066, #7c4dff);\r\n        color: #fff;\r\n        width: 32px;\r\n        height: 32px;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        border-radius: 50%;\r\n        font-weight: 800;\r\n        font-size: 13px;\r\n        box-shadow: 0 0 15px rgba(124, 77, 255, 0.4);\r\n    }\r\n\r\n    .nice-content {\r\n        display: flex;\r\n        flex-direction: column;\r\n    }\r\n\r\n    .nice-title {\r\n        color: #f0f0f0;\r\n        font-size: 12px;\r\n        font-weight: 600;\r\n        letter-spacing: 0.3px;\r\n    }\r\n\r\n    .nice-subtext {\r\n        color: #b366ff;\r\n        font-size: 10px;\r\n        font-style: italic;\r\n        opacity: 0.9;\r\n    }\r\n\r\n    .success-text {\r\n        color: #00ffbb !important;\r\n        font-weight: bold;\r\n    }\r\n<\/style>\r\n\r\n<div class=\"sl-nice-donate\" onclick=\"copyNiceName()\" title=\"Support the creator\">\r\n    <div class=\"linden-circle\" id=\"n-icon\">L$<\/div>\r\n    \r\n    <div class=\"nice-content\">\r\n        <span class=\"nice-title\" id=\"n-title\">Love our tools?<\/span>\r\n        <span class=\"nice-subtext\" id=\"n-sub\">Click to tip: OG.Resident<\/span>\r\n    <\/div>\r\n<\/div>\r\n\r\n<script>\r\nfunction copyNiceName() {\r\n    const avatar = \"OG.Resident\";\r\n    const profileURL = \"secondlife:\/\/\/app\/agent\/8e7df4ff-0d3f-4763-b840-e012b30a8c19\/about\";\r\n    \r\n    navigator.clipboard.writeText(avatar).then(() => {\r\n        const title = document.getElementById('n-title');\r\n        const sub = document.getElementById('n-sub');\r\n        const icon = document.getElementById('n-icon');\r\n\r\n        title.innerText = \"You're amazing!\";\r\n        title.classList.add('success-text');\r\n        sub.innerText = \"Name copied. Opening profile...\";\r\n        icon.innerHTML = \"<i class='fas fa-heart'><\/i>\";\r\n        icon.style.background = \"#00ffbb\";\r\n\r\n        window.location.href = profileURL;\r\n\r\n        setTimeout(() => {\r\n            title.innerText = \"Love our tools?\";\r\n            title.classList.remove('success-text');\r\n            sub.innerText = \"Click to tip: \" + avatar;\r\n            icon.innerText = \"L$\";\r\n            icon.style.background = \"linear-gradient(135deg, #440066, #7c4dff)\";\r\n        }, 4000);\r\n    });\r\n}\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-ece22fc e-con-full e-flex e-con e-parent\" data-id=\"ece22fc\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c9d2953 elementor-widget elementor-widget-shortcode\" data-id=\"c9d2953\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n<div class=\"asl-wrapper\">\n    <style>\n        \/* Elementor Global Defaults (assuming a dark theme) *\/\n        .asl-wrapper { \n            font-family: \"Onest\", sans-serif; \n            color: #ABABAB; \/* Light gray for main text *\/\n            font-size: 14px;\n        }\n        \n        \/* Matching the Dark, Bordered, and Shadowed style *\/\n        .asl-card { \n            background: #0A0A0A; \/* Very dark background *\/\n            border-radius: 4px; \/* Slightly sharper corners *\/\n            padding: 18px; \n            box-shadow: 0 0 10px rgba(0,0,0,0.5); \/* Subtle shadow for depth *\/\n            border: 1px solid rgba(255,255,255,0.08); \/* Light, subtle border *\/\n        }\n        \n        .asl-header { \n            display: flex; \n            justify-content: space-between; \n            gap: 12px; \n            margin-bottom: 20px; \n            border-bottom: 1px solid rgba(255,255,255,0.05); \/* Separator line *\/\n            padding-bottom: 15px;\n        }\n        \n        .asl-title { \n            display: flex; \n            align-items: center;\n        }\n        \n        .asl-title h1 { \n            margin: 0; \n            font-size: 20px; \/* Slightly larger title *\/\n            color: #FFFFFF; \n            font-weight: 700; \/* Bolder font *\/\n            letter-spacing: 0.5px;\n        }\n        \n        .asl-lead { \n            margin: 0; \n            color: #999999; \/* Slightly darker gray *\/\n            font-size: 14px;\n        }\n\n        \/* Grid layout for the particle controls *\/\n        .asl-grid-3 {\n            display: grid;\n            grid-template-columns: repeat(3, 1fr);\n            gap: 20px;\n            margin-bottom: 20px;\n        }\n\n        .asl-col {\n            background: rgba(255,255,255,0.02);\n            padding: 15px;\n            border-radius: 4px;\n            border: 1px solid rgba(255,255,255,0.05);\n        }\n        \n        .asl-section-title {\n            color: #FFFFFF;\n            font-weight: 600;\n            margin-bottom: 12px;\n            padding-bottom: 6px;\n            border-bottom: 1px solid rgba(255,255,255,0.1);\n            font-size: 15px;\n        }\n\n        .asl-form-row {\n            display: flex;\n            flex-direction: column;\n            margin-bottom: 12px;\n            font-size: 13px;\n        }\n\n        .asl-form-row label {\n            color: #CCCCCC;\n            margin-bottom: 4px;\n            font-weight: 500;\n            display: flex;\n            justify-content: space-between;\n        }\n\n        .asl-form-row input[type=\"number\"],\n        .asl-form-row input[type=\"text\"],\n        .asl-form-row select {\n            width: 100%;\n            padding: 8px 10px;\n            border-radius: 4px;\n            border: 1px solid rgba(255,255,255,0.1);\n            background: #000000;\n            color: #FFFFFF;\n            font-size: 13px;\n            box-sizing: border-box;\n        }\n        \n        .asl-form-row input[type=\"color\"] {\n            width: 100%;\n            height: 36px;\n            padding: 2px;\n            border: 1px solid rgba(255,255,255,0.1);\n            background: #000000;\n            border-radius: 4px;\n            cursor: pointer;\n            box-sizing: border-box;\n        }\n\n        \/* Range slider styling for dark theme *\/\n        .asl-form-row input[type=\"range\"] {\n            -webkit-appearance: none;\n            width: 100%;\n            height: 6px;\n            background: #333;\n            border-radius: 3px;\n            outline: none;\n            margin-top: 6px;\n        }\n        .asl-form-row input[type=\"range\"]::-webkit-slider-thumb {\n            -webkit-appearance: none;\n            appearance: none;\n            width: 16px;\n            height: 16px;\n            border-radius: 50%;\n            background: #FFFFFF;\n            cursor: pointer;\n        }\n\n        .asl-checkbox-group {\n            display: flex;\n            flex-direction: column;\n            gap: 8px;\n        }\n\n        .asl-checkbox-item {\n            display: flex;\n            align-items: center;\n            gap: 8px;\n            color: #ABABAB;\n            font-size: 13px;\n            cursor: pointer;\n        }\n        \n        .asl-checkbox-item input[type=\"checkbox\"] {\n            cursor: pointer;\n            accent-color: #5D0090;\n        }\n\n        .asl-multi-input {\n            display: flex;\n            gap: 6px;\n        }\n        .asl-multi-input input {\n            width: 33%;\n        }\n\n        \/* LSL Textarea *\/\n        .asl-lsl { \n            width: 100%; \n            height: 300px; \n            background: #000000; \/* Pure black for code blocks *\/\n            border-radius: 4px; \n            padding: 12px; \n            font-family: monospace; \n            color: #00FF99; \/* Green\/Cyan color for code readability *\/\n            overflow: auto; \n            resize: vertical;\n            border: 1px solid rgba(255,255,255,0.06);\n            font-size: 12px;\n            line-height: 1.4;\n            box-sizing: border-box;\n        }\n\n        .asl-button {\n            min-width: 180px;\n            padding: 12px 18px; \n            border-radius: 4px; \n            border: none; \n            color: #FFFFFF; \n            font-weight: 600; \n            cursor: pointer;\n            transition: background 0.2s ease, transform 0.1s ease;\n            text-transform: uppercase;\n            letter-spacing: 1px;\n            font-size: 13px;\n            display: inline-flex; \n            align-items: center;\n            justify-content: center;\n            gap: 12px;\n            background: #5D0090; \/* Dark purple\/magenta *\/\n            margin-top: 10px;\n        }\n        .asl-button:hover {\n            background: #8A00C0; \/* Lighter purple on hover *\/\n            transform: translateY(-1px);\n        }\n        \n        .asl-copy-msg {\n            color: #00FF99;\n            font-size: 13px;\n            margin-left: 15px;\n            opacity: 0;\n            transition: opacity 0.3s ease;\n        }\n        .asl-copy-msg.visible {\n            opacity: 1;\n        }\n\n        \/* Responsive *\/\n        @media(max-width:980px){ \n            .asl-grid-3 { grid-template-columns: 1fr; } \n        }\n    <\/style>\n\n    <div class=\"asl-card\">\n        <div class=\"asl-header\">\n            <div class=\"asl-title\">\n                <div>\n                    <h1>Particle System Generator<\/h1>\n                    <p class=\"asl-lead\">Configure settings to generate instant LSL particle scripts.<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"asl-grid-3\">\n            \n            <!-- Column 1: Basics -->\n            <div class=\"asl-col\">\n                <div class=\"asl-section-title\">Emitter & Color<\/div>\n                \n                <div class=\"asl-form-row\">\n                    <label>Texture UUID<\/label>\n                    <input type=\"text\" id=\"texture_key\" value=\"2fdaae13-8205-26b5-6e7c-9e4b1f8f8e33\" placeholder=\"UUID\">\n                <\/div>\n\n                <div class=\"asl-form-row\">\n                    <label>Pattern<\/label>\n                    <select id=\"pattern\">\n                        <option value=\"1\">Drop (Stationary)<\/option>\n                        <option value=\"2\">Explode (Omni-directional)<\/option>\n                        <option value=\"4\" selected>Angle (2D Fan)<\/option>\n                        <option value=\"8\">Angle Cone (3D Cone)<\/option>\n                    <\/select>\n                <\/div>\n\n                <div class=\"asl-form-row\">\n                    <label>Start Color<\/label>\n                    <input type=\"color\" id=\"start_color\" value=\"#FFFFFF\">\n                <\/div>\n                \n                <div class=\"asl-form-row\">\n                    <label>End Color<\/label>\n                    <input type=\"color\" id=\"end_color\" value=\"#FFFFFF\">\n                <\/div>\n\n                <div class=\"asl-form-row\">\n                    <label>Start Alpha <span id=\"start_alpha_val\">1.0<\/span><\/label>\n                    <input type=\"range\" id=\"start_alpha\" min=\"0\" max=\"1\" step=\"0.01\" value=\"1.0\">\n                <\/div>\n\n                <div class=\"asl-form-row\">\n                    <label>End Alpha <span id=\"end_alpha_val\">0.0<\/span><\/label>\n                    <input type=\"range\" id=\"end_alpha\" min=\"0\" max=\"1\" step=\"0.01\" value=\"0.0\">\n                <\/div>\n            <\/div>\n\n            <!-- Column 2: Physics -->\n            <div class=\"asl-col\">\n                <div class=\"asl-section-title\">Physics & Size<\/div>\n\n                <div class=\"asl-form-row\">\n                    <label>Lifetime (Seconds)<\/label>\n                    <input type=\"number\" id=\"max_age\" value=\"2.0\" step=\"0.1\">\n                <\/div>\n                \n                <div class=\"asl-form-row\">\n                    <label>Burst Rate (Seconds)<\/label>\n                    <input type=\"number\" id=\"burst_rate\" value=\"0.1\" step=\"0.01\">\n                <\/div>\n\n                <div class=\"asl-form-row\">\n                    <label>Speed (Min \/ Max)<\/label>\n                    <div class=\"asl-multi-input\">\n                        <input type=\"number\" id=\"min_speed\" value=\"0.5\" step=\"0.1\" style=\"width:50%\">\n                        <input type=\"number\" id=\"max_speed\" value=\"1.5\" step=\"0.1\" style=\"width:50%\">\n                    <\/div>\n                <\/div>\n\n                <div class=\"asl-form-row\">\n                    <label>Size (Start \/ End)<\/label>\n                    <div class=\"asl-multi-input\">\n                        <input type=\"number\" id=\"start_size\" value=\"0.2\" step=\"0.05\" style=\"width:50%\">\n                        <input type=\"number\" id=\"end_size\" value=\"0.5\" step=\"0.05\" style=\"width:50%\">\n                    <\/div>\n                <\/div>\n\n                <div class=\"asl-form-row\">\n                    <label>Acceleration (X, Y, Z)<\/label>\n                    <div class=\"asl-multi-input\">\n                        <input type=\"number\" id=\"accel_x\" value=\"0.0\" step=\"0.1\">\n                        <input type=\"number\" id=\"accel_y\" value=\"0.0\" step=\"0.1\">\n                        <input type=\"number\" id=\"accel_z\" value=\"-0.2\" step=\"0.1\">\n                    <\/div>\n                    <div style=\"font-size:11px; color:#666; margin-top:2px;\">Negative Z is gravity<\/div>\n                <\/div>\n            <\/div>\n\n            <!-- Column 3: Flags -->\n            <div class=\"asl-col\">\n                <div class=\"asl-section-title\">Flags & Options<\/div>\n                \n                <div class=\"asl-checkbox-group\">\n                    <label class=\"asl-checkbox-item\">\n                        <input type=\"checkbox\" id=\"interp_color\" checked> Interpolate Color\n                    <\/label>\n                    <label class=\"asl-checkbox-item\">\n                        <input type=\"checkbox\" id=\"interp_size\" checked> Interpolate Size\n                    <\/label>\n                    <label class=\"asl-checkbox-item\">\n                        <input type=\"checkbox\" id=\"glow\"> Glow (Emissive)\n                    <\/label>\n                    <label class=\"asl-checkbox-item\">\n                        <input type=\"checkbox\" id=\"bounce\"> Bounce\n                    <\/label>\n                    <label class=\"asl-checkbox-item\">\n                        <input type=\"checkbox\" id=\"wind\"> Wind Affects\n                    <\/label>\n                    <label class=\"asl-checkbox-item\">\n                        <input type=\"checkbox\" id=\"follow_src\"> Follow Emitter\n                    <\/label>\n                    <label class=\"asl-checkbox-item\">\n                        <input type=\"checkbox\" id=\"follow_vel\" checked> Follow Velocity\n                    <\/label>\n                    <label class=\"asl-checkbox-item\">\n                        <input type=\"checkbox\" id=\"target_pos\"> Target Position\n                    <\/label>\n                <\/div>\n\n                <div class=\"asl-form-row\" style=\"margin-top:20px;\">\n                    <label>Blend Mode<\/label>\n                    <select id=\"blend_mode\">\n                        <option value=\"0\">Normal (Alpha)<\/option>\n                        <option value=\"1\">Additive (Bright\/Fire)<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div style=\"display:flex; justify-content:space-between; align-items:flex-end;\">\n            <h3 style=\"color:#FFF; font-size:16px; margin:0 0 10px 0;\">Generated LSL Code<\/h3>\n            <div style=\"margin-bottom:10px\">\n                <span id=\"copyMsg\" class=\"asl-copy-msg\">Copied to clipboard!<\/span>\n                <button id=\"copyBtn\" class=\"asl-button\"><i class=\"fas fa-copy\"><\/i> Copy Code<\/button>\n            <\/div>\n        <\/div>\n        \n        <textarea id=\"lsl-code-output\" class=\"asl-lsl\" readonly><\/textarea>\n\n    <\/div>\n<\/div>\n\n<script>\n    \/\/ --- LSL Constants for Flags ---\n    const FLAG_VALUES = {\n        INTERP_COLOR: 1,\n        INTERP_SIZE: 2,\n        BOUNCE: 4,\n        WIND: 8,\n        FOLLOW_SRC: 16,\n        FOLLOW_VEL: 32,\n        TARGET_POS: 64,\n        TARGET_LINEAR: 128, \/\/ Not used in UI but kept for completeness\n        EMISSIVE: 256\n    };\n\n    \/**\n     * Converts a hex color string to an LSL vector string (<r, g, b>).\n     * @param {string} hex - The hex color string (e.g., \"#FFFFFF\").\n     * @returns {string} The LSL vector string.\n     *\/\n    function hexToLSLVector(hex) {\n        if (!hex || hex.length !== 7 || hex[0] !== '#') return \"<1.0, 1.0, 1.0>\";\n        const r = parseInt(hex.substring(1, 3), 16) \/ 255.0;\n        const g = parseInt(hex.substring(3, 5), 16) \/ 255.0;\n        const b = parseInt(hex.substring(5, 7), 16) \/ 255.0;\n        return `<${r.toFixed(3)}, ${g.toFixed(3)}, ${b.toFixed(3)}>`;\n    }\n\n    \/**\n     * Reads all settings from the UI and generates the LSL script.\n     *\/\n    function generateScript() {\n        \/\/ Collect Inputs\n        const i = {\n            texture: document.getElementById('texture_key').value.trim(),\n            pattern: document.getElementById('pattern').value,\n            startCol: document.getElementById('start_color').value,\n            endCol: document.getElementById('end_color').value,\n            startAlpha: parseFloat(document.getElementById('start_alpha').value),\n            endAlpha: parseFloat(document.getElementById('end_alpha').value),\n            life: parseFloat(document.getElementById('max_age').value),\n            rate: parseFloat(document.getElementById('burst_rate').value),\n            minSpeed: parseFloat(document.getElementById('min_speed').value),\n            maxSpeed: parseFloat(document.getElementById('max_speed').value),\n            startSize: parseFloat(document.getElementById('start_size').value),\n            endSize: parseFloat(document.getElementById('end_size').value),\n            accelX: parseFloat(document.getElementById('accel_x').value),\n            accelY: parseFloat(document.getElementById('accel_y').value),\n            accelZ: parseFloat(document.getElementById('accel_z').value),\n            isAdditive: document.getElementById('blend_mode').value === \"1\"\n        };\n\n        \/\/ Calculate Flag Mask\n        let flags = 0;\n        if (document.getElementById('interp_color').checked) flags += FLAG_VALUES.INTERP_COLOR;\n        if (document.getElementById('interp_size').checked) flags += FLAG_VALUES.INTERP_SIZE;\n        if (document.getElementById('glow').checked) flags += FLAG_VALUES.EMISSIVE;\n        if (document.getElementById('bounce').checked) flags += FLAG_VALUES.BOUNCE;\n        if (document.getElementById('wind').checked) flags += FLAG_VALUES.WIND;\n        if (document.getElementById('follow_src').checked) flags += FLAG_VALUES.FOLLOW_SRC;\n        if (document.getElementById('follow_vel').checked) flags += FLAG_VALUES.FOLLOW_VEL;\n        if (document.getElementById('target_pos').checked) flags += FLAG_VALUES.TARGET_POS;\n\n        \/\/ If Additive blend is selected, ensure the EMISSIVE flag is set for visual brightness\n        if (i.isAdditive && !(flags & FLAG_VALUES.EMISSIVE)) {\n            flags += FLAG_VALUES.EMISSIVE;\n        }\n\n        \/\/ Build List\n        const lines = [];\n        lines.push(`    PSYS_PART_FLAGS, ${flags}`);\n        lines.push(`    PSYS_SRC_PATTERN, ${i.pattern}`);\n        lines.push(`    PSYS_PART_START_COLOR, ${hexToLSLVector(i.startCol)}`);\n        lines.push(`    PSYS_PART_END_COLOR, ${hexToLSLVector(i.endCol)}`);\n        lines.push(`    PSYS_PART_START_ALPHA, ${i.startAlpha.toFixed(3)}`);\n        lines.push(`    PSYS_PART_END_ALPHA, ${i.endAlpha.toFixed(3)}`);\n        \/\/ LSL particle system expects a vector scale, so we duplicate the size value for X and Y\n        lines.push(`    PSYS_PART_START_SCALE, <${i.startSize.toFixed(3)}, ${i.startSize.toFixed(3)}, 0.0>`);\n        lines.push(`    PSYS_PART_END_SCALE, <${i.endSize.toFixed(3)}, ${i.endSize.toFixed(3)}, 0.0>`);\n        lines.push(`    PSYS_SRC_MAX_AGE, 0.0`); \/\/ Emitter lives forever\n        lines.push(`    PSYS_PART_MAX_AGE, ${i.life.toFixed(3)}`);\n        lines.push(`    PSYS_SRC_BURST_RATE, ${i.rate.toFixed(3)}`);\n        lines.push(`    PSYS_SRC_BURST_PART_COUNT, 1`); \n        lines.push(`    PSYS_SRC_BURST_SPEED_MIN, ${i.minSpeed.toFixed(3)}`);\n        lines.push(`    PSYS_SRC_BURST_SPEED_MAX, ${i.maxSpeed.toFixed(3)}`);\n        lines.push(`    PSYS_SRC_ACCEL, <${i.accelX.toFixed(3)}, ${i.accelY.toFixed(3)}, ${i.accelZ.toFixed(3)}>`);\n        lines.push(`    PSYS_SRC_TEXTURE, \"${i.texture}\"`);\n\n        const listContent = lines.join(\",\\n\");\n\n        const script = `\/\/ :CATEGORY: Particles\n\/\/ :NAME: Particle_System_Gen\n\/\/ :AUTHOR: AltSL.com\n\/\/ :CREATED: ${new Date().toISOString().split('T')[0]}\n\n\/\/ Instructions:\n\/\/ 1. Save this script in a new primitive.\n\/\/ 2. Add your texture to the primitive's inventory.\n\/\/ 3. Touch the primitive to stop the particles and reset the script.\n\nlist particle_params = [\n${listContent}\n];\n\ndefault\n{\n    state_entry()\n    {\n        \/\/ Start the particle system with the generated list\n        llParticleSystem(particle_params);\n        llOwnerSay(\"Particles Started. Touch to stop.\");\n    }\n\n    touch_start(integer num)\n    {\n        \/\/ Stop the particle system\n        llParticleSystem([]);\n        llOwnerSay(\"Particles Stopped. Resetting...\");\n        \/\/ Reset the script to start again on next rez\/re-entry\n        llResetScript();\n    }\n}`;\n        document.getElementById('lsl-code-output').value = script;\n    }\n\n    \/\/ UI Updates\n    function updateVal(id, displayId) {\n        document.getElementById(displayId).textContent = parseFloat(document.getElementById(id).value).toFixed(2);\n        generateScript();\n    }\n\n    \/\/ Listeners: Attach to the wrapper to handle all inputs dynamically\n    const container = document.querySelector('.asl-wrapper');\n    if (container) {\n        container.querySelectorAll('input, select').forEach(input => {\n            input.addEventListener('input', () => {\n                \/\/ Update alpha range labels dynamically\n                if(input.id === 'start_alpha') updateVal('start_alpha', 'start_alpha_val');\n                else if(input.id === 'end_alpha') updateVal('end_alpha', 'end_alpha_val');\n                \/\/ Regenerate script on any input change\n                generateScript();\n            });\n        });\n\n        \/\/ Copy button handler\n        document.getElementById('copyBtn').addEventListener('click', () => {\n            const copyText = document.getElementById(\"lsl-code-output\");\n            copyText.select();\n            copyText.setSelectionRange(0, 99999);\n            \/\/ Use modern clipboard API if available, fallback for older browsers\/contexts\n            if (navigator.clipboard) {\n                navigator.clipboard.writeText(copyText.value).then(() => {\n                    const msg = document.getElementById('copyMsg');\n                    msg.classList.add('visible');\n                    setTimeout(() => msg.classList.remove('visible'), 2000);\n                });\n            } else {\n                \/\/ Fallback for document.execCommand('copy') which is deprecated but often works in restricted environments\n                try {\n                    document.execCommand('copy');\n                    const msg = document.getElementById('copyMsg');\n                    msg.classList.add('visible');\n                    setTimeout(() => msg.classList.remove('visible'), 2000);\n                } catch (err) {\n                    console.error('Failed to copy text using fallback: ', err);\n                }\n            }\n        });\n    }\n\n\n    \/\/ Init: Wait for the document to be ready and run initial generation\n    document.addEventListener('DOMContentLoaded', () => {\n        \/\/ Run initial setup for alpha display and script generation\n        updateVal('start_alpha', 'start_alpha_val');\n        updateVal('end_alpha', 'end_alpha_val');\n        generateScript();\n    });\n\n<\/script>\n\n    <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>LSL Particle System Generator Generate flawless LSL scripted particles for your objects L$ Love our tools? Click to tip: OG.Resident<\/p>","protected":false},"author":1,"featured_media":482,"parent":1613,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1975","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Second Life LSL Particle Generator - Alt Weekend Sales<\/title>\n<meta name=\"description\" content=\"Easily create stunning particle effects in Second Life using this powerful LSL generator. Customize colors, speeds, textures, and more!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/altsl.com\/fr\/tools\/lsl-particle-generator\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Second Life LSL Particle Generator - Alt Weekend Sales\" \/>\n<meta property=\"og:description\" content=\"Easily create stunning particle effects in Second Life using this powerful LSL generator. Customize colors, speeds, textures, and more!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/altsl.com\/fr\/tools\/lsl-particle-generator\/\" \/>\n<meta property=\"og:site_name\" content=\"Alt Weekend Sales\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-21T21:35:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/Alt_Banner.png\" \/>\n\t<meta property=\"og:image:width\" content=\"851\" \/>\n\t<meta property=\"og:image:height\" content=\"284\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/altsl.com\\\/tools\\\/lsl-particle-generator\\\/\",\"url\":\"https:\\\/\\\/altsl.com\\\/tools\\\/lsl-particle-generator\\\/\",\"name\":\"Second Life LSL Particle Generator - Alt Weekend Sales\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/altsl.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/altsl.com\\\/tools\\\/lsl-particle-generator\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/altsl.com\\\/tools\\\/lsl-particle-generator\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/altsl.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/Alt_Banner.png\",\"datePublished\":\"2025-11-24T13:41:24+00:00\",\"dateModified\":\"2026-04-21T21:35:49+00:00\",\"description\":\"Easily create stunning particle effects in Second Life using this powerful LSL generator. Customize colors, speeds, textures, and more!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/altsl.com\\\/tools\\\/lsl-particle-generator\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/altsl.com\\\/tools\\\/lsl-particle-generator\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/altsl.com\\\/tools\\\/lsl-particle-generator\\\/#primaryimage\",\"url\":\"https:\\\/\\\/altsl.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/Alt_Banner.png\",\"contentUrl\":\"https:\\\/\\\/altsl.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/Alt_Banner.png\",\"width\":851,\"height\":284},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/altsl.com\\\/tools\\\/lsl-particle-generator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/altsl.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tools\",\"item\":\"https:\\\/\\\/altsl.com\\\/tools\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"LSL Particle Generator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/altsl.com\\\/#website\",\"url\":\"https:\\\/\\\/altsl.com\\\/\",\"name\":\"Alt Weekend Sale\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/altsl.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/altsl.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/altsl.com\\\/#organization\",\"name\":\"Alt Weekend Sale\",\"url\":\"https:\\\/\\\/altsl.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/altsl.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/altsl.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/OBzIOE4.png\",\"contentUrl\":\"https:\\\/\\\/altsl.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/OBzIOE4.png\",\"width\":1024,\"height\":747,\"caption\":\"Alt Weekend Sale\"},\"image\":{\"@id\":\"https:\\\/\\\/altsl.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"G\u00e9n\u00e9rateur de particules LSL Second Life - Alt Weekend Sales","description":"Easily create stunning particle effects in Second Life using this powerful LSL generator. Customize colors, speeds, textures, and more!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/altsl.com\/fr\/tools\/lsl-particle-generator\/","og_locale":"fr_FR","og_type":"article","og_title":"Second Life LSL Particle Generator - Alt Weekend Sales","og_description":"Easily create stunning particle effects in Second Life using this powerful LSL generator. Customize colors, speeds, textures, and more!","og_url":"https:\/\/altsl.com\/fr\/tools\/lsl-particle-generator\/","og_site_name":"Alt Weekend Sales","article_modified_time":"2026-04-21T21:35:49+00:00","og_image":[{"width":851,"height":284,"url":"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/Alt_Banner.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/altsl.com\/tools\/lsl-particle-generator\/","url":"https:\/\/altsl.com\/tools\/lsl-particle-generator\/","name":"G\u00e9n\u00e9rateur de particules LSL Second Life - Alt Weekend Sales","isPartOf":{"@id":"https:\/\/altsl.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/altsl.com\/tools\/lsl-particle-generator\/#primaryimage"},"image":{"@id":"https:\/\/altsl.com\/tools\/lsl-particle-generator\/#primaryimage"},"thumbnailUrl":"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/Alt_Banner.png","datePublished":"2025-11-24T13:41:24+00:00","dateModified":"2026-04-21T21:35:49+00:00","description":"Easily create stunning particle effects in Second Life using this powerful LSL generator. Customize colors, speeds, textures, and more!","breadcrumb":{"@id":"https:\/\/altsl.com\/tools\/lsl-particle-generator\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/altsl.com\/tools\/lsl-particle-generator\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/altsl.com\/tools\/lsl-particle-generator\/#primaryimage","url":"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/Alt_Banner.png","contentUrl":"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/Alt_Banner.png","width":851,"height":284},{"@type":"BreadcrumbList","@id":"https:\/\/altsl.com\/tools\/lsl-particle-generator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/altsl.com\/"},{"@type":"ListItem","position":2,"name":"Tools","item":"https:\/\/altsl.com\/tools\/"},{"@type":"ListItem","position":3,"name":"LSL Particle Generator"}]},{"@type":"WebSite","@id":"https:\/\/altsl.com\/#website","url":"https:\/\/altsl.com\/","name":"Alt Weekend Sale","description":"","publisher":{"@id":"https:\/\/altsl.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/altsl.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/altsl.com\/#organization","name":"Alt Weekend Sale","url":"https:\/\/altsl.com\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/altsl.com\/#\/schema\/logo\/image\/","url":"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/OBzIOE4.png","contentUrl":"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/OBzIOE4.png","width":1024,"height":747,"caption":"Alt Weekend Sale"},"image":{"@id":"https:\/\/altsl.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/altsl.com\/fr\/wp-json\/wp\/v2\/pages\/1975","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/altsl.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/altsl.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/altsl.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/altsl.com\/fr\/wp-json\/wp\/v2\/comments?post=1975"}],"version-history":[{"count":16,"href":"https:\/\/altsl.com\/fr\/wp-json\/wp\/v2\/pages\/1975\/revisions"}],"predecessor-version":[{"id":5930,"href":"https:\/\/altsl.com\/fr\/wp-json\/wp\/v2\/pages\/1975\/revisions\/5930"}],"up":[{"embeddable":true,"href":"https:\/\/altsl.com\/fr\/wp-json\/wp\/v2\/pages\/1613"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/altsl.com\/fr\/wp-json\/wp\/v2\/media\/482"}],"wp:attachment":[{"href":"https:\/\/altsl.com\/fr\/wp-json\/wp\/v2\/media?parent=1975"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}