% Title: lua-tikz3dtools.sty
% Author: Jasper Nice
% Date: April 28, 2026
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesExplPackage{lua-tikz3dtools}{2026/04/28}{v3.1.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}}
            % Points are better drawn as oriended disks using \appendsurface
            % ,/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 = return~Matrix.identity()
            %     ,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 = return~Matrix.identity()
                ,filter/.code = {\protected@edef\luatikztdtools@p@l@filter{#1}}
                ,filter/.initial = return~true
            ,/lua-tikz3dtools/parametric/curve/.cd % abbreviated "c"
                ,uparams/.code = {\protected@edef\luatikztdtools@p@c@uparams{#1}}
                ,uparams/.initial = return~Vector:new{0,1,10}
                ,ustart/.code = {\protected@edef\luatikztdtools@p@c@ustart{#1}}
                ,ustop/.code = {\protected@edef\luatikztdtools@p@c@ustop{#1}}
                ,usamples/.code = {\protected@edef\luatikztdtools@p@c@usamples{#1}}
                ,v/.code = {\protected@edef\luatikztdtools@p@c@v{#1}}
                ,transformation/.code = {\protected@edef\luatikztdtools@p@c@transformation{#1}}
                ,transformation/.initial = return~Matrix.identity()
                ,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"
                ,uparams/.code = {\protected@edef\luatikztdtools@p@s@uparams{#1}}
                ,uparams/.initial = return~Vector:new{0,1,10}
                ,ustart/.code = {\protected@edef\luatikztdtools@p@s@ustart{#1}}
                ,ustop/.code = {\protected@edef\luatikztdtools@p@s@ustop{#1}}
                ,usamples/.code = {\protected@edef\luatikztdtools@p@s@usamples{#1}}
                ,vparams/.code = {\protected@edef\luatikztdtools@p@s@vparams{#1}}
                ,vparams/.initial = return~Vector:new{0,1,10}
                ,vstart/.code = {\protected@edef\luatikztdtools@p@s@vstart{#1}}
                ,vstop/.code = {\protected@edef\luatikztdtools@p@s@vstop{#1}}
                ,vsamples/.code = {\protected@edef\luatikztdtools@p@s@vsamples{#1}}
                ,v/.code = {\protected@edef\luatikztdtools@p@s@v{#1}}
                ,transformation/.code = {\protected@edef\luatikztdtools@p@s@transformation{#1}}
                ,transformation/.initial = return~Matrix.identity()
                ,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
                ,curve/.code = {\protected@edef\luatikztdtools@p@s@curve{#1}}
            ,/lua-tikz3dtools/parametric/triangle/.cd % abbreviated "t"
                ,m/.code = {\protected@edef\luatikztdtools@p@t@m{#1}}
                ,transformation/.code = {\protected@edef\luatikztdtools@p@t@transformation{#1}}
                ,transformation/.initial = return~Matrix.identity()
                ,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"
                ,uparams/.code = {\protected@edef\luatikztdtools@p@solid@uparams{#1}}
                ,uparams/.initial = return~Vector:new{0,1,10}
                ,ustart/.code = {\protected@edef\luatikztdtools@p@solid@ustart{#1}}
                ,ustop/.code = {\protected@edef\luatikztdtools@p@solid@ustop{#1}}
                ,usamples/.code = {\protected@edef\luatikztdtools@p@solid@usamples{#1}}
                ,vparams/.code = {\protected@edef\luatikztdtools@p@solid@vparams{#1}}
                ,vparams/.initial = return~Vector:new{0,1,10}
                ,vstart/.code = {\protected@edef\luatikztdtools@p@solid@vstart{#1}}
                ,vstop/.code = {\protected@edef\luatikztdtools@p@solid@vstop{#1}}
                ,vsamples/.code = {\protected@edef\luatikztdtools@p@solid@vsamples{#1}}
                ,wparams/.code = {\protected@edef\luatikztdtools@p@solid@wparams{#1}}
                ,wparams/.initial = return~Vector:new{0,1,10}
                ,wstart/.code = {\protected@edef\luatikztdtools@p@solid@wstart{#1}}
                ,wstop/.code = {\protected@edef\luatikztdtools@p@solid@wstop{#1}}
                ,wsamples/.code = {\protected@edef\luatikztdtools@p@solid@wsamples{#1}}
                ,v/.code = {\protected@edef\luatikztdtools@p@solid@v{#1}}
                ,transformation/.code = {\protected@edef\luatikztdtools@p@solid@transformation{#1}}
                ,transformation/.initial = return~Matrix.identity()
                ,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 }

% Points are better drawn as oriended disks using \appendsurface
% \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:
}
