% Title: lua-tikz3dtools.sty
% Author: Jasper Nice
% Date: April 12, 2026
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesExplPackage{lua-tikz3dtools}{2026/04/12}{v3.0.0}{
    LuaLaTeX package for 3D illustrations in TikZ.
}

\RequirePackage{tikz}
\RequirePackage{xcolor}

\NewDocumentCommand{\luatikztdtoolsset}{o}{\tikzset{/lua-tikz3dtools/.cd, #1}}
\tikzset{
    /lua-tikz3dtools/.is~family % abbreviated "td"
    ,/lua-tikz3dtools/.cd 
        ,/lua-tikz3dtools/parametric/.cd % appreviated "p"
            ,/lua-tikz3dtools/parametric/object/.cd % abbreviated "m"
                ,object/.code = {\protected@edef\luatikztdtools@p@m@object{#1}}
                ,name/.code = {\protected@edef\luatikztdtools@p@m@name{#1}}
            ,/lua-tikz3dtools/parametric/light/.cd % abbreviated "la"
                ,v/.code = {\protected@edef\luatikztdtools@p@la@v{#1}}
            ,/lua-tikz3dtools/parametric/point/.cd % abbreviated "p"
                ,v/.code = {\protected@edef\luatikztdtools@p@p@v{#1}}
                ,fill~options/.estore~in = \luatikztdtools@p@p@filloptions
                ,fill~options/.initial = {}
                ,transformation/.code = {\protected@edef\luatikztdtools@p@p@transformation{#1}}
                ,transformation/.initial = Matrix:identity3()
                ,filter/.code = {\protected@edef\luatikztdtools@p@p@filter{#1}}
                ,filter/.initial = return~true
            ,/lua-tikz3dtools/parametric/label/.cd % abbreviated "l"
                ,v/.code = {\protected@edef\luatikztdtools@p@l@v{#1}}
                ,text/.code = {\def\luatikztdtools@p@l@text{#1}}
                ,transformation/.code = {\protected@edef\luatikztdtools@p@l@transformation{#1}}
                ,transformation/.initial = Matrix:identity3()
                ,filter/.code = {\protected@edef\luatikztdtools@p@l@filter{#1}}
                ,filter/.initial = return~true
            ,/lua-tikz3dtools/parametric/curve/.cd % abbreviated "c"
                ,ustart/.estore~in = \luatikztdtools@p@c@ustart
                ,ustart/.initial = 0
                ,ustop/.estore~in = \luatikztdtools@p@c@ustop
                ,ustop/.initial = 1
                ,usamples/.estore~in = \luatikztdtools@p@c@usamples
                ,usamples/.initial = 10
                ,v/.code = {\protected@edef\luatikztdtools@p@c@v{#1}}
                ,transformation/.code = {\protected@edef\luatikztdtools@p@c@transformation{#1}}
                ,transformation/.initial = Matrix:identity3()
                ,draw~options/.estore~in = \luatikztdtools@p@c@drawoptions
                ,draw~options/.initial = {}
                ,arrow~tip/.code = {\protected@edef\luatikztdtools@p@c@arrowtip{#1}}
                ,arrow~tail/.code = {\protected@edef\luatikztdtools@p@c@arrowtail{#1}}
                ,filter/.code = {\protected@edef\luatikztdtools@p@c@filter{#1}}
                ,filter/.initial = return~true
            ,/lua-tikz3dtools/parametric/surface/.cd % abbreviated "s"
                ,ustart/.estore~in = \luatikztdtools@p@s@ustart
                ,ustart/.initial = 0
                ,ustop/.estore~in = \luatikztdtools@p@s@ustop
                ,ustop/.initial = 1
                ,usamples/.estore~in = \luatikztdtools@p@s@usamples
                ,usamples/.initial = 10
                ,vstart/.estore~in = \luatikztdtools@p@s@vstart
                ,vstart/.initial = 0
                ,vstop/.estore~in = \luatikztdtools@p@s@vstop
                ,vstop/.initial = 1
                ,vsamples/.estore~in = \luatikztdtools@p@s@vsamples
                ,vsamples/.initial = 10
                ,v/.code = {\protected@edef\luatikztdtools@p@s@v{#1}}
                ,transformation/.code = {\protected@edef\luatikztdtools@p@s@transformation{#1}}
                ,transformation/.initial = Matrix:identity3()
                ,fill~options/.code = {\protected@edef\luatikztdtools@p@s@filloptions{#1}}
                ,fill~options/.initial = {}
                ,filter/.code = {\protected@edef\luatikztdtools@p@s@filter{#1}}
                ,filter/.initial = return~true
            ,/lua-tikz3dtools/parametric/triangle/.cd % abbreviated "t"
                ,A/.code = {\protected@edef\luatikztdtools@p@t@A{#1}}
                ,B/.code = {\protected@edef\luatikztdtools@p@t@B{#1}}
                ,C/.code = {\protected@edef\luatikztdtools@p@t@C{#1}}
                ,transformation/.code = {\protected@edef\luatikztdtools@p@t@transformation{#1}}
                ,transformation/.initial = Matrix:identity3()
                ,fill~options/.code = {\protected@edef\luatikztdtools@p@t@filloptions{#1}}
                ,fill~options/.initial = {}
                ,filter/.code = {\protected@edef\luatikztdtools@p@t@filter{#1}}
                ,filter/.initial = return~true
            ,/lua-tikz3dtools/parametric/solid/.cd % abbreviated "solid"
                ,ustart/.estore~in = \luatikztdtools@p@solid@ustart
                ,ustart/.initial = 0
                ,ustop/.estore~in = \luatikztdtools@p@solid@ustop
                ,ustop/.initial = 1
                ,usamples/.estore~in = \luatikztdtools@p@solid@usamples
                ,usamples/.initial = 10
                ,vstart/.estore~in = \luatikztdtools@p@solid@vstart
                ,vstart/.initial = 0
                ,vstop/.estore~in = \luatikztdtools@p@solid@vstop
                ,vstop/.initial = 1
                ,vsamples/.estore~in = \luatikztdtools@p@solid@vsamples
                ,vsamples/.initial = 10
                ,wstart/.estore~in = \luatikztdtools@p@solid@wstart
                ,wstart/.initial = 0
                ,wstop/.estore~in = \luatikztdtools@p@solid@wstop
                ,wstop/.initial = 1
                ,wsamples/.estore~in = \luatikztdtools@p@solid@wsamples
                ,wsamples/.initial = 10
                ,v/.code = {\protected@edef\luatikztdtools@p@solid@v{#1}}
                ,transformation/.code = {\protected@edef\luatikztdtools@p@solid@transformation{#1}}
                ,transformation/.initial = Matrix:identity3()
                ,fill~options/.estore~in = \luatikztdtools@p@solid@filloptions
                ,fill~options/.initial = {}
                ,filter/.code = {\protected@edef\luatikztdtools@p@solid@filter{#1}}
                ,filter/.initial = return~true
}% end tikzset

\lua_load_module:n { lua-tikz3dtools-implementation }

\NewDocumentCommand { \appendpoint } {o} {
    \group_begin:
    \tikzset{
        /lua-tikz3dtools/parametric/point/.search~also = {/tikz}
        ,/lua-tikz3dtools/parametric/point/.cd
        ,#1
    }
    \__lua_tikztdtools_appendpoint:
    \group_end:
}
\NewDocumentCommand { \appendlabel } {o} {
    \group_begin:
    \tikzset{
        /lua-tikz3dtools/parametric/label/.search~also = {/tikz}
        ,/lua-tikz3dtools/parametric/label/.cd
        ,#1
    }
    \__lua_tikztdtools_appendlabel:
    \group_end:
}
\NewDocumentCommand { \appendlight } {o} {
    \group_begin:
    \tikzset{
        /lua-tikz3dtools/parametric/light/.search~also = {/tikz}
        ,/lua-tikz3dtools/parametric/light/.cd
        ,#1
    }
    \__lua_tikztdtools_appendlight:
    \group_end:
}
\NewDocumentCommand { \appendcurve } {o} {
    \group_begin:
    \tikzset{
        /lua-tikz3dtools/parametric/curve/.search~also = {/tikz}
        ,/lua-tikz3dtools/parametric/curve/.cd
        ,#1
    }
    \__lua_tikztdtools_appendcurve:
    \group_end:
}
\NewDocumentCommand { \appendsurface } {o} {
    \group_begin:
    \tikzset{
        /lua-tikz3dtools/parametric/surface/.search~also = {/tikz}
        ,/lua-tikz3dtools/parametric/surface/.cd
        ,#1
    }
    \__lua_tikztdtools_appendsurface:
    \group_end:
}
\NewDocumentCommand { \appendtriangle } {o} {
    \group_begin:
    \tikzset{
        /lua-tikz3dtools/parametric/triangle/.search~also = {/tikz}
        ,/lua-tikz3dtools/parametric/triangle/.cd
        ,#1
    }
    \__lua_tikztdtools_appendtriangle:
    \group_end:
}
\NewDocumentCommand { \appendsolid } {o} {
    \group_begin:
    \tikzset{
        /lua-tikz3dtools/parametric/solid/.search~also = {/tikz}
        ,/lua-tikz3dtools/parametric/solid/.cd
        ,#1
    }
    \__lua_tikztdtools_appendsolid:
    \group_end:
}
\NewDocumentCommand { \displaysimplices } {} {
    \group_begin:
    \__lua_tikztdtools_displaysimplices:
    \group_end:
}
\NewDocumentCommand { \setobject } {o} {
    \group_begin:
    \tikzset{
        /lua-tikz3dtools/parametric/object/.search~also = {/tikz}
        ,/lua-tikz3dtools/parametric/object/.cd
        ,#1
    }
    \__lua_tikztdtools_setobject:
    \group_end:
}
