# Copyright 2023 DeepMind Technologies Limited
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Provides information about MuJoCo API structs.

DO NOT EDIT. THIS FILE IS AUTOMATICALLY GENERATED.
"""

from typing import Mapping

from .ast_nodes import AnonymousStructDecl
from .ast_nodes import AnonymousUnionDecl
from .ast_nodes import ArrayType
from .ast_nodes import PointerType
from .ast_nodes import StructDecl
from .ast_nodes import StructFieldDecl
from .ast_nodes import ValueType

STRUCTS: Mapping[str, StructDecl] = dict([
    ('mjLROpt',
     StructDecl(
         name='mjLROpt',
         declname='struct mjLROpt_',
         fields=(
             StructFieldDecl(
                 name='mode',
                 type=ValueType(name='int'),
                 doc='which actuators to process (mjtLRMode)',
             ),
             StructFieldDecl(
                 name='useexisting',
                 type=ValueType(name='int'),
                 doc='use existing length range if available',
             ),
             StructFieldDecl(
                 name='uselimit',
                 type=ValueType(name='int'),
                 doc='use joint and tendon limits if available',
             ),
             StructFieldDecl(
                 name='accel',
                 type=ValueType(name='mjtNum'),
                 doc='target acceleration used to compute force',
             ),
             StructFieldDecl(
                 name='maxforce',
                 type=ValueType(name='mjtNum'),
                 doc='maximum force; 0: no limit',
             ),
             StructFieldDecl(
                 name='timeconst',
                 type=ValueType(name='mjtNum'),
                 doc='time constant for velocity reduction; min 0.01',
             ),
             StructFieldDecl(
                 name='timestep',
                 type=ValueType(name='mjtNum'),
                 doc='simulation timestep; 0: use mjOption.timestep',
             ),
             StructFieldDecl(
                 name='inttotal',
                 type=ValueType(name='mjtNum'),
                 doc='total simulation time interval',
             ),
             StructFieldDecl(
                 name='interval',
                 type=ValueType(name='mjtNum'),
                 doc='evaluation time interval (at the end)',
             ),
             StructFieldDecl(
                 name='tolrange',
                 type=ValueType(name='mjtNum'),
                 doc='convergence tolerance (relative to range)',
             ),
         ),
     )),
    ('mjCache',
     StructDecl(
         name='mjCache',
         declname='struct mjCache_',
         fields=(
             StructFieldDecl(
                 name='impl_',
                 type=PointerType(
                     inner_type=ValueType(name='void'),
                 ),
                 doc='internal pointer to cache',
             ),
         ),
     )),
    ('mjVFS',
     StructDecl(
         name='mjVFS',
         declname='struct mjVFS_',
         fields=(
             StructFieldDecl(
                 name='impl_',
                 type=PointerType(
                     inner_type=ValueType(name='void'),
                 ),
                 doc='internal pointer to VFS memory',
             ),
         ),
     )),
    ('mjOption',
     StructDecl(
         name='mjOption',
         declname='struct mjOption_',
         fields=(
             StructFieldDecl(
                 name='timestep',
                 type=ValueType(name='mjtNum'),
                 doc='timestep',
             ),
             StructFieldDecl(
                 name='impratio',
                 type=ValueType(name='mjtNum'),
                 doc='ratio of friction-to-normal contact impedance',
             ),
             StructFieldDecl(
                 name='tolerance',
                 type=ValueType(name='mjtNum'),
                 doc='main solver tolerance',
             ),
             StructFieldDecl(
                 name='ls_tolerance',
                 type=ValueType(name='mjtNum'),
                 doc='CG/Newton linesearch tolerance',
             ),
             StructFieldDecl(
                 name='noslip_tolerance',
                 type=ValueType(name='mjtNum'),
                 doc='noslip solver tolerance',
             ),
             StructFieldDecl(
                 name='ccd_tolerance',
                 type=ValueType(name='mjtNum'),
                 doc='convex collision solver tolerance',
             ),
             StructFieldDecl(
                 name='sleep_tolerance',
                 type=ValueType(name='mjtNum'),
                 doc='sleep velocity tolerance',
             ),
             StructFieldDecl(
                 name='gravity',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(3,),
                 ),
                 doc='gravitational acceleration',
             ),
             StructFieldDecl(
                 name='wind',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(3,),
                 ),
                 doc='wind (for lift, drag and viscosity)',
             ),
             StructFieldDecl(
                 name='magnetic',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(3,),
                 ),
                 doc='global magnetic flux',
             ),
             StructFieldDecl(
                 name='density',
                 type=ValueType(name='mjtNum'),
                 doc='density of medium',
             ),
             StructFieldDecl(
                 name='viscosity',
                 type=ValueType(name='mjtNum'),
                 doc='viscosity of medium',
             ),
             StructFieldDecl(
                 name='o_margin',
                 type=ValueType(name='mjtNum'),
                 doc='margin',
             ),
             StructFieldDecl(
                 name='o_solref',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='solref',
             ),
             StructFieldDecl(
                 name='o_solimp',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='solimp',
             ),
             StructFieldDecl(
                 name='o_friction',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='friction',
             ),
             StructFieldDecl(
                 name='integrator',
                 type=ValueType(name='int'),
                 doc='integration mode (mjtIntegrator)',
             ),
             StructFieldDecl(
                 name='cone',
                 type=ValueType(name='int'),
                 doc='type of friction cone (mjtCone)',
             ),
             StructFieldDecl(
                 name='jacobian',
                 type=ValueType(name='int'),
                 doc='type of Jacobian (mjtJacobian)',
             ),
             StructFieldDecl(
                 name='solver',
                 type=ValueType(name='int'),
                 doc='solver algorithm (mjtSolver)',
             ),
             StructFieldDecl(
                 name='iterations',
                 type=ValueType(name='int'),
                 doc='maximum number of main solver iterations',
             ),
             StructFieldDecl(
                 name='ls_iterations',
                 type=ValueType(name='int'),
                 doc='maximum number of CG/Newton linesearch iterations',
             ),
             StructFieldDecl(
                 name='noslip_iterations',
                 type=ValueType(name='int'),
                 doc='maximum number of noslip solver iterations',
             ),
             StructFieldDecl(
                 name='ccd_iterations',
                 type=ValueType(name='int'),
                 doc='maximum number of convex collision solver iterations',
             ),
             StructFieldDecl(
                 name='disableflags',
                 type=ValueType(name='int'),
                 doc='bit flags for disabling standard features',
             ),
             StructFieldDecl(
                 name='enableflags',
                 type=ValueType(name='int'),
                 doc='bit flags for enabling optional features',
             ),
             StructFieldDecl(
                 name='disableactuator',
                 type=ValueType(name='int'),
                 doc='bit flags for disabling actuators by group id',
             ),
             StructFieldDecl(
                 name='sdf_initpoints',
                 type=ValueType(name='int'),
                 doc='number of starting points for gradient descent',
             ),
             StructFieldDecl(
                 name='sdf_iterations',
                 type=ValueType(name='int'),
                 doc='max number of iterations for gradient descent',
             ),
         ),
     )),
    ('mjVisual',
     StructDecl(
         name='mjVisual',
         declname='struct mjVisual_',
         fields=(
             StructFieldDecl(
                 name='global',
                 type=AnonymousStructDecl(
                     fields=(
                         StructFieldDecl(
                             name='cameraid',
                             type=ValueType(name='int'),
                             doc='initial camera id (-1: free)',
                         ),
                         StructFieldDecl(
                             name='orthographic',
                             type=ValueType(name='int'),
                             doc='is the free camera orthographic (0: no, 1: yes)',  # pylint: disable=line-too-long
                         ),
                         StructFieldDecl(
                             name='fovy',
                             type=ValueType(name='float'),
                             doc='y field-of-view of free camera (orthographic ? length : degree)',  # pylint: disable=line-too-long
                         ),
                         StructFieldDecl(
                             name='ipd',
                             type=ValueType(name='float'),
                             doc='inter-pupilary distance for free camera',
                         ),
                         StructFieldDecl(
                             name='azimuth',
                             type=ValueType(name='float'),
                             doc='initial azimuth of free camera (degrees)',
                         ),
                         StructFieldDecl(
                             name='elevation',
                             type=ValueType(name='float'),
                             doc='initial elevation of free camera (degrees)',
                         ),
                         StructFieldDecl(
                             name='linewidth',
                             type=ValueType(name='float'),
                             doc='line width for wireframe and ray rendering',
                         ),
                         StructFieldDecl(
                             name='glow',
                             type=ValueType(name='float'),
                             doc='glow coefficient for selected body',
                         ),
                         StructFieldDecl(
                             name='realtime',
                             type=ValueType(name='float'),
                             doc='initial real-time factor (1: real time)',
                         ),
                         StructFieldDecl(
                             name='offwidth',
                             type=ValueType(name='int'),
                             doc='width of offscreen buffer',
                         ),
                         StructFieldDecl(
                             name='offheight',
                             type=ValueType(name='int'),
                             doc='height of offscreen buffer',
                         ),
                         StructFieldDecl(
                             name='ellipsoidinertia',
                             type=ValueType(name='int'),
                             doc='geom for inertia visualization (0: box, 1: ellipsoid)',  # pylint: disable=line-too-long
                         ),
                         StructFieldDecl(
                             name='bvactive',
                             type=ValueType(name='int'),
                             doc='visualize active bounding volumes (0: no, 1: yes)',  # pylint: disable=line-too-long
                         ),
                     ),
                 ),
                 doc='',
             ),
             StructFieldDecl(
                 name='quality',
                 type=AnonymousStructDecl(
                     fields=(
                         StructFieldDecl(
                             name='shadowsize',
                             type=ValueType(name='int'),
                             doc='size of shadowmap texture',
                         ),
                         StructFieldDecl(
                             name='offsamples',
                             type=ValueType(name='int'),
                             doc='number of multisamples for offscreen rendering',  # pylint: disable=line-too-long
                         ),
                         StructFieldDecl(
                             name='numslices',
                             type=ValueType(name='int'),
                             doc='number of slices for builtin geom drawing',
                         ),
                         StructFieldDecl(
                             name='numstacks',
                             type=ValueType(name='int'),
                             doc='number of stacks for builtin geom drawing',
                         ),
                         StructFieldDecl(
                             name='numquads',
                             type=ValueType(name='int'),
                             doc='number of quads for box rendering',
                         ),
                     ),
                 ),
                 doc='',
             ),
             StructFieldDecl(
                 name='headlight',
                 type=AnonymousStructDecl(
                     fields=(
                         StructFieldDecl(
                             name='ambient',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(3,),
                             ),
                             doc='ambient rgb (alpha=1)',
                         ),
                         StructFieldDecl(
                             name='diffuse',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(3,),
                             ),
                             doc='diffuse rgb (alpha=1)',
                         ),
                         StructFieldDecl(
                             name='specular',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(3,),
                             ),
                             doc='specular rgb (alpha=1)',
                         ),
                         StructFieldDecl(
                             name='active',
                             type=ValueType(name='int'),
                             doc='is headlight active',
                         ),
                     ),
                 ),
                 doc='',
             ),
             StructFieldDecl(
                 name='map',
                 type=AnonymousStructDecl(
                     fields=(
                         StructFieldDecl(
                             name='stiffness',
                             type=ValueType(name='float'),
                             doc='mouse perturbation stiffness (space->force)',
                         ),
                         StructFieldDecl(
                             name='stiffnessrot',
                             type=ValueType(name='float'),
                             doc='mouse perturbation stiffness (space->torque)',
                         ),
                         StructFieldDecl(
                             name='force',
                             type=ValueType(name='float'),
                             doc='from force units to space units',
                         ),
                         StructFieldDecl(
                             name='torque',
                             type=ValueType(name='float'),
                             doc='from torque units to space units',
                         ),
                         StructFieldDecl(
                             name='alpha',
                             type=ValueType(name='float'),
                             doc='scale geom alphas when transparency is enabled',  # pylint: disable=line-too-long
                         ),
                         StructFieldDecl(
                             name='fogstart',
                             type=ValueType(name='float'),
                             doc='OpenGL fog starts at fogstart * mjModel.stat.extent',  # pylint: disable=line-too-long
                         ),
                         StructFieldDecl(
                             name='fogend',
                             type=ValueType(name='float'),
                             doc='OpenGL fog ends at fogend * mjModel.stat.extent',  # pylint: disable=line-too-long
                         ),
                         StructFieldDecl(
                             name='znear',
                             type=ValueType(name='float'),
                             doc='near clipping plane = znear * mjModel.stat.extent',  # pylint: disable=line-too-long
                         ),
                         StructFieldDecl(
                             name='zfar',
                             type=ValueType(name='float'),
                             doc='far clipping plane = zfar * mjModel.stat.extent',  # pylint: disable=line-too-long
                         ),
                         StructFieldDecl(
                             name='haze',
                             type=ValueType(name='float'),
                             doc='haze ratio',
                         ),
                         StructFieldDecl(
                             name='shadowclip',
                             type=ValueType(name='float'),
                             doc='directional light: shadowclip * mjModel.stat.extent',  # pylint: disable=line-too-long
                         ),
                         StructFieldDecl(
                             name='shadowscale',
                             type=ValueType(name='float'),
                             doc='spot light: shadowscale * light.cutoff',
                         ),
                         StructFieldDecl(
                             name='actuatortendon',
                             type=ValueType(name='float'),
                             doc='scale tendon width',
                         ),
                     ),
                 ),
                 doc='',
             ),
             StructFieldDecl(
                 name='scale',
                 type=AnonymousStructDecl(
                     fields=(
                         StructFieldDecl(
                             name='forcewidth',
                             type=ValueType(name='float'),
                             doc='width of force arrow',
                         ),
                         StructFieldDecl(
                             name='contactwidth',
                             type=ValueType(name='float'),
                             doc='contact width',
                         ),
                         StructFieldDecl(
                             name='contactheight',
                             type=ValueType(name='float'),
                             doc='contact height',
                         ),
                         StructFieldDecl(
                             name='connect',
                             type=ValueType(name='float'),
                             doc='autoconnect capsule width',
                         ),
                         StructFieldDecl(
                             name='com',
                             type=ValueType(name='float'),
                             doc='com radius',
                         ),
                         StructFieldDecl(
                             name='camera',
                             type=ValueType(name='float'),
                             doc='camera object',
                         ),
                         StructFieldDecl(
                             name='light',
                             type=ValueType(name='float'),
                             doc='light object',
                         ),
                         StructFieldDecl(
                             name='selectpoint',
                             type=ValueType(name='float'),
                             doc='selection point',
                         ),
                         StructFieldDecl(
                             name='jointlength',
                             type=ValueType(name='float'),
                             doc='joint length',
                         ),
                         StructFieldDecl(
                             name='jointwidth',
                             type=ValueType(name='float'),
                             doc='joint width',
                         ),
                         StructFieldDecl(
                             name='actuatorlength',
                             type=ValueType(name='float'),
                             doc='actuator length',
                         ),
                         StructFieldDecl(
                             name='actuatorwidth',
                             type=ValueType(name='float'),
                             doc='actuator width',
                         ),
                         StructFieldDecl(
                             name='framelength',
                             type=ValueType(name='float'),
                             doc='bodyframe axis length',
                         ),
                         StructFieldDecl(
                             name='framewidth',
                             type=ValueType(name='float'),
                             doc='bodyframe axis width',
                         ),
                         StructFieldDecl(
                             name='constraint',
                             type=ValueType(name='float'),
                             doc='constraint width',
                         ),
                         StructFieldDecl(
                             name='slidercrank',
                             type=ValueType(name='float'),
                             doc='slidercrank width',
                         ),
                         StructFieldDecl(
                             name='frustum',
                             type=ValueType(name='float'),
                             doc='frustum zfar plane',
                         ),
                     ),
                 ),
                 doc='',
             ),
             StructFieldDecl(
                 name='rgba',
                 type=AnonymousStructDecl(
                     fields=(
                         StructFieldDecl(
                             name='fog',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='fog',
                         ),
                         StructFieldDecl(
                             name='haze',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='haze',
                         ),
                         StructFieldDecl(
                             name='force',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='external force',
                         ),
                         StructFieldDecl(
                             name='inertia',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='inertia box',
                         ),
                         StructFieldDecl(
                             name='joint',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='joint',
                         ),
                         StructFieldDecl(
                             name='actuator',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='actuator, neutral',
                         ),
                         StructFieldDecl(
                             name='actuatornegative',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='actuator, negative limit',
                         ),
                         StructFieldDecl(
                             name='actuatorpositive',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='actuator, positive limit',
                         ),
                         StructFieldDecl(
                             name='com',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='center of mass',
                         ),
                         StructFieldDecl(
                             name='camera',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='camera object',
                         ),
                         StructFieldDecl(
                             name='light',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='light object',
                         ),
                         StructFieldDecl(
                             name='selectpoint',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='selection point',
                         ),
                         StructFieldDecl(
                             name='connect',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='auto connect',
                         ),
                         StructFieldDecl(
                             name='contactpoint',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='contact point',
                         ),
                         StructFieldDecl(
                             name='contactforce',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='contact force',
                         ),
                         StructFieldDecl(
                             name='contactfriction',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='contact friction force',
                         ),
                         StructFieldDecl(
                             name='contacttorque',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='contact torque',
                         ),
                         StructFieldDecl(
                             name='contactgap',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='contact point in gap',
                         ),
                         StructFieldDecl(
                             name='rangefinder',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='rangefinder ray',
                         ),
                         StructFieldDecl(
                             name='constraint',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='constraint',
                         ),
                         StructFieldDecl(
                             name='slidercrank',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='slidercrank',
                         ),
                         StructFieldDecl(
                             name='crankbroken',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='used when crank must be stretched/broken',
                         ),
                         StructFieldDecl(
                             name='frustum',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='camera frustum',
                         ),
                         StructFieldDecl(
                             name='bv',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='bounding volume',
                         ),
                         StructFieldDecl(
                             name='bvactive',
                             type=ArrayType(
                                 inner_type=ValueType(name='float'),
                                 extents=(4,),
                             ),
                             doc='active bounding volume',
                         ),
                     ),
                 ),
                 doc='',
             ),
         ),
     )),
    ('mjStatistic',
     StructDecl(
         name='mjStatistic',
         declname='struct mjStatistic_',
         fields=(
             StructFieldDecl(
                 name='meaninertia',
                 type=ValueType(name='mjtNum'),
                 doc='mean diagonal inertia',
             ),
             StructFieldDecl(
                 name='meanmass',
                 type=ValueType(name='mjtNum'),
                 doc='mean body mass',
             ),
             StructFieldDecl(
                 name='meansize',
                 type=ValueType(name='mjtNum'),
                 doc='mean body size',
             ),
             StructFieldDecl(
                 name='extent',
                 type=ValueType(name='mjtNum'),
                 doc='spatial extent',
             ),
             StructFieldDecl(
                 name='center',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(3,),
                 ),
                 doc='center of model',
             ),
         ),
     )),
    ('mjModel',
     StructDecl(
         name='mjModel',
         declname='struct mjModel_',
         fields=(
             StructFieldDecl(
                 name='nq',
                 type=ValueType(name='mjtSize'),
                 doc='number of generalized coordinates = dim(qpos)',
             ),
             StructFieldDecl(
                 name='nv',
                 type=ValueType(name='mjtSize'),
                 doc='number of degrees of freedom = dim(qvel)',
             ),
             StructFieldDecl(
                 name='nu',
                 type=ValueType(name='mjtSize'),
                 doc='number of actuators/controls = dim(ctrl)',
             ),
             StructFieldDecl(
                 name='na',
                 type=ValueType(name='mjtSize'),
                 doc='number of activation states = dim(act)',
             ),
             StructFieldDecl(
                 name='nbody',
                 type=ValueType(name='mjtSize'),
                 doc='number of bodies',
             ),
             StructFieldDecl(
                 name='nbvh',
                 type=ValueType(name='mjtSize'),
                 doc='number of total bounding volumes in all bodies',
             ),
             StructFieldDecl(
                 name='nbvhstatic',
                 type=ValueType(name='mjtSize'),
                 doc='number of static bounding volumes (aabb stored in mjModel)',  # pylint: disable=line-too-long
             ),
             StructFieldDecl(
                 name='nbvhdynamic',
                 type=ValueType(name='mjtSize'),
                 doc='number of dynamic bounding volumes (aabb stored in mjData)',  # pylint: disable=line-too-long
             ),
             StructFieldDecl(
                 name='noct',
                 type=ValueType(name='mjtSize'),
                 doc='number of total octree cells in all meshes',
             ),
             StructFieldDecl(
                 name='njnt',
                 type=ValueType(name='mjtSize'),
                 doc='number of joints',
             ),
             StructFieldDecl(
                 name='ntree',
                 type=ValueType(name='mjtSize'),
                 doc='number of kinematic trees under world body',
             ),
             StructFieldDecl(
                 name='nM',
                 type=ValueType(name='mjtSize'),
                 doc='number of non-zeros in sparse inertia matrix',
             ),
             StructFieldDecl(
                 name='nB',
                 type=ValueType(name='mjtSize'),
                 doc='number of non-zeros in sparse body-dof matrix',
             ),
             StructFieldDecl(
                 name='nC',
                 type=ValueType(name='mjtSize'),
                 doc='number of non-zeros in sparse reduced dof-dof matrix',
             ),
             StructFieldDecl(
                 name='nD',
                 type=ValueType(name='mjtSize'),
                 doc='number of non-zeros in sparse dof-dof matrix',
             ),
             StructFieldDecl(
                 name='ngeom',
                 type=ValueType(name='mjtSize'),
                 doc='number of geoms',
             ),
             StructFieldDecl(
                 name='nsite',
                 type=ValueType(name='mjtSize'),
                 doc='number of sites',
             ),
             StructFieldDecl(
                 name='ncam',
                 type=ValueType(name='mjtSize'),
                 doc='number of cameras',
             ),
             StructFieldDecl(
                 name='nlight',
                 type=ValueType(name='mjtSize'),
                 doc='number of lights',
             ),
             StructFieldDecl(
                 name='nflex',
                 type=ValueType(name='mjtSize'),
                 doc='number of flexes',
             ),
             StructFieldDecl(
                 name='nflexnode',
                 type=ValueType(name='mjtSize'),
                 doc='number of dofs in all flexes',
             ),
             StructFieldDecl(
                 name='nflexvert',
                 type=ValueType(name='mjtSize'),
                 doc='number of vertices in all flexes',
             ),
             StructFieldDecl(
                 name='nflexedge',
                 type=ValueType(name='mjtSize'),
                 doc='number of edges in all flexes',
             ),
             StructFieldDecl(
                 name='nflexelem',
                 type=ValueType(name='mjtSize'),
                 doc='number of elements in all flexes',
             ),
             StructFieldDecl(
                 name='nflexelemdata',
                 type=ValueType(name='mjtSize'),
                 doc='number of element vertex ids in all flexes',
             ),
             StructFieldDecl(
                 name='nflexelemedge',
                 type=ValueType(name='mjtSize'),
                 doc='number of element edge ids in all flexes',
             ),
             StructFieldDecl(
                 name='nflexshelldata',
                 type=ValueType(name='mjtSize'),
                 doc='number of shell fragment vertex ids in all flexes',
             ),
             StructFieldDecl(
                 name='nflexevpair',
                 type=ValueType(name='mjtSize'),
                 doc='number of element-vertex pairs in all flexes',
             ),
             StructFieldDecl(
                 name='nflextexcoord',
                 type=ValueType(name='mjtSize'),
                 doc='number of vertices with texture coordinates',
             ),
             StructFieldDecl(
                 name='nJfe',
                 type=ValueType(name='mjtSize'),
                 doc='number of non-zeros in sparse flexedge Jacobian matrix',
             ),
             StructFieldDecl(
                 name='nJfv',
                 type=ValueType(name='mjtSize'),
                 doc='number of non-zeros in sparse flexvert Jacobian matrix',
             ),
             StructFieldDecl(
                 name='nmesh',
                 type=ValueType(name='mjtSize'),
                 doc='number of meshes',
             ),
             StructFieldDecl(
                 name='nmeshvert',
                 type=ValueType(name='mjtSize'),
                 doc='number of vertices in all meshes',
             ),
             StructFieldDecl(
                 name='nmeshnormal',
                 type=ValueType(name='mjtSize'),
                 doc='number of normals in all meshes',
             ),
             StructFieldDecl(
                 name='nmeshtexcoord',
                 type=ValueType(name='mjtSize'),
                 doc='number of texcoords in all meshes',
             ),
             StructFieldDecl(
                 name='nmeshface',
                 type=ValueType(name='mjtSize'),
                 doc='number of triangular faces in all meshes',
             ),
             StructFieldDecl(
                 name='nmeshgraph',
                 type=ValueType(name='mjtSize'),
                 doc='number of ints in mesh auxiliary data',
             ),
             StructFieldDecl(
                 name='nmeshpoly',
                 type=ValueType(name='mjtSize'),
                 doc='number of polygons in all meshes',
             ),
             StructFieldDecl(
                 name='nmeshpolyvert',
                 type=ValueType(name='mjtSize'),
                 doc='number of vertices in all polygons',
             ),
             StructFieldDecl(
                 name='nmeshpolymap',
                 type=ValueType(name='mjtSize'),
                 doc='number of polygons in vertex map',
             ),
             StructFieldDecl(
                 name='nskin',
                 type=ValueType(name='mjtSize'),
                 doc='number of skins',
             ),
             StructFieldDecl(
                 name='nskinvert',
                 type=ValueType(name='mjtSize'),
                 doc='number of vertices in all skins',
             ),
             StructFieldDecl(
                 name='nskintexvert',
                 type=ValueType(name='mjtSize'),
                 doc='number of vertices with texcoords in all skins',
             ),
             StructFieldDecl(
                 name='nskinface',
                 type=ValueType(name='mjtSize'),
                 doc='number of triangular faces in all skins',
             ),
             StructFieldDecl(
                 name='nskinbone',
                 type=ValueType(name='mjtSize'),
                 doc='number of bones in all skins',
             ),
             StructFieldDecl(
                 name='nskinbonevert',
                 type=ValueType(name='mjtSize'),
                 doc='number of vertices in all skin bones',
             ),
             StructFieldDecl(
                 name='nhfield',
                 type=ValueType(name='mjtSize'),
                 doc='number of heightfields',
             ),
             StructFieldDecl(
                 name='nhfielddata',
                 type=ValueType(name='mjtSize'),
                 doc='number of data points in all heightfields',
             ),
             StructFieldDecl(
                 name='ntex',
                 type=ValueType(name='mjtSize'),
                 doc='number of textures',
             ),
             StructFieldDecl(
                 name='ntexdata',
                 type=ValueType(name='mjtSize'),
                 doc='number of bytes in texture rgb data',
             ),
             StructFieldDecl(
                 name='nmat',
                 type=ValueType(name='mjtSize'),
                 doc='number of materials',
             ),
             StructFieldDecl(
                 name='npair',
                 type=ValueType(name='mjtSize'),
                 doc='number of predefined geom pairs',
             ),
             StructFieldDecl(
                 name='nexclude',
                 type=ValueType(name='mjtSize'),
                 doc='number of excluded geom pairs',
             ),
             StructFieldDecl(
                 name='neq',
                 type=ValueType(name='mjtSize'),
                 doc='number of equality constraints',
             ),
             StructFieldDecl(
                 name='ntendon',
                 type=ValueType(name='mjtSize'),
                 doc='number of tendons',
             ),
             StructFieldDecl(
                 name='nwrap',
                 type=ValueType(name='mjtSize'),
                 doc='number of wrap objects in all tendon paths',
             ),
             StructFieldDecl(
                 name='nsensor',
                 type=ValueType(name='mjtSize'),
                 doc='number of sensors',
             ),
             StructFieldDecl(
                 name='nnumeric',
                 type=ValueType(name='mjtSize'),
                 doc='number of numeric custom fields',
             ),
             StructFieldDecl(
                 name='nnumericdata',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums in all numeric fields',
             ),
             StructFieldDecl(
                 name='ntext',
                 type=ValueType(name='mjtSize'),
                 doc='number of text custom fields',
             ),
             StructFieldDecl(
                 name='ntextdata',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtBytes in all text fields',
             ),
             StructFieldDecl(
                 name='ntuple',
                 type=ValueType(name='mjtSize'),
                 doc='number of tuple custom fields',
             ),
             StructFieldDecl(
                 name='ntupledata',
                 type=ValueType(name='mjtSize'),
                 doc='number of objects in all tuple fields',
             ),
             StructFieldDecl(
                 name='nkey',
                 type=ValueType(name='mjtSize'),
                 doc='number of keyframes',
             ),
             StructFieldDecl(
                 name='nmocap',
                 type=ValueType(name='mjtSize'),
                 doc='number of mocap bodies',
             ),
             StructFieldDecl(
                 name='nplugin',
                 type=ValueType(name='mjtSize'),
                 doc='number of plugin instances',
             ),
             StructFieldDecl(
                 name='npluginattr',
                 type=ValueType(name='mjtSize'),
                 doc='number of chars in all plugin config attributes',
             ),
             StructFieldDecl(
                 name='nuser_body',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums in body_user',
             ),
             StructFieldDecl(
                 name='nuser_jnt',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums in jnt_user',
             ),
             StructFieldDecl(
                 name='nuser_geom',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums in geom_user',
             ),
             StructFieldDecl(
                 name='nuser_site',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums in site_user',
             ),
             StructFieldDecl(
                 name='nuser_cam',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums in cam_user',
             ),
             StructFieldDecl(
                 name='nuser_tendon',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums in tendon_user',
             ),
             StructFieldDecl(
                 name='nuser_actuator',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums in actuator_user',
             ),
             StructFieldDecl(
                 name='nuser_sensor',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums in sensor_user',
             ),
             StructFieldDecl(
                 name='nnames',
                 type=ValueType(name='mjtSize'),
                 doc='number of chars in all names',
             ),
             StructFieldDecl(
                 name='npaths',
                 type=ValueType(name='mjtSize'),
                 doc='number of chars in all paths',
             ),
             StructFieldDecl(
                 name='nnames_map',
                 type=ValueType(name='mjtSize'),
                 doc='number of slots in the names hash map',
             ),
             StructFieldDecl(
                 name='nJmom',
                 type=ValueType(name='mjtSize'),
                 doc='number of non-zeros in sparse actuator_moment matrix',
             ),
             StructFieldDecl(
                 name='ngravcomp',
                 type=ValueType(name='mjtSize'),
                 doc='number of bodies with nonzero gravcomp',
             ),
             StructFieldDecl(
                 name='nemax',
                 type=ValueType(name='mjtSize'),
                 doc='number of potential equality-constraint rows',
             ),
             StructFieldDecl(
                 name='njmax',
                 type=ValueType(name='mjtSize'),
                 doc='number of available rows in constraint Jacobian (legacy)',
             ),
             StructFieldDecl(
                 name='nconmax',
                 type=ValueType(name='mjtSize'),
                 doc='number of potential contacts in contact list (legacy)',
             ),
             StructFieldDecl(
                 name='nuserdata',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums reserved for the user',
             ),
             StructFieldDecl(
                 name='nsensordata',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums in sensor data vector',
             ),
             StructFieldDecl(
                 name='npluginstate',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums in plugin state vector',
             ),
             StructFieldDecl(
                 name='nhistory',
                 type=ValueType(name='mjtSize'),
                 doc='number of mjtNums in history buffer',
             ),
             StructFieldDecl(
                 name='narena',
                 type=ValueType(name='mjtSize'),
                 doc='number of bytes in the mjData arena (inclusive of stack)',
             ),
             StructFieldDecl(
                 name='nbuffer',
                 type=ValueType(name='mjtSize'),
                 doc='number of bytes in buffer',
             ),
             StructFieldDecl(
                 name='opt',
                 type=ValueType(name='mjOption'),
                 doc='physics options',
             ),
             StructFieldDecl(
                 name='vis',
                 type=ValueType(name='mjVisual'),
                 doc='visualization options',
             ),
             StructFieldDecl(
                 name='stat',
                 type=ValueType(name='mjStatistic'),
                 doc='model statistics',
             ),
             StructFieldDecl(
                 name='buffer',
                 type=PointerType(
                     inner_type=ValueType(name='void'),
                 ),
                 doc='main buffer; all pointers point in it    (nbuffer)',
             ),
             StructFieldDecl(
                 name='qpos0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='qpos values at default pose',
                 array_extent=('nq',),
             ),
             StructFieldDecl(
                 name='qpos_spring',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='reference pose for springs',
                 array_extent=('nq',),
             ),
             StructFieldDecl(
                 name='body_parentid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="id of body's parent",
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_rootid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='ancestor that is direct child of world',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_weldid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='top ancestor with no dofs to this body',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_mocapid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='id of mocap data; -1: none',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_jntnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of joints for this body',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_jntadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='start addr of joints; -1: no joints',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_dofnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of motion degrees of freedom',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_dofadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='start addr of dofs; -1: no dofs',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_treeid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="id of body's kinematic tree; -1: static",
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_geomnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of geoms',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_geomadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='start addr of geoms; -1: no geoms',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_simple',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='1: diag M; 2: diag M, sliders only',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_sameframe',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='same frame as inertia (mjtSameframe)',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_pos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='position offset rel. to parent body',
                 array_extent=('nbody', 3),
             ),
             StructFieldDecl(
                 name='body_quat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='orientation offset rel. to parent body',
                 array_extent=('nbody', 4),
             ),
             StructFieldDecl(
                 name='body_ipos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='local position of center of mass',
                 array_extent=('nbody', 3),
             ),
             StructFieldDecl(
                 name='body_iquat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='local orientation of inertia ellipsoid',
                 array_extent=('nbody', 4),
             ),
             StructFieldDecl(
                 name='body_mass',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='mass',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_subtreemass',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='mass of subtree starting at this body',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_inertia',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='diagonal inertia in ipos/iquat frame',
                 array_extent=('nbody', 3),
             ),
             StructFieldDecl(
                 name='body_invweight0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='mean inv inert in qpos0 (trn, rot)',
                 array_extent=('nbody', 2),
             ),
             StructFieldDecl(
                 name='body_gravcomp',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='antigravity force, units of body weight',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_margin',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='MAX over all geom margins',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_user',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='user data',
                 array_extent=('nbody', 'nuser_body'),
             ),
             StructFieldDecl(
                 name='body_plugin',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='plugin instance id; -1: not in use',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_contype',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='OR over all geom contypes',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_conaffinity',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='OR over all geom conaffinities',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_bvhadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of bvh root',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_bvhnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of bounding volumes',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='bvh_depth',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='depth in the bounding volume hierarchy',
                 array_extent=('nbvh',),
             ),
             StructFieldDecl(
                 name='bvh_child',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='left and right children in tree',
                 array_extent=('nbvh', 2),
             ),
             StructFieldDecl(
                 name='bvh_nodeid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='geom or elem id of node; -1: non-leaf',
                 array_extent=('nbvh',),
             ),
             StructFieldDecl(
                 name='bvh_aabb',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='local bounding box (center, size)',
                 array_extent=('nbvhstatic', 6),
             ),
             StructFieldDecl(
                 name='oct_depth',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='depth in the octree',
                 array_extent=('noct',),
             ),
             StructFieldDecl(
                 name='oct_child',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='children of octree node',
                 array_extent=('noct', 8),
             ),
             StructFieldDecl(
                 name='oct_aabb',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='octree node bounding box (center, size)',
                 array_extent=('noct', 6),
             ),
             StructFieldDecl(
                 name='oct_coeff',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='octree interpolation coefficients',
                 array_extent=('noct', 8),
             ),
             StructFieldDecl(
                 name='jnt_type',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='type of joint (mjtJoint)',
                 array_extent=('njnt',),
             ),
             StructFieldDecl(
                 name='jnt_qposadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="start addr in 'qpos' for joint's data",
                 array_extent=('njnt',),
             ),
             StructFieldDecl(
                 name='jnt_dofadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="start addr in 'qvel' for joint's data",
                 array_extent=('njnt',),
             ),
             StructFieldDecl(
                 name='jnt_bodyid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="id of joint's body",
                 array_extent=('njnt',),
             ),
             StructFieldDecl(
                 name='jnt_group',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='group for visibility',
                 array_extent=('njnt',),
             ),
             StructFieldDecl(
                 name='jnt_limited',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='does joint have limits',
                 array_extent=('njnt',),
             ),
             StructFieldDecl(
                 name='jnt_actfrclimited',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='does joint have actuator force limits',
                 array_extent=('njnt',),
             ),
             StructFieldDecl(
                 name='jnt_actgravcomp',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='is gravcomp force applied via actuators',
                 array_extent=('njnt',),
             ),
             StructFieldDecl(
                 name='jnt_solref',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver reference: limit',
                 array_extent=('njnt', 'mjNREF'),
             ),
             StructFieldDecl(
                 name='jnt_solimp',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver impedance: limit',
                 array_extent=('njnt', 'mjNIMP'),
             ),
             StructFieldDecl(
                 name='jnt_pos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='local anchor position',
                 array_extent=('njnt', 3),
             ),
             StructFieldDecl(
                 name='jnt_axis',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='local joint axis',
                 array_extent=('njnt', 3),
             ),
             StructFieldDecl(
                 name='jnt_stiffness',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='stiffness coefficient',
                 array_extent=('njnt',),
             ),
             StructFieldDecl(
                 name='jnt_range',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='joint limits',
                 array_extent=('njnt', 2),
             ),
             StructFieldDecl(
                 name='jnt_actfrcrange',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='range of total actuator force',
                 array_extent=('njnt', 2),
             ),
             StructFieldDecl(
                 name='jnt_margin',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='min distance for limit detection',
                 array_extent=('njnt',),
             ),
             StructFieldDecl(
                 name='jnt_user',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='user data',
                 array_extent=('njnt', 'nuser_jnt'),
             ),
             StructFieldDecl(
                 name='dof_bodyid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="id of dof's body",
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='dof_jntid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="id of dof's joint",
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='dof_parentid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="id of dof's parent; -1: none",
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='dof_treeid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="id of dof's kinematic tree",
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='dof_Madr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='dof address in M-diagonal',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='dof_simplenum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of consecutive simple dofs',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='dof_solref',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver reference:frictionloss',
                 array_extent=('nv', 'mjNREF'),
             ),
             StructFieldDecl(
                 name='dof_solimp',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver impedance:frictionloss',
                 array_extent=('nv', 'mjNIMP'),
             ),
             StructFieldDecl(
                 name='dof_frictionloss',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='dof friction loss',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='dof_armature',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='dof armature inertia/mass',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='dof_damping',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='damping coefficient',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='dof_invweight0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='diag. inverse inertia in qpos0',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='dof_M0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='diag. inertia in qpos0',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='dof_length',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='linear: 1; angular: approx. length scale',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='tree_bodyadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='start addr of bodies',
                 array_extent=('ntree',),
             ),
             StructFieldDecl(
                 name='tree_bodynum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of bodies in tree',
                 array_extent=('ntree',),
             ),
             StructFieldDecl(
                 name='tree_dofadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='start addr of dofs',
                 array_extent=('ntree',),
             ),
             StructFieldDecl(
                 name='tree_dofnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of dofs in tree',
                 array_extent=('ntree',),
             ),
             StructFieldDecl(
                 name='tree_sleep_policy',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='sleep policy (mjtSleepPolicy)',
                 array_extent=('ntree',),
             ),
             StructFieldDecl(
                 name='geom_type',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='geometric type (mjtGeom)',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_contype',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='geom contact type',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_conaffinity',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='geom contact affinity',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_condim',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='contact dimensionality (1, 3, 4, 6)',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_bodyid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="id of geom's body",
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_dataid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="id of geom's mesh/hfield; -1: none",
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_matid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='material id for rendering; -1: none',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_group',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='group for visibility',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_priority',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='geom contact priority',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_plugin',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='plugin instance id; -1: not in use',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_sameframe',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='same frame as body (mjtSameframe)',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_solmix',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='mixing coef for solref/imp in geom pair',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_solref',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver reference: contact',
                 array_extent=('ngeom', 'mjNREF'),
             ),
             StructFieldDecl(
                 name='geom_solimp',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver impedance: contact',
                 array_extent=('ngeom', 'mjNIMP'),
             ),
             StructFieldDecl(
                 name='geom_size',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='geom-specific size parameters',
                 array_extent=('ngeom', 3),
             ),
             StructFieldDecl(
                 name='geom_aabb',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='bounding box, (center, size)',
                 array_extent=('ngeom', 6),
             ),
             StructFieldDecl(
                 name='geom_rbound',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='radius of bounding sphere',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_pos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='local position offset rel. to body',
                 array_extent=('ngeom', 3),
             ),
             StructFieldDecl(
                 name='geom_quat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='local orientation offset rel. to body',
                 array_extent=('ngeom', 4),
             ),
             StructFieldDecl(
                 name='geom_friction',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='friction for (slide, spin, roll)',
                 array_extent=('ngeom', 3),
             ),
             StructFieldDecl(
                 name='geom_margin',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='detect contact if dist<margin',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_gap',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='include in solver if dist<margin-gap',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='geom_fluid',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='fluid interaction parameters',
                 array_extent=('ngeom', 'mjNFLUID'),
             ),
             StructFieldDecl(
                 name='geom_user',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='user data',
                 array_extent=('ngeom', 'nuser_geom'),
             ),
             StructFieldDecl(
                 name='geom_rgba',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='rgba when material is omitted',
                 array_extent=('ngeom', 4),
             ),
             StructFieldDecl(
                 name='site_type',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='geom type for rendering (mjtGeom)',
                 array_extent=('nsite',),
             ),
             StructFieldDecl(
                 name='site_bodyid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="id of site's body",
                 array_extent=('nsite',),
             ),
             StructFieldDecl(
                 name='site_matid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='material id for rendering; -1: none',
                 array_extent=('nsite',),
             ),
             StructFieldDecl(
                 name='site_group',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='group for visibility',
                 array_extent=('nsite',),
             ),
             StructFieldDecl(
                 name='site_sameframe',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='same frame as body (mjtSameframe)',
                 array_extent=('nsite',),
             ),
             StructFieldDecl(
                 name='site_size',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='geom size for rendering',
                 array_extent=('nsite', 3),
             ),
             StructFieldDecl(
                 name='site_pos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='local position offset rel. to body',
                 array_extent=('nsite', 3),
             ),
             StructFieldDecl(
                 name='site_quat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='local orientation offset rel. to body',
                 array_extent=('nsite', 4),
             ),
             StructFieldDecl(
                 name='site_user',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='user data',
                 array_extent=('nsite', 'nuser_site'),
             ),
             StructFieldDecl(
                 name='site_rgba',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='rgba when material is omitted',
                 array_extent=('nsite', 4),
             ),
             StructFieldDecl(
                 name='cam_mode',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='camera tracking mode (mjtCamLight)',
                 array_extent=('ncam',),
             ),
             StructFieldDecl(
                 name='cam_bodyid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="id of camera's body",
                 array_extent=('ncam',),
             ),
             StructFieldDecl(
                 name='cam_targetbodyid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='id of targeted body; -1: none',
                 array_extent=('ncam',),
             ),
             StructFieldDecl(
                 name='cam_pos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='position rel. to body frame',
                 array_extent=('ncam', 3),
             ),
             StructFieldDecl(
                 name='cam_quat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='orientation rel. to body frame',
                 array_extent=('ncam', 4),
             ),
             StructFieldDecl(
                 name='cam_poscom0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='global position rel. to sub-com in qpos0',
                 array_extent=('ncam', 3),
             ),
             StructFieldDecl(
                 name='cam_pos0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='global position rel. to body in qpos0',
                 array_extent=('ncam', 3),
             ),
             StructFieldDecl(
                 name='cam_mat0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='global orientation in qpos0',
                 array_extent=('ncam', 9),
             ),
             StructFieldDecl(
                 name='cam_projection',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='projection type (mjtProjection)',
                 array_extent=('ncam',),
             ),
             StructFieldDecl(
                 name='cam_fovy',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='y field-of-view (ortho ? len : deg)',
                 array_extent=('ncam',),
             ),
             StructFieldDecl(
                 name='cam_ipd',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='inter-pupilary distance',
                 array_extent=('ncam',),
             ),
             StructFieldDecl(
                 name='cam_resolution',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='resolution: pixels [width, height]',
                 array_extent=('ncam', 2),
             ),
             StructFieldDecl(
                 name='cam_output',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='output types (mjtCamOut bit flags)',
                 array_extent=('ncam',),
             ),
             StructFieldDecl(
                 name='cam_sensorsize',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='sensor size: length [width, height]',
                 array_extent=('ncam', 2),
             ),
             StructFieldDecl(
                 name='cam_intrinsic',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='[focal length; principal point]',
                 array_extent=('ncam', 4),
             ),
             StructFieldDecl(
                 name='cam_user',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='user data',
                 array_extent=('ncam', 'nuser_cam'),
             ),
             StructFieldDecl(
                 name='light_mode',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='light tracking mode (mjtCamLight)',
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='light_bodyid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="id of light's body",
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='light_targetbodyid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='id of targeted body; -1: none',
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='light_type',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='spot, directional, etc. (mjtLightType)',
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='light_texid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='texture id for image lights',
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='light_castshadow',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='does light cast shadows',
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='light_bulbradius',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='light radius for soft shadows',
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='light_intensity',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='intensity, in candela',
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='light_range',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='range of effectiveness',
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='light_active',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='is light on',
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='light_pos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='position rel. to body frame',
                 array_extent=('nlight', 3),
             ),
             StructFieldDecl(
                 name='light_dir',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='direction rel. to body frame',
                 array_extent=('nlight', 3),
             ),
             StructFieldDecl(
                 name='light_poscom0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='global position rel. to sub-com in qpos0',
                 array_extent=('nlight', 3),
             ),
             StructFieldDecl(
                 name='light_pos0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='global position rel. to body in qpos0',
                 array_extent=('nlight', 3),
             ),
             StructFieldDecl(
                 name='light_dir0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='global direction in qpos0',
                 array_extent=('nlight', 3),
             ),
             StructFieldDecl(
                 name='light_attenuation',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='OpenGL attenuation (quadratic model)',
                 array_extent=('nlight', 3),
             ),
             StructFieldDecl(
                 name='light_cutoff',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='OpenGL cutoff',
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='light_exponent',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='OpenGL exponent',
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='light_ambient',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='ambient rgb (alpha=1)',
                 array_extent=('nlight', 3),
             ),
             StructFieldDecl(
                 name='light_diffuse',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='diffuse rgb (alpha=1)',
                 array_extent=('nlight', 3),
             ),
             StructFieldDecl(
                 name='light_specular',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='specular rgb (alpha=1)',
                 array_extent=('nlight', 3),
             ),
             StructFieldDecl(
                 name='flex_contype',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='flex contact type',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_conaffinity',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='flex contact affinity',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_condim',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='contact dimensionality (1, 3, 4, 6)',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_priority',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='flex contact priority',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_solmix',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='mix coef for solref/imp in contact pair',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_solref',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver reference: contact',
                 array_extent=('nflex', 'mjNREF'),
             ),
             StructFieldDecl(
                 name='flex_solimp',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver impedance: contact',
                 array_extent=('nflex', 'mjNIMP'),
             ),
             StructFieldDecl(
                 name='flex_friction',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='friction for (slide, spin, roll)',
                 array_extent=('nflex', 3),
             ),
             StructFieldDecl(
                 name='flex_margin',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='detect contact if dist<margin',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_gap',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='include in solver if dist<margin-gap',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_internal',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='internal flex collision enabled',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_selfcollide',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='self collision mode (mjtFlexSelf)',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_activelayers',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of active element layers, 3D only',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_passive',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='passive collisions enabled',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_dim',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='1: lines, 2: triangles, 3: tetrahedra',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_matid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='material id for rendering',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_group',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='group for visibility',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_interp',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='interpolation (0: vertex, 1: nodes)',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_nodeadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first node address',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_nodenum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of nodes',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_vertadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first vertex address',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_vertnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of vertices',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_edgeadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first edge address',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_edgenum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of edges',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_elemadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first element address',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_elemnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of elements',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_elemdataadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first element vertex id address',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_elemedgeadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first element edge id address',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_shellnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of shells',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_shelldataadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first shell data address',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_evpairadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first evpair address',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_evpairnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of evpairs',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_texcoordadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address in flex_texcoord; -1: none',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_nodebodyid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='node body ids',
                 array_extent=('nflexnode',),
             ),
             StructFieldDecl(
                 name='flex_vertbodyid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='vertex body ids',
                 array_extent=('nflexvert',),
             ),
             StructFieldDecl(
                 name='flex_vertedgeadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first edge address',
                 array_extent=('nflexvert',),
             ),
             StructFieldDecl(
                 name='flex_vertedgenum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of edges',
                 array_extent=('nflexvert',),
             ),
             StructFieldDecl(
                 name='flex_vertedge',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='edge indices',
                 array_extent=('nflexedge', 2),
             ),
             StructFieldDecl(
                 name='flex_edge',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='edge vertex ids (2 per edge)',
                 array_extent=('nflexedge', 2),
             ),
             StructFieldDecl(
                 name='flex_edgeflap',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='adjacent vertex ids (dim=2 only)',
                 array_extent=('nflexedge', 2),
             ),
             StructFieldDecl(
                 name='flex_elem',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='element vertex ids (dim+1 per elem)',
                 array_extent=('nflexelemdata',),
             ),
             StructFieldDecl(
                 name='flex_elemtexcoord',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='element texture coordinates (dim+1)',
                 array_extent=('nflexelemdata',),
             ),
             StructFieldDecl(
                 name='flex_elemedge',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='element edge ids',
                 array_extent=('nflexelemedge',),
             ),
             StructFieldDecl(
                 name='flex_elemlayer',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='element distance from surface, 3D only',
                 array_extent=('nflexelem',),
             ),
             StructFieldDecl(
                 name='flex_shell',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='shell fragment vertex ids (dim per frag)',
                 array_extent=('nflexshelldata',),
             ),
             StructFieldDecl(
                 name='flex_evpair',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='(element, vertex) collision pairs',
                 array_extent=('nflexevpair', 2),
             ),
             StructFieldDecl(
                 name='flex_vert',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='vertex positions in local body frames',
                 array_extent=('nflexvert', 3),
             ),
             StructFieldDecl(
                 name='flex_vert0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='vertex positions in qpos0 on [0, 1]^d',
                 array_extent=('nflexvert', 3),
             ),
             StructFieldDecl(
                 name='flex_vertmetric',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='inverse of reference shape matrix',
                 array_extent=('nflexvert', 4),
             ),
             StructFieldDecl(
                 name='flex_node',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='node positions in local body frames',
                 array_extent=('nflexnode', 3),
             ),
             StructFieldDecl(
                 name='flex_node0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian node positions in qpos0',
                 array_extent=('nflexnode', 3),
             ),
             StructFieldDecl(
                 name='flexedge_length0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='edge lengths in qpos0',
                 array_extent=('nflexedge',),
             ),
             StructFieldDecl(
                 name='flexedge_invweight0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='edge inv. weight in qpos0',
                 array_extent=('nflexedge',),
             ),
             StructFieldDecl(
                 name='flex_radius',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='radius around primitive element',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_size',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='vertex bounding box half sizes in qpos0',
                 array_extent=('nflex', 3),
             ),
             StructFieldDecl(
                 name='flex_stiffness',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='finite element stiffness matrix',
                 array_extent=('nflexelem', 21),
             ),
             StructFieldDecl(
                 name='flex_bending',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='bending stiffness',
                 array_extent=('nflexedge', 17),
             ),
             StructFieldDecl(
                 name='flex_damping',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc="Rayleigh's damping coefficient",
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_edgestiffness',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='edge stiffness',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_edgedamping',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='edge damping',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_edgeequality',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='0: none, 1: edges, 2: vertices',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_rigid',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='are all vertices in the same body',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flexedge_rigid',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='are both edge vertices in same body',
                 array_extent=('nflexedge',),
             ),
             StructFieldDecl(
                 name='flex_centered',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='are all vertex coordinates (0,0,0)',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_flatskin',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='render flex skin with flat shading',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_bvhadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of bvh root; -1: no bvh',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flex_bvhnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of bounding volumes',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='flexedge_J_rownnz',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of non-zeros in Jacobian row',
                 array_extent=('nflexedge',),
             ),
             StructFieldDecl(
                 name='flexedge_J_rowadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='row start address in colind array',
                 array_extent=('nflexedge',),
             ),
             StructFieldDecl(
                 name='flexedge_J_colind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='column indices in sparse Jacobian',
                 array_extent=('nJfe',),
             ),
             StructFieldDecl(
                 name='flexvert_J_rownnz',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of non-zeros in Jacobian row',
                 array_extent=('nflexvert', 2),
             ),
             StructFieldDecl(
                 name='flexvert_J_rowadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='row start address in colind array',
                 array_extent=('nflexvert', 2),
             ),
             StructFieldDecl(
                 name='flexvert_J_colind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='column indices in sparse Jacobian',
                 array_extent=('nJfv', 2),
             ),
             StructFieldDecl(
                 name='flex_rgba',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='rgba when material is omitted',
                 array_extent=('nflex', 4),
             ),
             StructFieldDecl(
                 name='flex_texcoord',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='vertex texture coordinates',
                 array_extent=('nflextexcoord', 2),
             ),
             StructFieldDecl(
                 name='mesh_vertadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first vertex address',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_vertnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of vertices',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_faceadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first face address',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_facenum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of faces',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_bvhadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of bvh root',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_bvhnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of bvh',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_octadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of octree root',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_octnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of octree nodes',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_normaladr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first normal address',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_normalnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of normals',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_texcoordadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='texcoord data address; -1: no texcoord',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_texcoordnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of texcoord',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_graphadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='graph data address; -1: no graph',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_vert',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='vertex positions for all meshes',
                 array_extent=('nmeshvert', 3),
             ),
             StructFieldDecl(
                 name='mesh_normal',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='normals for all meshes',
                 array_extent=('nmeshnormal', 3),
             ),
             StructFieldDecl(
                 name='mesh_texcoord',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='vertex texcoords for all meshes',
                 array_extent=('nmeshtexcoord', 2),
             ),
             StructFieldDecl(
                 name='mesh_face',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='vertex face data',
                 array_extent=('nmeshface', 3),
             ),
             StructFieldDecl(
                 name='mesh_facenormal',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='normal face data',
                 array_extent=('nmeshface', 3),
             ),
             StructFieldDecl(
                 name='mesh_facetexcoord',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='texture face data',
                 array_extent=('nmeshface', 3),
             ),
             StructFieldDecl(
                 name='mesh_graph',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='convex graph data',
                 array_extent=('nmeshgraph',),
             ),
             StructFieldDecl(
                 name='mesh_scale',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='scaling applied to asset vertices',
                 array_extent=('nmesh', 3),
             ),
             StructFieldDecl(
                 name='mesh_pos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='translation applied to asset vertices',
                 array_extent=('nmesh', 3),
             ),
             StructFieldDecl(
                 name='mesh_quat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='rotation applied to asset vertices',
                 array_extent=('nmesh', 4),
             ),
             StructFieldDecl(
                 name='mesh_pathadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of asset path for mesh; -1: none',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_polynum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of polygons per mesh',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_polyadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first polygon address per mesh',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='mesh_polynormal',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='all polygon normals',
                 array_extent=('nmeshpoly', 3),
             ),
             StructFieldDecl(
                 name='mesh_polyvertadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='polygon vertex start address',
                 array_extent=('nmeshpoly',),
             ),
             StructFieldDecl(
                 name='mesh_polyvertnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of vertices per polygon',
                 array_extent=('nmeshpoly',),
             ),
             StructFieldDecl(
                 name='mesh_polyvert',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='all polygon vertices',
                 array_extent=('nmeshpolyvert',),
             ),
             StructFieldDecl(
                 name='mesh_polymapadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first polygon address per vertex',
                 array_extent=('nmeshvert',),
             ),
             StructFieldDecl(
                 name='mesh_polymapnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of polygons per vertex',
                 array_extent=('nmeshvert',),
             ),
             StructFieldDecl(
                 name='mesh_polymap',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='vertex to polygon map',
                 array_extent=('nmeshpolymap',),
             ),
             StructFieldDecl(
                 name='skin_matid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='skin material id; -1: none',
                 array_extent=('nskin',),
             ),
             StructFieldDecl(
                 name='skin_group',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='group for visibility',
                 array_extent=('nskin',),
             ),
             StructFieldDecl(
                 name='skin_rgba',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='skin rgba',
                 array_extent=('nskin', 4),
             ),
             StructFieldDecl(
                 name='skin_inflate',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='inflate skin in normal direction',
                 array_extent=('nskin',),
             ),
             StructFieldDecl(
                 name='skin_vertadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first vertex address',
                 array_extent=('nskin',),
             ),
             StructFieldDecl(
                 name='skin_vertnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of vertices',
                 array_extent=('nskin',),
             ),
             StructFieldDecl(
                 name='skin_texcoordadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='texcoord data address; -1: no texcoord',
                 array_extent=('nskin',),
             ),
             StructFieldDecl(
                 name='skin_faceadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first face address',
                 array_extent=('nskin',),
             ),
             StructFieldDecl(
                 name='skin_facenum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of faces',
                 array_extent=('nskin',),
             ),
             StructFieldDecl(
                 name='skin_boneadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first bone in skin',
                 array_extent=('nskin',),
             ),
             StructFieldDecl(
                 name='skin_bonenum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of bones in skin',
                 array_extent=('nskin',),
             ),
             StructFieldDecl(
                 name='skin_vert',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='vertex positions for all skin meshes',
                 array_extent=('nskinvert', 3),
             ),
             StructFieldDecl(
                 name='skin_texcoord',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='vertex texcoords for all skin meshes',
                 array_extent=('nskintexvert', 2),
             ),
             StructFieldDecl(
                 name='skin_face',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='triangle faces for all skin meshes',
                 array_extent=('nskinface', 3),
             ),
             StructFieldDecl(
                 name='skin_bonevertadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first vertex in each bone',
                 array_extent=('nskinbone',),
             ),
             StructFieldDecl(
                 name='skin_bonevertnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of vertices in each bone',
                 array_extent=('nskinbone',),
             ),
             StructFieldDecl(
                 name='skin_bonebindpos',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='bind pos of each bone',
                 array_extent=('nskinbone', 3),
             ),
             StructFieldDecl(
                 name='skin_bonebindquat',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='bind quat of each bone',
                 array_extent=('nskinbone', 4),
             ),
             StructFieldDecl(
                 name='skin_bonebodyid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='body id of each bone',
                 array_extent=('nskinbone',),
             ),
             StructFieldDecl(
                 name='skin_bonevertid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='mesh ids of vertices in each bone',
                 array_extent=('nskinbonevert',),
             ),
             StructFieldDecl(
                 name='skin_bonevertweight',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='weights of vertices in each bone',
                 array_extent=('nskinbonevert',),
             ),
             StructFieldDecl(
                 name='skin_pathadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of asset path for skin; -1: none',
                 array_extent=('nskin',),
             ),
             StructFieldDecl(
                 name='hfield_size',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='(x, y, z_top, z_bottom)',
                 array_extent=('nhfield', 4),
             ),
             StructFieldDecl(
                 name='hfield_nrow',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of rows in grid',
                 array_extent=('nhfield',),
             ),
             StructFieldDecl(
                 name='hfield_ncol',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of columns in grid',
                 array_extent=('nhfield',),
             ),
             StructFieldDecl(
                 name='hfield_adr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address in hfield_data',
                 array_extent=('nhfield',),
             ),
             StructFieldDecl(
                 name='hfield_data',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='elevation data',
                 array_extent=('nhfielddata',),
             ),
             StructFieldDecl(
                 name='hfield_pathadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of hfield asset path; -1: none',
                 array_extent=('nhfield',),
             ),
             StructFieldDecl(
                 name='tex_type',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='texture type (mjtTexture)',
                 array_extent=('ntex',),
             ),
             StructFieldDecl(
                 name='tex_colorspace',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='texture colorspace (mjtColorSpace)',
                 array_extent=('ntex',),
             ),
             StructFieldDecl(
                 name='tex_height',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of rows in texture image',
                 array_extent=('ntex',),
             ),
             StructFieldDecl(
                 name='tex_width',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of columns in texture image',
                 array_extent=('ntex',),
             ),
             StructFieldDecl(
                 name='tex_nchannel',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of channels in texture image',
                 array_extent=('ntex',),
             ),
             StructFieldDecl(
                 name='tex_adr',
                 type=PointerType(
                     inner_type=ValueType(name='mjtSize'),
                 ),
                 doc='start address in tex_data',
                 array_extent=('ntex',),
             ),
             StructFieldDecl(
                 name='tex_data',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='pixel values',
                 array_extent=('ntexdata',),
             ),
             StructFieldDecl(
                 name='tex_pathadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of texture asset path; -1: none',
                 array_extent=('ntex',),
             ),
             StructFieldDecl(
                 name='mat_texid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='indices of textures; -1: none',
                 array_extent=('nmat', 'mjNTEXROLE'),
             ),
             StructFieldDecl(
                 name='mat_texuniform',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='make texture cube uniform',
                 array_extent=('nmat',),
             ),
             StructFieldDecl(
                 name='mat_texrepeat',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='texture repetition for 2d mapping',
                 array_extent=('nmat', 2),
             ),
             StructFieldDecl(
                 name='mat_emission',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='emission (x rgb)',
                 array_extent=('nmat',),
             ),
             StructFieldDecl(
                 name='mat_specular',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='specular (x white)',
                 array_extent=('nmat',),
             ),
             StructFieldDecl(
                 name='mat_shininess',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='shininess coef',
                 array_extent=('nmat',),
             ),
             StructFieldDecl(
                 name='mat_reflectance',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='reflectance (0: disable)',
                 array_extent=('nmat',),
             ),
             StructFieldDecl(
                 name='mat_metallic',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='metallic coef',
                 array_extent=('nmat',),
             ),
             StructFieldDecl(
                 name='mat_roughness',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='roughness coef',
                 array_extent=('nmat',),
             ),
             StructFieldDecl(
                 name='mat_rgba',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='rgba',
                 array_extent=('nmat', 4),
             ),
             StructFieldDecl(
                 name='pair_dim',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='contact dimensionality',
                 array_extent=('npair',),
             ),
             StructFieldDecl(
                 name='pair_geom1',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='id of geom1',
                 array_extent=('npair',),
             ),
             StructFieldDecl(
                 name='pair_geom2',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='id of geom2',
                 array_extent=('npair',),
             ),
             StructFieldDecl(
                 name='pair_signature',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='body1 << 16 + body2',
                 array_extent=('npair',),
             ),
             StructFieldDecl(
                 name='pair_solref',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='solver reference: contact normal',
                 array_extent=('npair', 'mjNREF'),
             ),
             StructFieldDecl(
                 name='pair_solreffriction',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='solver reference: contact friction',
                 array_extent=('npair', 'mjNREF'),
             ),
             StructFieldDecl(
                 name='pair_solimp',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='solver impedance: contact',
                 array_extent=('npair', 'mjNIMP'),
             ),
             StructFieldDecl(
                 name='pair_margin',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='detect contact if dist<margin',
                 array_extent=('npair',),
             ),
             StructFieldDecl(
                 name='pair_gap',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='include in solver if dist<margin-gap',
                 array_extent=('npair',),
             ),
             StructFieldDecl(
                 name='pair_friction',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='tangent1, 2, spin, roll1, 2',
                 array_extent=('npair', 5),
             ),
             StructFieldDecl(
                 name='exclude_signature',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='body1 << 16 + body2',
                 array_extent=('nexclude',),
             ),
             StructFieldDecl(
                 name='eq_type',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='constraint type (mjtEq)',
                 array_extent=('neq',),
             ),
             StructFieldDecl(
                 name='eq_obj1id',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='id of object 1',
                 array_extent=('neq',),
             ),
             StructFieldDecl(
                 name='eq_obj2id',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='id of object 2',
                 array_extent=('neq',),
             ),
             StructFieldDecl(
                 name='eq_objtype',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='type of both objects (mjtObj)',
                 array_extent=('neq',),
             ),
             StructFieldDecl(
                 name='eq_active0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='initial enable/disable constraint state',
                 array_extent=('neq',),
             ),
             StructFieldDecl(
                 name='eq_solref',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver reference',
                 array_extent=('neq', 'mjNREF'),
             ),
             StructFieldDecl(
                 name='eq_solimp',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver impedance',
                 array_extent=('neq', 'mjNIMP'),
             ),
             StructFieldDecl(
                 name='eq_data',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='numeric data for constraint',
                 array_extent=('neq', 'mjNEQDATA'),
             ),
             StructFieldDecl(
                 name='tendon_adr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="address of first object in tendon's path",
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_num',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="number of objects in tendon's path",
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_matid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='material id for rendering',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_group',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='group for visibility',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_treenum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="number of trees along tendon's path",
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_treeid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="first two trees along tendon's path",
                 array_extent=('ntendon', 2),
             ),
             StructFieldDecl(
                 name='tendon_limited',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='does tendon have length limits',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_actfrclimited',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='does tendon have actuator force limits',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_width',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='width for rendering',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_solref_lim',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver reference: limit',
                 array_extent=('ntendon', 'mjNREF'),
             ),
             StructFieldDecl(
                 name='tendon_solimp_lim',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver impedance: limit',
                 array_extent=('ntendon', 'mjNIMP'),
             ),
             StructFieldDecl(
                 name='tendon_solref_fri',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver reference: friction',
                 array_extent=('ntendon', 'mjNREF'),
             ),
             StructFieldDecl(
                 name='tendon_solimp_fri',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint solver impedance: friction',
                 array_extent=('ntendon', 'mjNIMP'),
             ),
             StructFieldDecl(
                 name='tendon_range',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='tendon length limits',
                 array_extent=('ntendon', 2),
             ),
             StructFieldDecl(
                 name='tendon_actfrcrange',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='range of total actuator force',
                 array_extent=('ntendon', 2),
             ),
             StructFieldDecl(
                 name='tendon_margin',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='min distance for limit detection',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_stiffness',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='stiffness coefficient',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_damping',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='damping coefficient',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_armature',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='inertia associated with tendon velocity',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_frictionloss',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='loss due to friction',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_lengthspring',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='spring resting length range',
                 array_extent=('ntendon', 2),
             ),
             StructFieldDecl(
                 name='tendon_length0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='tendon length in qpos0',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_invweight0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='inv. weight in qpos0',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tendon_user',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='user data',
                 array_extent=('ntendon', 'nuser_tendon'),
             ),
             StructFieldDecl(
                 name='tendon_rgba',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='rgba when material is omitted',
                 array_extent=('ntendon', 4),
             ),
             StructFieldDecl(
                 name='wrap_type',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='wrap object type (mjtWrap)',
                 array_extent=('nwrap',),
             ),
             StructFieldDecl(
                 name='wrap_objid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='object id: geom, site, joint',
                 array_extent=('nwrap',),
             ),
             StructFieldDecl(
                 name='wrap_prm',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='divisor, joint coef, or site id',
                 array_extent=('nwrap',),
             ),
             StructFieldDecl(
                 name='actuator_trntype',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='transmission type (mjtTrn)',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_dyntype',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='dynamics type (mjtDyn)',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_gaintype',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='gain type (mjtGain)',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_biastype',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='bias type (mjtBias)',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_trnid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='transmission id: joint, tendon, site',
                 array_extent=('nu', 2),
             ),
             StructFieldDecl(
                 name='actuator_actadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first activation address; -1: stateless',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_actnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of activation variables',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_group',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='group for visibility',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_history',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='history buffer: [nsample, interp]',
                 array_extent=('nu', 2),
             ),
             StructFieldDecl(
                 name='actuator_historyadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address in history buffer; -1: none',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_delay',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='delay time in seconds; 0: no delay',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_ctrllimited',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='is control limited',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_forcelimited',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='is force limited',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_actlimited',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='is activation limited',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_dynprm',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='dynamics parameters',
                 array_extent=('nu', 'mjNDYN'),
             ),
             StructFieldDecl(
                 name='actuator_gainprm',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='gain parameters',
                 array_extent=('nu', 'mjNGAIN'),
             ),
             StructFieldDecl(
                 name='actuator_biasprm',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='bias parameters',
                 array_extent=('nu', 'mjNBIAS'),
             ),
             StructFieldDecl(
                 name='actuator_actearly',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='step activation before force',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_ctrlrange',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='range of controls',
                 array_extent=('nu', 2),
             ),
             StructFieldDecl(
                 name='actuator_forcerange',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='range of forces',
                 array_extent=('nu', 2),
             ),
             StructFieldDecl(
                 name='actuator_actrange',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='range of activations',
                 array_extent=('nu', 2),
             ),
             StructFieldDecl(
                 name='actuator_gear',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='scale length and transmitted force',
                 array_extent=('nu', 6),
             ),
             StructFieldDecl(
                 name='actuator_cranklength',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='crank length for slider-crank',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_acc0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='acceleration from unit force in qpos0',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_length0',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='actuator length in qpos0',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='actuator_lengthrange',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='feasible actuator length range',
                 array_extent=('nu', 2),
             ),
             StructFieldDecl(
                 name='actuator_user',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='user data',
                 array_extent=('nu', 'nuser_actuator'),
             ),
             StructFieldDecl(
                 name='actuator_plugin',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='plugin instance id; -1: not a plugin',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='sensor_type',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='sensor type (mjtSensor)',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_datatype',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='numeric data type (mjtDataType)',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_needstage',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='required compute stage (mjtStage)',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_objtype',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='type of sensorized object (mjtObj)',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_objid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='id of sensorized object',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_reftype',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='type of reference frame (mjtObj)',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_refid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='id of reference frame; -1: global frame',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_intprm',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='sensor parameters',
                 array_extent=('nsensor', 'mjNSENS'),
             ),
             StructFieldDecl(
                 name='sensor_dim',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of scalar outputs',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_adr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address in sensor array',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_cutoff',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='cutoff for real and positive; 0: ignore',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_noise',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='noise standard deviation',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_history',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='history buffer: [nsample, interp]',
                 array_extent=('nsensor', 2),
             ),
             StructFieldDecl(
                 name='sensor_historyadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address in history buffer; -1: none',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_delay',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='delay time in seconds; 0: no delay',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='sensor_interval',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='interval: [period, phase] in seconds',
                 array_extent=('nsensor', 2),
             ),
             StructFieldDecl(
                 name='sensor_user',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='user data',
                 array_extent=('nsensor', 'nuser_sensor'),
             ),
             StructFieldDecl(
                 name='sensor_plugin',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='plugin instance id; -1: not a plugin',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='plugin',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='globally registered plugin slot number',
                 array_extent=('nplugin',),
             ),
             StructFieldDecl(
                 name='plugin_stateadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address in the plugin state array',
                 array_extent=('nplugin',),
             ),
             StructFieldDecl(
                 name='plugin_statenum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of states in the plugin instance',
                 array_extent=('nplugin',),
             ),
             StructFieldDecl(
                 name='plugin_attr',
                 type=PointerType(
                     inner_type=ValueType(name='char'),
                 ),
                 doc='config attributes of plugin instances',
                 array_extent=('npluginattr',),
             ),
             StructFieldDecl(
                 name='plugin_attradr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="address to each instance's config attrib",
                 array_extent=('nplugin',),
             ),
             StructFieldDecl(
                 name='numeric_adr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of field in numeric_data',
                 array_extent=('nnumeric',),
             ),
             StructFieldDecl(
                 name='numeric_size',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='size of numeric field',
                 array_extent=('nnumeric',),
             ),
             StructFieldDecl(
                 name='numeric_data',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='array of all numeric fields',
                 array_extent=('nnumericdata',),
             ),
             StructFieldDecl(
                 name='text_adr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of text in text_data',
                 array_extent=('ntext',),
             ),
             StructFieldDecl(
                 name='text_size',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='size of text field (strlen+1)',
                 array_extent=('ntext',),
             ),
             StructFieldDecl(
                 name='text_data',
                 type=PointerType(
                     inner_type=ValueType(name='char'),
                 ),
                 doc='array of all text fields (0-terminated)',
                 array_extent=('ntextdata',),
             ),
             StructFieldDecl(
                 name='tuple_adr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of text in text_data',
                 array_extent=('ntuple',),
             ),
             StructFieldDecl(
                 name='tuple_size',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of objects in tuple',
                 array_extent=('ntuple',),
             ),
             StructFieldDecl(
                 name='tuple_objtype',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='array of object types in all tuples',
                 array_extent=('ntupledata',),
             ),
             StructFieldDecl(
                 name='tuple_objid',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='array of object ids in all tuples',
                 array_extent=('ntupledata',),
             ),
             StructFieldDecl(
                 name='tuple_objprm',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='array of object params in all tuples',
                 array_extent=('ntupledata',),
             ),
             StructFieldDecl(
                 name='key_time',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='key time',
                 array_extent=('nkey',),
             ),
             StructFieldDecl(
                 name='key_qpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='key position',
                 array_extent=('nkey', 'nq'),
             ),
             StructFieldDecl(
                 name='key_qvel',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='key velocity',
                 array_extent=('nkey', 'nv'),
             ),
             StructFieldDecl(
                 name='key_act',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='key activation',
                 array_extent=('nkey', 'na'),
             ),
             StructFieldDecl(
                 name='key_mpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='key mocap position',
                 array_extent=('nkey', 'nmocap*3'),
             ),
             StructFieldDecl(
                 name='key_mquat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='key mocap quaternion',
                 array_extent=('nkey', 'nmocap*4'),
             ),
             StructFieldDecl(
                 name='key_ctrl',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='key control',
                 array_extent=('nkey', 'nu'),
             ),
             StructFieldDecl(
                 name='name_bodyadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='body name pointers',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='name_jntadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='joint name pointers',
                 array_extent=('njnt',),
             ),
             StructFieldDecl(
                 name='name_geomadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='geom name pointers',
                 array_extent=('ngeom',),
             ),
             StructFieldDecl(
                 name='name_siteadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='site name pointers',
                 array_extent=('nsite',),
             ),
             StructFieldDecl(
                 name='name_camadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='camera name pointers',
                 array_extent=('ncam',),
             ),
             StructFieldDecl(
                 name='name_lightadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='light name pointers',
                 array_extent=('nlight',),
             ),
             StructFieldDecl(
                 name='name_flexadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='flex name pointers',
                 array_extent=('nflex',),
             ),
             StructFieldDecl(
                 name='name_meshadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='mesh name pointers',
                 array_extent=('nmesh',),
             ),
             StructFieldDecl(
                 name='name_skinadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='skin name pointers',
                 array_extent=('nskin',),
             ),
             StructFieldDecl(
                 name='name_hfieldadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='hfield name pointers',
                 array_extent=('nhfield',),
             ),
             StructFieldDecl(
                 name='name_texadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='texture name pointers',
                 array_extent=('ntex',),
             ),
             StructFieldDecl(
                 name='name_matadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='material name pointers',
                 array_extent=('nmat',),
             ),
             StructFieldDecl(
                 name='name_pairadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='geom pair name pointers',
                 array_extent=('npair',),
             ),
             StructFieldDecl(
                 name='name_excludeadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='exclude name pointers',
                 array_extent=('nexclude',),
             ),
             StructFieldDecl(
                 name='name_eqadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='equality constraint name pointers',
                 array_extent=('neq',),
             ),
             StructFieldDecl(
                 name='name_tendonadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='tendon name pointers',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='name_actuatoradr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='actuator name pointers',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='name_sensoradr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='sensor name pointers',
                 array_extent=('nsensor',),
             ),
             StructFieldDecl(
                 name='name_numericadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='numeric name pointers',
                 array_extent=('nnumeric',),
             ),
             StructFieldDecl(
                 name='name_textadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='text name pointers',
                 array_extent=('ntext',),
             ),
             StructFieldDecl(
                 name='name_tupleadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='tuple name pointers',
                 array_extent=('ntuple',),
             ),
             StructFieldDecl(
                 name='name_keyadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='keyframe name pointers',
                 array_extent=('nkey',),
             ),
             StructFieldDecl(
                 name='name_pluginadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='plugin instance name pointers',
                 array_extent=('nplugin',),
             ),
             StructFieldDecl(
                 name='names',
                 type=PointerType(
                     inner_type=ValueType(name='char'),
                 ),
                 doc='names of all objects, 0-terminated',
                 array_extent=('nnames',),
             ),
             StructFieldDecl(
                 name='names_map',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='internal hash map of names',
                 array_extent=('nnames_map',),
             ),
             StructFieldDecl(
                 name='paths',
                 type=PointerType(
                     inner_type=ValueType(name='char'),
                 ),
                 doc='paths to assets, 0-terminated',
                 array_extent=('npaths',),
             ),
             StructFieldDecl(
                 name='B_rownnz',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='body-dof: non-zeros in each row',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='B_rowadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='body-dof: row addresses',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='B_colind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='body-dof: column indices',
                 array_extent=('nB',),
             ),
             StructFieldDecl(
                 name='M_rownnz',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='reduced inertia: non-zeros in each row',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='M_rowadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='reduced inertia: row addresses',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='M_colind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='reduced inertia: column indices',
                 array_extent=('nC',),
             ),
             StructFieldDecl(
                 name='mapM2M',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='index mapping from qM to M',
                 array_extent=('nC',),
             ),
             StructFieldDecl(
                 name='D_rownnz',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='full inertia: non-zeros in each row',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='D_rowadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='full inertia: row addresses',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='D_diag',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='full inertia: index of diagonal element',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='D_colind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='full inertia: column indices',
                 array_extent=('nD',),
             ),
             StructFieldDecl(
                 name='mapM2D',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='index mapping from M to D',
                 array_extent=('nD',),
             ),
             StructFieldDecl(
                 name='mapD2M',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='index mapping from D to M',
                 array_extent=('nC',),
             ),
             StructFieldDecl(
                 name='signature',
                 type=ValueType(name='uint64_t'),
                 doc='also held by the mjSpec that compiled this model',
             ),
         ),
     )),
    ('mjThreadPool',
     StructDecl(
         name='mjThreadPool',
         declname='struct mjThreadPool_',
         fields=(
             StructFieldDecl(
                 name='nworker',
                 type=ValueType(name='int'),
                 doc='number of workers in the pool',
             ),
         ),
     )),
    ('mjTask',
     StructDecl(
         name='mjTask',
         declname='struct mjTask_',
         fields=(
             StructFieldDecl(
                 name='func',
                 type=ValueType(name='mjfTask'),
                 doc='pointer to the function that implements the task',
             ),
             StructFieldDecl(
                 name='args',
                 type=PointerType(
                     inner_type=ValueType(name='void'),
                 ),
                 doc='arguments to func',
             ),
             StructFieldDecl(
                 name='status',
                 type=ValueType(name='int', is_volatile=True),
                 doc='status of the task',
             ),
         ),
     )),
    ('mjContact',
     StructDecl(
         name='mjContact',
         declname='struct mjContact_',
         fields=(
             StructFieldDecl(
                 name='dist',
                 type=ValueType(name='mjtNum'),
                 doc='distance between nearest points; neg: penetration',
             ),
             StructFieldDecl(
                 name='pos',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(3,),
                 ),
                 doc='position of contact point: midpoint between geoms',
             ),
             StructFieldDecl(
                 name='frame',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(9,),
                 ),
                 doc='normal is in [0-2], points from geom[0] to geom[1]',
             ),
             StructFieldDecl(
                 name='includemargin',
                 type=ValueType(name='mjtNum'),
                 doc='include if dist<includemargin=margin-gap',
             ),
             StructFieldDecl(
                 name='friction',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='tangent1, 2, spin, roll1, 2',
             ),
             StructFieldDecl(
                 name='solref',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='constraint solver reference, normal direction',
             ),
             StructFieldDecl(
                 name='solreffriction',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='constraint solver reference, friction directions',
             ),
             StructFieldDecl(
                 name='solimp',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='constraint solver impedance',
             ),
             StructFieldDecl(
                 name='mu',
                 type=ValueType(name='mjtNum'),
                 doc='friction of regularized cone, set by mj_makeConstraint',
             ),
             StructFieldDecl(
                 name='H',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(36,),
                 ),
                 doc='cone Hessian, set by mj_constraintUpdate',
             ),
             StructFieldDecl(
                 name='dim',
                 type=ValueType(name='int'),
                 doc='contact space dimensionality: 1, 3, 4 or 6',
             ),
             StructFieldDecl(
                 name='geom1',
                 type=ValueType(name='int'),
                 doc='id of geom 1; deprecated, use geom[0]',
             ),
             StructFieldDecl(
                 name='geom2',
                 type=ValueType(name='int'),
                 doc='id of geom 2; deprecated, use geom[1]',
             ),
             StructFieldDecl(
                 name='geom',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(2,),
                 ),
                 doc='geom ids; -1 for flex',
             ),
             StructFieldDecl(
                 name='flex',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(2,),
                 ),
                 doc='flex ids; -1 for geom',
             ),
             StructFieldDecl(
                 name='elem',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(2,),
                 ),
                 doc='element ids; -1 for geom or flex vertex',
             ),
             StructFieldDecl(
                 name='vert',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(2,),
                 ),
                 doc='vertex ids;  -1 for geom or flex element',
             ),
             StructFieldDecl(
                 name='exclude',
                 type=ValueType(name='int'),
                 doc='0: include, 1: in gap, 2: fused, 3: no dofs, 4: passive',
             ),
             StructFieldDecl(
                 name='efc_address',
                 type=ValueType(name='int'),
                 doc='address in efc; -1: not included',
             ),
         ),
     )),
    ('mjWarningStat',
     StructDecl(
         name='mjWarningStat',
         declname='struct mjWarningStat_',
         fields=(
             StructFieldDecl(
                 name='lastinfo',
                 type=ValueType(name='int'),
                 doc='info from last warning',
             ),
             StructFieldDecl(
                 name='number',
                 type=ValueType(name='int'),
                 doc='how many times was warning raised',
             ),
         ),
     )),
    ('mjTimerStat',
     StructDecl(
         name='mjTimerStat',
         declname='struct mjTimerStat_',
         fields=(
             StructFieldDecl(
                 name='duration',
                 type=ValueType(name='mjtNum'),
                 doc='cumulative duration',
             ),
             StructFieldDecl(
                 name='number',
                 type=ValueType(name='int'),
                 doc='how many times was timer called',
             ),
         ),
     )),
    ('mjSolverStat',
     StructDecl(
         name='mjSolverStat',
         declname='struct mjSolverStat_',
         fields=(
             StructFieldDecl(
                 name='improvement',
                 type=ValueType(name='mjtNum'),
                 doc='cost reduction, scaled by 1/trace(M(qpos0))',
             ),
             StructFieldDecl(
                 name='gradient',
                 type=ValueType(name='mjtNum'),
                 doc='gradient norm (primal only, scaled)',
             ),
             StructFieldDecl(
                 name='lineslope',
                 type=ValueType(name='mjtNum'),
                 doc='slope in linesearch',
             ),
             StructFieldDecl(
                 name='nactive',
                 type=ValueType(name='int'),
                 doc='number of active constraints',
             ),
             StructFieldDecl(
                 name='nchange',
                 type=ValueType(name='int'),
                 doc='number of constraint state changes',
             ),
             StructFieldDecl(
                 name='neval',
                 type=ValueType(name='int'),
                 doc='number of cost evaluations in line search',
             ),
             StructFieldDecl(
                 name='nupdate',
                 type=ValueType(name='int'),
                 doc='number of Cholesky updates in line search',
             ),
         ),
     )),
    ('mjData',
     StructDecl(
         name='mjData',
         declname='struct mjData_',
         fields=(
             StructFieldDecl(
                 name='narena',
                 type=ValueType(name='mjtSize'),
                 doc='size of the arena in bytes (inclusive of the stack)',
             ),
             StructFieldDecl(
                 name='nbuffer',
                 type=ValueType(name='mjtSize'),
                 doc='size of main buffer in bytes',
             ),
             StructFieldDecl(
                 name='nplugin',
                 type=ValueType(name='int'),
                 doc='number of plugin instances',
             ),
             StructFieldDecl(
                 name='pstack',
                 type=ValueType(name='size_t'),
                 doc='first available byte in stack (mutable)',
             ),
             StructFieldDecl(
                 name='pbase',
                 type=ValueType(name='size_t'),
                 doc='value of pstack when mj_markStack was last called (mutable)',  # pylint: disable=line-too-long
             ),
             StructFieldDecl(
                 name='parena',
                 type=ValueType(name='size_t'),
                 doc='first available byte in arena',
             ),
             StructFieldDecl(
                 name='maxuse_stack',
                 type=ValueType(name='mjtSize'),
                 doc='maximum stack allocation in bytes (mutable)',
             ),
             StructFieldDecl(
                 name='maxuse_threadstack',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtSize'),
                     extents=(128,),
                 ),
                 doc='maximum stack allocation per thread in bytes',
             ),
             StructFieldDecl(
                 name='maxuse_arena',
                 type=ValueType(name='mjtSize'),
                 doc='maximum arena allocation in bytes',
             ),
             StructFieldDecl(
                 name='maxuse_con',
                 type=ValueType(name='int'),
                 doc='maximum number of contacts',
             ),
             StructFieldDecl(
                 name='maxuse_efc',
                 type=ValueType(name='int'),
                 doc='maximum number of scalar constraints',
             ),
             StructFieldDecl(
                 name='solver',
                 type=ArrayType(
                     inner_type=ValueType(name='mjSolverStat'),
                     extents=(4000,),
                 ),
                 doc='solver statistics per island, per iteration',
             ),
             StructFieldDecl(
                 name='solver_niter',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(20,),
                 ),
                 doc='number of solver iterations, per island',
             ),
             StructFieldDecl(
                 name='solver_nnz',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(20,),
                 ),
                 doc='number of nonzeros in Hessian or efc_AR, per island',
             ),
             StructFieldDecl(
                 name='solver_fwdinv',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='forward-inverse comparison: qfrc, efc',
             ),
             StructFieldDecl(
                 name='warning',
                 type=ArrayType(
                     inner_type=ValueType(name='mjWarningStat'),
                     extents=(8,),
                 ),
                 doc='warning statistics (mutable)',
             ),
             StructFieldDecl(
                 name='timer',
                 type=ArrayType(
                     inner_type=ValueType(name='mjTimerStat'),
                     extents=(15,),
                 ),
                 doc='timer statistics',
             ),
             StructFieldDecl(
                 name='ncon',
                 type=ValueType(name='int'),
                 doc='number of detected contacts',
             ),
             StructFieldDecl(
                 name='ne',
                 type=ValueType(name='int'),
                 doc='number of equality constraints',
             ),
             StructFieldDecl(
                 name='nf',
                 type=ValueType(name='int'),
                 doc='number of friction constraints',
             ),
             StructFieldDecl(
                 name='nl',
                 type=ValueType(name='int'),
                 doc='number of limit constraints',
             ),
             StructFieldDecl(
                 name='nefc',
                 type=ValueType(name='int'),
                 doc='number of constraints',
             ),
             StructFieldDecl(
                 name='nJ',
                 type=ValueType(name='int'),
                 doc='number of non-zeros in constraint Jacobian',
             ),
             StructFieldDecl(
                 name='nA',
                 type=ValueType(name='int'),
                 doc='number of non-zeros in constraint inverse inertia matrix',
             ),
             StructFieldDecl(
                 name='nisland',
                 type=ValueType(name='int'),
                 doc='number of detected constraint islands',
             ),
             StructFieldDecl(
                 name='nidof',
                 type=ValueType(name='int'),
                 doc='number of dofs in all islands',
             ),
             StructFieldDecl(
                 name='ntree_awake',
                 type=ValueType(name='int'),
                 doc='number of awake trees',
             ),
             StructFieldDecl(
                 name='nbody_awake',
                 type=ValueType(name='int'),
                 doc='number of awake dynamic and static bodies',
             ),
             StructFieldDecl(
                 name='nparent_awake',
                 type=ValueType(name='int'),
                 doc='number of bodies with awake parents',
             ),
             StructFieldDecl(
                 name='nv_awake',
                 type=ValueType(name='int'),
                 doc='number of awake dofs',
             ),
             StructFieldDecl(
                 name='flg_energypos',
                 type=ValueType(name='mjtByte'),
                 doc='has mj_energyPos been called',
             ),
             StructFieldDecl(
                 name='flg_energyvel',
                 type=ValueType(name='mjtByte'),
                 doc='has mj_energyVel been called',
             ),
             StructFieldDecl(
                 name='flg_subtreevel',
                 type=ValueType(name='mjtByte'),
                 doc='has mj_subtreeVel been called',
             ),
             StructFieldDecl(
                 name='flg_rnepost',
                 type=ValueType(name='mjtByte'),
                 doc='has mj_rnePostConstraint been called',
             ),
             StructFieldDecl(
                 name='time',
                 type=ValueType(name='mjtNum'),
                 doc='simulation time',
             ),
             StructFieldDecl(
                 name='energy',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='potential, kinetic energy',
             ),
             StructFieldDecl(
                 name='buffer',
                 type=PointerType(
                     inner_type=ValueType(name='void'),
                 ),
                 doc='main buffer; all pointers point in it            (nbuffer bytes)',  # pylint: disable=line-too-long
             ),
             StructFieldDecl(
                 name='arena',
                 type=PointerType(
                     inner_type=ValueType(name='void'),
                 ),
                 doc='arena+stack buffer                               (narena bytes)',  # pylint: disable=line-too-long
             ),
             StructFieldDecl(
                 name='qpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='position',
                 array_extent=('nq',),
             ),
             StructFieldDecl(
                 name='qvel',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='velocity',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='act',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='actuator activation',
                 array_extent=('na',),
             ),
             StructFieldDecl(
                 name='history',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='history buffer',
                 array_extent=('nhistory',),
             ),
             StructFieldDecl(
                 name='qacc_warmstart',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='acceleration used for warmstart',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='plugin_state',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='plugin state',
                 array_extent=('npluginstate',),
             ),
             StructFieldDecl(
                 name='ctrl',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='control',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='qfrc_applied',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='applied generalized force',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='xfrc_applied',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='applied Cartesian force/torque',
                 array_extent=('nbody', 6),
             ),
             StructFieldDecl(
                 name='eq_active',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='enable/disable constraints',
                 array_extent=('neq',),
             ),
             StructFieldDecl(
                 name='mocap_pos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='positions of mocap bodies',
                 array_extent=('nmocap', 3),
             ),
             StructFieldDecl(
                 name='mocap_quat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='orientations of mocap bodies',
                 array_extent=('nmocap', 4),
             ),
             StructFieldDecl(
                 name='qacc',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='acceleration',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='act_dot',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='time-derivative of actuator activation',
                 array_extent=('na',),
             ),
             StructFieldDecl(
                 name='userdata',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='user data, not touched by engine',
                 array_extent=('nuserdata',),
             ),
             StructFieldDecl(
                 name='sensordata',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='sensor data array',
                 array_extent=('nsensordata',),
             ),
             StructFieldDecl(
                 name='tree_asleep',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='<0: awake; >=0: index cycle of sleeping trees',
                 array_extent=('ntree',),
             ),
             StructFieldDecl(
                 name='plugin',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='copy of m->plugin, required for deletion',
                 array_extent=('nplugin',),
             ),
             StructFieldDecl(
                 name='plugin_data',
                 type=PointerType(
                     inner_type=ValueType(name='uintptr_t'),
                 ),
                 doc='pointer to plugin-managed data structure',
                 array_extent=('nplugin',),
             ),
             StructFieldDecl(
                 name='xpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian position of body frame',
                 array_extent=('nbody', 3),
             ),
             StructFieldDecl(
                 name='xquat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian orientation of body frame',
                 array_extent=('nbody', 4),
             ),
             StructFieldDecl(
                 name='xmat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian orientation of body frame',
                 array_extent=('nbody', 9),
             ),
             StructFieldDecl(
                 name='xipos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian position of body com',
                 array_extent=('nbody', 3),
             ),
             StructFieldDecl(
                 name='ximat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian orientation of body inertia',
                 array_extent=('nbody', 9),
             ),
             StructFieldDecl(
                 name='xanchor',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian position of joint anchor',
                 array_extent=('njnt', 3),
             ),
             StructFieldDecl(
                 name='xaxis',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian joint axis',
                 array_extent=('njnt', 3),
             ),
             StructFieldDecl(
                 name='geom_xpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian geom position',
                 array_extent=('ngeom', 3),
             ),
             StructFieldDecl(
                 name='geom_xmat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian geom orientation',
                 array_extent=('ngeom', 9),
             ),
             StructFieldDecl(
                 name='site_xpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian site position',
                 array_extent=('nsite', 3),
             ),
             StructFieldDecl(
                 name='site_xmat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian site orientation',
                 array_extent=('nsite', 9),
             ),
             StructFieldDecl(
                 name='cam_xpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian camera position',
                 array_extent=('ncam', 3),
             ),
             StructFieldDecl(
                 name='cam_xmat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian camera orientation',
                 array_extent=('ncam', 9),
             ),
             StructFieldDecl(
                 name='light_xpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian light position',
                 array_extent=('nlight', 3),
             ),
             StructFieldDecl(
                 name='light_xdir',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian light direction',
                 array_extent=('nlight', 3),
             ),
             StructFieldDecl(
                 name='subtree_com',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='center of mass of each subtree',
                 array_extent=('nbody', 3),
             ),
             StructFieldDecl(
                 name='cdof',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='com-based motion axis of each dof (rot:lin)',
                 array_extent=('nv', 6),
             ),
             StructFieldDecl(
                 name='cinert',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='com-based body inertia and mass',
                 array_extent=('nbody', 10),
             ),
             StructFieldDecl(
                 name='flexvert_xpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian flex vertex positions',
                 array_extent=('nflexvert', 3),
             ),
             StructFieldDecl(
                 name='flexelem_aabb',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='flex element bounding boxes (center, size)',
                 array_extent=('nflexelem', 6),
             ),
             StructFieldDecl(
                 name='flexedge_J',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='flex edge Jacobian',
                 array_extent=('nJfe',),
             ),
             StructFieldDecl(
                 name='flexedge_length',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='flex edge lengths',
                 array_extent=('nflexedge',),
             ),
             StructFieldDecl(
                 name='flexvert_J',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='flex vertex Jacobian',
                 array_extent=('nJfv', 2),
             ),
             StructFieldDecl(
                 name='flexvert_length',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='flex vertex lengths',
                 array_extent=('nflexvert', 2),
             ),
             StructFieldDecl(
                 name='bvh_aabb_dyn',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='global bounding box (center, size)',
                 array_extent=('nbvhdynamic', 6),
             ),
             StructFieldDecl(
                 name='ten_wrapadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc="start address of tendon's path",
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='ten_wrapnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of wrap points in path',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='ten_J_rownnz',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of non-zeros in Jacobian row',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='ten_J_rowadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='row start address in colind array',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='ten_J_colind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='column indices in sparse Jacobian',
                 array_extent=('ntendon', 'nv'),
             ),
             StructFieldDecl(
                 name='ten_J',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='tendon Jacobian',
                 array_extent=('ntendon', 'nv'),
             ),
             StructFieldDecl(
                 name='ten_length',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='tendon lengths',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='wrap_obj',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='geom id; -1: site; -2: pulley',
                 array_extent=('nwrap', 2),
             ),
             StructFieldDecl(
                 name='wrap_xpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='Cartesian 3D points in all paths',
                 array_extent=('nwrap', 6),
             ),
             StructFieldDecl(
                 name='actuator_length',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='actuator lengths',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='moment_rownnz',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of non-zeros in actuator_moment row',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='moment_rowadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='row start address in colind array',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='moment_colind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='column indices in sparse Jacobian',
                 array_extent=('nJmom',),
             ),
             StructFieldDecl(
                 name='actuator_moment',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='actuator moments',
                 array_extent=('nJmom',),
             ),
             StructFieldDecl(
                 name='crb',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='com-based composite inertia and mass',
                 array_extent=('nbody', 10),
             ),
             StructFieldDecl(
                 name='qM',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='inertia (sparse)',
                 array_extent=('nM',),
             ),
             StructFieldDecl(
                 name='M',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='reduced inertia (compressed sparse row)',
                 array_extent=('nC',),
             ),
             StructFieldDecl(
                 name='qLD',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc="L'*D*L factorization of M (sparse)",
                 array_extent=('nC',),
             ),
             StructFieldDecl(
                 name='qLDiagInv',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='1/diag(D)',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='bvh_active',
                 type=PointerType(
                     inner_type=ValueType(name='mjtByte'),
                 ),
                 doc='was bounding volume checked for collision',
                 array_extent=('nbvh',),
             ),
             StructFieldDecl(
                 name='tree_awake',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='is tree awake; 0: asleep; 1: awake',
                 array_extent=('ntree',),
             ),
             StructFieldDecl(
                 name='body_awake',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='body sleep state (mjtSleepState)',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='body_awake_ind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='indices of awake and static bodies',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='parent_awake_ind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='indices of bodies with awake or static parents',
                 array_extent=('nbody',),
             ),
             StructFieldDecl(
                 name='dof_awake_ind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='indices of awake dofs',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='flexedge_velocity',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='flex edge velocities',
                 array_extent=('nflexedge',),
             ),
             StructFieldDecl(
                 name='ten_velocity',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='tendon velocities',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='actuator_velocity',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='actuator velocities',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='cvel',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='com-based velocity (rot:lin)',
                 array_extent=('nbody', 6),
             ),
             StructFieldDecl(
                 name='cdof_dot',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='time-derivative of cdof (rot:lin)',
                 array_extent=('nv', 6),
             ),
             StructFieldDecl(
                 name='qfrc_bias',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='C(qpos,qvel)',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='qfrc_spring',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='passive spring force',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='qfrc_damper',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='passive damper force',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='qfrc_gravcomp',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='passive gravity compensation force',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='qfrc_fluid',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='passive fluid force',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='qfrc_passive',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='total passive force',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='subtree_linvel',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='linear velocity of subtree com',
                 array_extent=('nbody', 3),
             ),
             StructFieldDecl(
                 name='subtree_angmom',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='angular momentum about subtree com',
                 array_extent=('nbody', 3),
             ),
             StructFieldDecl(
                 name='qH',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc="L'*D*L factorization of modified M",
                 array_extent=('nC',),
             ),
             StructFieldDecl(
                 name='qHDiagInv',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='1/diag(D) of modified M',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='qDeriv',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='d (passive + actuator - bias) / d qvel',
                 array_extent=('nD',),
             ),
             StructFieldDecl(
                 name='qLU',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='sparse LU of (qM - dt*qDeriv)',
                 array_extent=('nD',),
             ),
             StructFieldDecl(
                 name='actuator_force',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='actuator force in actuation space',
                 array_extent=('nu',),
             ),
             StructFieldDecl(
                 name='qfrc_actuator',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='actuator force',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='qfrc_smooth',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='net unconstrained force',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='qacc_smooth',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='unconstrained acceleration',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='qfrc_constraint',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint force',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='qfrc_inverse',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc="net external force; should equal: qfrc_applied + J'*xfrc_applied + qfrc_actuator",  # pylint: disable=line-too-long
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='cacc',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='com-based acceleration',
                 array_extent=('nbody', 6),
             ),
             StructFieldDecl(
                 name='cfrc_int',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='com-based interaction force with parent',
                 array_extent=('nbody', 6),
             ),
             StructFieldDecl(
                 name='cfrc_ext',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='com-based external force on body',
                 array_extent=('nbody', 6),
             ),
             StructFieldDecl(
                 name='contact',
                 type=PointerType(
                     inner_type=ValueType(name='mjContact'),
                 ),
                 doc='array of all detected contacts',
                 array_extent=('ncon',),
             ),
             StructFieldDecl(
                 name='efc_type',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='constraint type (mjtConstraint)',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_id',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='id of object of specified type',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_J_rownnz',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of non-zeros in constraint Jacobian row',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_J_rowadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='row start address in colind array',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_J_rowsuper',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of subsequent rows in supernode',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_J_colind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='column indices in constraint Jacobian',
                 array_extent=('nJ',),
             ),
             StructFieldDecl(
                 name='efc_J',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint Jacobian',
                 array_extent=('nJ',),
             ),
             StructFieldDecl(
                 name='efc_pos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint position (equality, contact)',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_margin',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='inclusion margin (contact)',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_frictionloss',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='frictionloss (friction)',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_diagApprox',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='approximation to diagonal of A',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_KBIP',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc="stiffness, damping, impedance, imp'",
                 array_extent=('nefc', 4),
             ),
             StructFieldDecl(
                 name='efc_D',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint mass',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_R',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='inverse constraint mass',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='tendon_efcadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='first efc address involving tendon; -1: none',
                 array_extent=('ntendon',),
             ),
             StructFieldDecl(
                 name='tree_island',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='island id of this tree; -1: none',
                 array_extent=('ntree',),
             ),
             StructFieldDecl(
                 name='island_ntree',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of trees in this island',
                 array_extent=('nisland',),
             ),
             StructFieldDecl(
                 name='island_itreeadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='island start address in itree vector',
                 array_extent=('nisland',),
             ),
             StructFieldDecl(
                 name='map_itree2tree',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='map from itree to tree',
                 array_extent=('ntree',),
             ),
             StructFieldDecl(
                 name='dof_island',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='island id of this dof; -1: none',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='island_nv',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of dofs in this island',
                 array_extent=('nisland',),
             ),
             StructFieldDecl(
                 name='island_idofadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='island start address in idof vector',
                 array_extent=('nisland',),
             ),
             StructFieldDecl(
                 name='island_dofadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='island start address in dof vector',
                 array_extent=('nisland',),
             ),
             StructFieldDecl(
                 name='map_dof2idof',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='map from dof to idof',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='map_idof2dof',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='map from idof to dof;  >= nidof: unconstrained',
                 array_extent=('nv',),
             ),
             StructFieldDecl(
                 name='ifrc_smooth',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='net unconstrained force',
                 array_extent=('nidof',),
             ),
             StructFieldDecl(
                 name='iacc_smooth',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='unconstrained acceleration',
                 array_extent=('nidof',),
             ),
             StructFieldDecl(
                 name='iM_rownnz',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='inertia: non-zeros in each row',
                 array_extent=('nidof',),
             ),
             StructFieldDecl(
                 name='iM_rowadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='inertia: address of each row in iM_colind',
                 array_extent=('nidof',),
             ),
             StructFieldDecl(
                 name='iM_colind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='inertia: column indices of non-zeros',
                 array_extent=('nC',),
             ),
             StructFieldDecl(
                 name='iM',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='total inertia (sparse)',
                 array_extent=('nC',),
             ),
             StructFieldDecl(
                 name='iLD',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc="L'*D*L factorization of M (sparse)",
                 array_extent=('nC',),
             ),
             StructFieldDecl(
                 name='iLDiagInv',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='1/diag(D)',
                 array_extent=('nidof',),
             ),
             StructFieldDecl(
                 name='iacc',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='acceleration',
                 array_extent=('nidof',),
             ),
             StructFieldDecl(
                 name='efc_island',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='island id of this constraint',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='island_ne',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of equality constraints in island',
                 array_extent=('nisland',),
             ),
             StructFieldDecl(
                 name='island_nf',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of friction constraints in island',
                 array_extent=('nisland',),
             ),
             StructFieldDecl(
                 name='island_nefc',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of constraints in island',
                 array_extent=('nisland',),
             ),
             StructFieldDecl(
                 name='island_iefcadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='start address in iefc vector',
                 array_extent=('nisland',),
             ),
             StructFieldDecl(
                 name='map_efc2iefc',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='map from efc to iefc',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='map_iefc2efc',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='map from iefc to efc',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='iefc_type',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='constraint type (mjtConstraint)',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='iefc_id',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='id of object of specified type',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='iefc_J_rownnz',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of non-zeros in constraint Jacobian row',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='iefc_J_rowadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='row start address in colind array',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='iefc_J_rowsuper',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of subsequent rows in supernode',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='iefc_J_colind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='column indices in constraint Jacobian',
                 array_extent=('nJ',),
             ),
             StructFieldDecl(
                 name='iefc_J',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint Jacobian',
                 array_extent=('nJ',),
             ),
             StructFieldDecl(
                 name='iefc_frictionloss',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='frictionloss (friction)',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='iefc_D',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint mass',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='iefc_R',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='inverse constraint mass',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_AR_rownnz',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of non-zeros in AR',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_AR_rowadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='row start address in colind array',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_AR_colind',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='column indices in sparse AR',
                 array_extent=('nA',),
             ),
             StructFieldDecl(
                 name='efc_AR',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc="J*inv(M)*J' + R",
                 array_extent=('nA',),
             ),
             StructFieldDecl(
                 name='efc_vel',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='velocity in constraint space: J*qvel',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_aref',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='reference pseudo-acceleration',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_b',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='linear cost term: J*qacc_smooth - aref',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='iefc_aref',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='reference pseudo-acceleration',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='iefc_state',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='constraint state (mjtConstraintState)',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='iefc_force',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint force in constraint space',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_state',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='constraint state (mjtConstraintState)',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='efc_force',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint force in constraint space',
                 array_extent=('nefc',),
             ),
             StructFieldDecl(
                 name='ifrc_constraint',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='constraint force',
                 array_extent=('nidof',),
             ),
             StructFieldDecl(
                 name='threadpool',
                 type=ValueType(name='uintptr_t'),
                 doc='thread pool pointer',
             ),
             StructFieldDecl(
                 name='signature',
                 type=ValueType(name='uint64_t'),
                 doc='also held by the mjSpec that compiled the model',
             ),
         ),
     )),
    ('mjsElement',
     StructDecl(
         name='mjsElement',
         declname='struct mjsElement_',
         fields=(
             StructFieldDecl(
                 name='elemtype',
                 type=ValueType(name='mjtObj'),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='signature',
                 type=ValueType(name='uint64_t'),
                 doc='compilation signature',
             ),
         ),
     )),
    ('mjsCompiler',
     StructDecl(
         name='mjsCompiler',
         declname='struct mjsCompiler_',
         fields=(
             StructFieldDecl(
                 name='autolimits',
                 type=ValueType(name='mjtByte'),
                 doc='infer "limited" attribute based on range',
             ),
             StructFieldDecl(
                 name='boundmass',
                 type=ValueType(name='double'),
                 doc='enforce minimum body mass',
             ),
             StructFieldDecl(
                 name='boundinertia',
                 type=ValueType(name='double'),
                 doc='enforce minimum body diagonal inertia',
             ),
             StructFieldDecl(
                 name='settotalmass',
                 type=ValueType(name='double'),
                 doc='rescale masses and inertias; <=0: ignore',
             ),
             StructFieldDecl(
                 name='balanceinertia',
                 type=ValueType(name='mjtByte'),
                 doc='automatically impose A + B >= C rule',
             ),
             StructFieldDecl(
                 name='fitaabb',
                 type=ValueType(name='mjtByte'),
                 doc='meshfit to aabb instead of inertia box',
             ),
             StructFieldDecl(
                 name='degree',
                 type=ValueType(name='mjtByte'),
                 doc='angles in radians or degrees',
             ),
             StructFieldDecl(
                 name='eulerseq',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(3,),
                 ),
                 doc='sequence for euler rotations',
             ),
             StructFieldDecl(
                 name='discardvisual',
                 type=ValueType(name='mjtByte'),
                 doc='discard visual geoms in parser',
             ),
             StructFieldDecl(
                 name='usethread',
                 type=ValueType(name='mjtByte'),
                 doc='use multiple threads to speed up compiler',
             ),
             StructFieldDecl(
                 name='fusestatic',
                 type=ValueType(name='mjtByte'),
                 doc='fuse static bodies with parent',
             ),
             StructFieldDecl(
                 name='inertiafromgeom',
                 type=ValueType(name='int'),
                 doc='use geom inertias (mjtInertiaFromGeom)',
             ),
             StructFieldDecl(
                 name='inertiagrouprange',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(2,),
                 ),
                 doc='range of geom groups used to compute inertia',
             ),
             StructFieldDecl(
                 name='saveinertial',
                 type=ValueType(name='mjtByte'),
                 doc='save explicit inertial clause for all bodies to XML',
             ),
             StructFieldDecl(
                 name='alignfree',
                 type=ValueType(name='int'),
                 doc='align free joints with inertial frame',
             ),
             StructFieldDecl(
                 name='LRopt',
                 type=ValueType(name='mjLROpt'),
                 doc='options for lengthrange computation',
             ),
             StructFieldDecl(
                 name='meshdir',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='mesh and hfield directory',
             ),
             StructFieldDecl(
                 name='texturedir',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='texture directory',
             ),
         ),
     )),
    ('mjSpec',
     StructDecl(
         name='mjSpec',
         declname='struct mjSpec_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='modelname',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='model name',
             ),
             StructFieldDecl(
                 name='compiler',
                 type=ValueType(name='mjsCompiler'),
                 doc='compiler options',
             ),
             StructFieldDecl(
                 name='strippath',
                 type=ValueType(name='mjtByte'),
                 doc='automatically strip paths from mesh files',
             ),
             StructFieldDecl(
                 name='option',
                 type=ValueType(name='mjOption'),
                 doc='physics options',
             ),
             StructFieldDecl(
                 name='visual',
                 type=ValueType(name='mjVisual'),
                 doc='visual options',
             ),
             StructFieldDecl(
                 name='stat',
                 type=ValueType(name='mjStatistic'),
                 doc='statistics override (if defined)',
             ),
             StructFieldDecl(
                 name='memory',
                 type=ValueType(name='mjtSize'),
                 doc='number of bytes in arena+stack memory',
             ),
             StructFieldDecl(
                 name='nemax',
                 type=ValueType(name='int'),
                 doc='max number of equality constraints',
             ),
             StructFieldDecl(
                 name='nuserdata',
                 type=ValueType(name='int'),
                 doc='number of mjtNums in userdata',
             ),
             StructFieldDecl(
                 name='nuser_body',
                 type=ValueType(name='int'),
                 doc='number of mjtNums in body_user',
             ),
             StructFieldDecl(
                 name='nuser_jnt',
                 type=ValueType(name='int'),
                 doc='number of mjtNums in jnt_user',
             ),
             StructFieldDecl(
                 name='nuser_geom',
                 type=ValueType(name='int'),
                 doc='number of mjtNums in geom_user',
             ),
             StructFieldDecl(
                 name='nuser_site',
                 type=ValueType(name='int'),
                 doc='number of mjtNums in site_user',
             ),
             StructFieldDecl(
                 name='nuser_cam',
                 type=ValueType(name='int'),
                 doc='number of mjtNums in cam_user',
             ),
             StructFieldDecl(
                 name='nuser_tendon',
                 type=ValueType(name='int'),
                 doc='number of mjtNums in tendon_user',
             ),
             StructFieldDecl(
                 name='nuser_actuator',
                 type=ValueType(name='int'),
                 doc='number of mjtNums in actuator_user',
             ),
             StructFieldDecl(
                 name='nuser_sensor',
                 type=ValueType(name='int'),
                 doc='number of mjtNums in sensor_user',
             ),
             StructFieldDecl(
                 name='nkey',
                 type=ValueType(name='int'),
                 doc='number of keyframes',
             ),
             StructFieldDecl(
                 name='njmax',
                 type=ValueType(name='int'),
                 doc='(deprecated) max number of constraints',
             ),
             StructFieldDecl(
                 name='nconmax',
                 type=ValueType(name='int'),
                 doc='(deprecated) max number of detected contacts',
             ),
             StructFieldDecl(
                 name='nstack',
                 type=ValueType(name='mjtSize'),
                 doc='(deprecated) number of mjtNums in mjData stack',
             ),
             StructFieldDecl(
                 name='comment',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='comment at top of XML',
             ),
             StructFieldDecl(
                 name='modelfiledir',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='path to model file',
             ),
             StructFieldDecl(
                 name='hasImplicitPluginElem',
                 type=ValueType(name='mjtByte'),
                 doc='already encountered an implicit plugin sensor/actuator',
             ),
         ),
     )),
    ('mjsOrientation',
     StructDecl(
         name='mjsOrientation',
         declname='struct mjsOrientation_',
         fields=(
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='mjtOrientation'),
                 doc='active orientation specifier',
             ),
             StructFieldDecl(
                 name='axisangle',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(4,),
                 ),
                 doc='axis and angle',
             ),
             StructFieldDecl(
                 name='xyaxes',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(6,),
                 ),
                 doc='x and y axes',
             ),
             StructFieldDecl(
                 name='zaxis',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='z axis (minimal rotation)',
             ),
             StructFieldDecl(
                 name='euler',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='Euler angles',
             ),
         ),
     )),
    ('mjsPlugin',
     StructDecl(
         name='mjsPlugin',
         declname='struct mjsPlugin_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='name',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='instance name',
             ),
             StructFieldDecl(
                 name='plugin_name',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='plugin name',
             ),
             StructFieldDecl(
                 name='active',
                 type=ValueType(name='mjtByte'),
                 doc='is the plugin active',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsBody',
     StructDecl(
         name='mjsBody',
         declname='struct mjsBody_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='childclass',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='childclass name',
             ),
             StructFieldDecl(
                 name='pos',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='frame position',
             ),
             StructFieldDecl(
                 name='quat',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(4,),
                 ),
                 doc='frame orientation',
             ),
             StructFieldDecl(
                 name='alt',
                 type=ValueType(name='mjsOrientation'),
                 doc='frame alternative orientation',
             ),
             StructFieldDecl(
                 name='mass',
                 type=ValueType(name='double'),
                 doc='mass',
             ),
             StructFieldDecl(
                 name='ipos',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='inertial frame position',
             ),
             StructFieldDecl(
                 name='iquat',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(4,),
                 ),
                 doc='inertial frame orientation',
             ),
             StructFieldDecl(
                 name='inertia',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='diagonal inertia (in i-frame)',
             ),
             StructFieldDecl(
                 name='ialt',
                 type=ValueType(name='mjsOrientation'),
                 doc='inertial frame alternative orientation',
             ),
             StructFieldDecl(
                 name='fullinertia',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(6,),
                 ),
                 doc='non-axis-aligned inertia matrix',
             ),
             StructFieldDecl(
                 name='mocap',
                 type=ValueType(name='mjtByte'),
                 doc='is this a mocap body',
             ),
             StructFieldDecl(
                 name='gravcomp',
                 type=ValueType(name='double'),
                 doc='gravity compensation',
             ),
             StructFieldDecl(
                 name='sleep',
                 type=ValueType(name='mjtSleepPolicy'),
                 doc='sleep policy',
             ),
             StructFieldDecl(
                 name='userdata',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='user data',
             ),
             StructFieldDecl(
                 name='explicitinertial',
                 type=ValueType(name='mjtByte'),
                 doc='whether to save the body with explicit inertial clause',
             ),
             StructFieldDecl(
                 name='plugin',
                 type=ValueType(name='mjsPlugin'),
                 doc='passive force plugin',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsFrame',
     StructDecl(
         name='mjsFrame',
         declname='struct mjsFrame_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='childclass',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='childclass name',
             ),
             StructFieldDecl(
                 name='pos',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='position',
             ),
             StructFieldDecl(
                 name='quat',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(4,),
                 ),
                 doc='orientation',
             ),
             StructFieldDecl(
                 name='alt',
                 type=ValueType(name='mjsOrientation'),
                 doc='alternative orientation',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsJoint',
     StructDecl(
         name='mjsJoint',
         declname='struct mjsJoint_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='mjtJoint'),
                 doc='joint type',
             ),
             StructFieldDecl(
                 name='pos',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='anchor position',
             ),
             StructFieldDecl(
                 name='axis',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='joint axis',
             ),
             StructFieldDecl(
                 name='ref',
                 type=ValueType(name='double'),
                 doc='value at reference configuration: qpos0',
             ),
             StructFieldDecl(
                 name='align',
                 type=ValueType(name='int'),
                 doc='align free joint with body com (mjtAlignFree)',
             ),
             StructFieldDecl(
                 name='stiffness',
                 type=ValueType(name='double'),
                 doc='stiffness coefficient',
             ),
             StructFieldDecl(
                 name='springref',
                 type=ValueType(name='double'),
                 doc='spring reference value: qpos_spring',
             ),
             StructFieldDecl(
                 name='springdamper',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(2,),
                 ),
                 doc='timeconst, dampratio',
             ),
             StructFieldDecl(
                 name='limited',
                 type=ValueType(name='int'),
                 doc='does joint have limits (mjtLimited)',
             ),
             StructFieldDecl(
                 name='range',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(2,),
                 ),
                 doc='joint limits',
             ),
             StructFieldDecl(
                 name='margin',
                 type=ValueType(name='double'),
                 doc='margin value for joint limit detection',
             ),
             StructFieldDecl(
                 name='solref_limit',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='solver reference: joint limits',
             ),
             StructFieldDecl(
                 name='solimp_limit',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='solver impedance: joint limits',
             ),
             StructFieldDecl(
                 name='actfrclimited',
                 type=ValueType(name='int'),
                 doc='are actuator forces on joint limited (mjtLimited)',
             ),
             StructFieldDecl(
                 name='actfrcrange',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(2,),
                 ),
                 doc='actuator force limits',
             ),
             StructFieldDecl(
                 name='armature',
                 type=ValueType(name='double'),
                 doc='armature inertia (mass for slider)',
             ),
             StructFieldDecl(
                 name='damping',
                 type=ValueType(name='double'),
                 doc='damping coefficient',
             ),
             StructFieldDecl(
                 name='frictionloss',
                 type=ValueType(name='double'),
                 doc='friction loss',
             ),
             StructFieldDecl(
                 name='solref_friction',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='solver reference: dof friction',
             ),
             StructFieldDecl(
                 name='solimp_friction',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='solver impedance: dof friction',
             ),
             StructFieldDecl(
                 name='group',
                 type=ValueType(name='int'),
                 doc='group',
             ),
             StructFieldDecl(
                 name='actgravcomp',
                 type=ValueType(name='mjtByte'),
                 doc='is gravcomp force applied via actuators',
             ),
             StructFieldDecl(
                 name='userdata',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='user data',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsGeom',
     StructDecl(
         name='mjsGeom',
         declname='struct mjsGeom_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='mjtGeom'),
                 doc='geom type',
             ),
             StructFieldDecl(
                 name='pos',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='position',
             ),
             StructFieldDecl(
                 name='quat',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(4,),
                 ),
                 doc='orientation',
             ),
             StructFieldDecl(
                 name='alt',
                 type=ValueType(name='mjsOrientation'),
                 doc='alternative orientation',
             ),
             StructFieldDecl(
                 name='fromto',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(6,),
                 ),
                 doc='alternative for capsule, cylinder, box, ellipsoid',
             ),
             StructFieldDecl(
                 name='size',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='type-specific size',
             ),
             StructFieldDecl(
                 name='contype',
                 type=ValueType(name='int'),
                 doc='contact type',
             ),
             StructFieldDecl(
                 name='conaffinity',
                 type=ValueType(name='int'),
                 doc='contact affinity',
             ),
             StructFieldDecl(
                 name='condim',
                 type=ValueType(name='int'),
                 doc='contact dimensionality',
             ),
             StructFieldDecl(
                 name='priority',
                 type=ValueType(name='int'),
                 doc='contact priority',
             ),
             StructFieldDecl(
                 name='friction',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='one-sided friction coefficients: slide, roll, spin',
             ),
             StructFieldDecl(
                 name='solmix',
                 type=ValueType(name='double'),
                 doc='solver mixing for contact pairs',
             ),
             StructFieldDecl(
                 name='solref',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='solver reference',
             ),
             StructFieldDecl(
                 name='solimp',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='solver impedance',
             ),
             StructFieldDecl(
                 name='margin',
                 type=ValueType(name='double'),
                 doc='margin for contact detection',
             ),
             StructFieldDecl(
                 name='gap',
                 type=ValueType(name='double'),
                 doc='include in solver if dist < margin-gap',
             ),
             StructFieldDecl(
                 name='mass',
                 type=ValueType(name='double'),
                 doc='used to compute density',
             ),
             StructFieldDecl(
                 name='density',
                 type=ValueType(name='double'),
                 doc='used to compute mass and inertia from volume or surface',
             ),
             StructFieldDecl(
                 name='typeinertia',
                 type=ValueType(name='mjtGeomInertia'),
                 doc='selects between surface and volume inertia',
             ),
             StructFieldDecl(
                 name='fluid_ellipsoid',
                 type=ValueType(name='mjtNum'),
                 doc='whether ellipsoid-fluid model is active',
             ),
             StructFieldDecl(
                 name='fluid_coefs',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='ellipsoid-fluid interaction coefs',
             ),
             StructFieldDecl(
                 name='material',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of material',
             ),
             StructFieldDecl(
                 name='rgba',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='rgba when material is omitted',
             ),
             StructFieldDecl(
                 name='group',
                 type=ValueType(name='int'),
                 doc='group',
             ),
             StructFieldDecl(
                 name='hfieldname',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='heightfield attached to geom',
             ),
             StructFieldDecl(
                 name='meshname',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='mesh attached to geom',
             ),
             StructFieldDecl(
                 name='fitscale',
                 type=ValueType(name='double'),
                 doc='scale mesh uniformly',
             ),
             StructFieldDecl(
                 name='userdata',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='user data',
             ),
             StructFieldDecl(
                 name='plugin',
                 type=ValueType(name='mjsPlugin'),
                 doc='sdf plugin',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsSite',
     StructDecl(
         name='mjsSite',
         declname='struct mjsSite_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='pos',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='position',
             ),
             StructFieldDecl(
                 name='quat',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(4,),
                 ),
                 doc='orientation',
             ),
             StructFieldDecl(
                 name='alt',
                 type=ValueType(name='mjsOrientation'),
                 doc='alternative orientation',
             ),
             StructFieldDecl(
                 name='fromto',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(6,),
                 ),
                 doc='alternative for capsule, cylinder, box, ellipsoid',
             ),
             StructFieldDecl(
                 name='size',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='geom size',
             ),
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='mjtGeom'),
                 doc='geom type',
             ),
             StructFieldDecl(
                 name='material',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of material',
             ),
             StructFieldDecl(
                 name='group',
                 type=ValueType(name='int'),
                 doc='group',
             ),
             StructFieldDecl(
                 name='rgba',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='rgba when material is omitted',
             ),
             StructFieldDecl(
                 name='userdata',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='user data',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsCamera',
     StructDecl(
         name='mjsCamera',
         declname='struct mjsCamera_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='pos',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='position',
             ),
             StructFieldDecl(
                 name='quat',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(4,),
                 ),
                 doc='orientation',
             ),
             StructFieldDecl(
                 name='alt',
                 type=ValueType(name='mjsOrientation'),
                 doc='alternative orientation',
             ),
             StructFieldDecl(
                 name='mode',
                 type=ValueType(name='mjtCamLight'),
                 doc='tracking mode',
             ),
             StructFieldDecl(
                 name='targetbody',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='target body for tracking/targeting',
             ),
             StructFieldDecl(
                 name='proj',
                 type=ValueType(name='mjtProjection'),
                 doc='camera projection type',
             ),
             StructFieldDecl(
                 name='resolution',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(2,),
                 ),
                 doc='resolution (pixel)',
             ),
             StructFieldDecl(
                 name='output',
                 type=ValueType(name='int'),
                 doc='bit flags for output type',
             ),
             StructFieldDecl(
                 name='fovy',
                 type=ValueType(name='double'),
                 doc='y-field of view',
             ),
             StructFieldDecl(
                 name='ipd',
                 type=ValueType(name='double'),
                 doc='inter-pupillary distance',
             ),
             StructFieldDecl(
                 name='intrinsic',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='camera intrinsics (length)',
             ),
             StructFieldDecl(
                 name='sensor_size',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(2,),
                 ),
                 doc='sensor size (length)',
             ),
             StructFieldDecl(
                 name='focal_length',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(2,),
                 ),
                 doc='focal length (length)',
             ),
             StructFieldDecl(
                 name='focal_pixel',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(2,),
                 ),
                 doc='focal length (pixel)',
             ),
             StructFieldDecl(
                 name='principal_length',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(2,),
                 ),
                 doc='principal point (length)',
             ),
             StructFieldDecl(
                 name='principal_pixel',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(2,),
                 ),
                 doc='principal point (pixel)',
             ),
             StructFieldDecl(
                 name='userdata',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='user data',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsLight',
     StructDecl(
         name='mjsLight',
         declname='struct mjsLight_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='pos',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='position',
             ),
             StructFieldDecl(
                 name='dir',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='direction',
             ),
             StructFieldDecl(
                 name='mode',
                 type=ValueType(name='mjtCamLight'),
                 doc='tracking mode',
             ),
             StructFieldDecl(
                 name='targetbody',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='target body for targeting',
             ),
             StructFieldDecl(
                 name='active',
                 type=ValueType(name='mjtByte'),
                 doc='is light active',
             ),
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='mjtLightType'),
                 doc='type of light',
             ),
             StructFieldDecl(
                 name='texture',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='texture name for image lights',
             ),
             StructFieldDecl(
                 name='castshadow',
                 type=ValueType(name='mjtByte'),
                 doc='does light cast shadows',
             ),
             StructFieldDecl(
                 name='bulbradius',
                 type=ValueType(name='float'),
                 doc='bulb radius, for soft shadows',
             ),
             StructFieldDecl(
                 name='intensity',
                 type=ValueType(name='float'),
                 doc='intensity, in candelas',
             ),
             StructFieldDecl(
                 name='range',
                 type=ValueType(name='float'),
                 doc='range of effectiveness',
             ),
             StructFieldDecl(
                 name='attenuation',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='OpenGL attenuation (quadratic model)',
             ),
             StructFieldDecl(
                 name='cutoff',
                 type=ValueType(name='float'),
                 doc='OpenGL cutoff',
             ),
             StructFieldDecl(
                 name='exponent',
                 type=ValueType(name='float'),
                 doc='OpenGL exponent',
             ),
             StructFieldDecl(
                 name='ambient',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='ambient color',
             ),
             StructFieldDecl(
                 name='diffuse',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='diffuse color',
             ),
             StructFieldDecl(
                 name='specular',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='specular color',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errorsx',
             ),
         ),
     )),
    ('mjsFlex',
     StructDecl(
         name='mjsFlex',
         declname='struct mjsFlex_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='contype',
                 type=ValueType(name='int'),
                 doc='contact type',
             ),
             StructFieldDecl(
                 name='conaffinity',
                 type=ValueType(name='int'),
                 doc='contact affinity',
             ),
             StructFieldDecl(
                 name='condim',
                 type=ValueType(name='int'),
                 doc='contact dimensionality',
             ),
             StructFieldDecl(
                 name='priority',
                 type=ValueType(name='int'),
                 doc='contact priority',
             ),
             StructFieldDecl(
                 name='friction',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='one-sided friction coefficients: slide, roll, spin',
             ),
             StructFieldDecl(
                 name='solmix',
                 type=ValueType(name='double'),
                 doc='solver mixing for contact pairs',
             ),
             StructFieldDecl(
                 name='solref',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='solver reference',
             ),
             StructFieldDecl(
                 name='solimp',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='solver impedance',
             ),
             StructFieldDecl(
                 name='margin',
                 type=ValueType(name='double'),
                 doc='margin for contact detection',
             ),
             StructFieldDecl(
                 name='gap',
                 type=ValueType(name='double'),
                 doc='include in solver if dist<margin-gap',
             ),
             StructFieldDecl(
                 name='dim',
                 type=ValueType(name='int'),
                 doc='element dimensionality',
             ),
             StructFieldDecl(
                 name='radius',
                 type=ValueType(name='double'),
                 doc='radius around primitive element',
             ),
             StructFieldDecl(
                 name='size',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='vertex bounding box half sizes in qpos0',
             ),
             StructFieldDecl(
                 name='internal',
                 type=ValueType(name='mjtByte'),
                 doc='enable internal collisions',
             ),
             StructFieldDecl(
                 name='flatskin',
                 type=ValueType(name='mjtByte'),
                 doc='render flex skin with flat shading',
             ),
             StructFieldDecl(
                 name='selfcollide',
                 type=ValueType(name='int'),
                 doc='mode for flex self collision',
             ),
             StructFieldDecl(
                 name='vertcollide',
                 type=ValueType(name='int'),
                 doc='mode for vertex collision',
             ),
             StructFieldDecl(
                 name='passive',
                 type=ValueType(name='int'),
                 doc='mode for passive collisions',
             ),
             StructFieldDecl(
                 name='activelayers',
                 type=ValueType(name='int'),
                 doc='number of active element layers in 3D',
             ),
             StructFieldDecl(
                 name='group',
                 type=ValueType(name='int'),
                 doc='group for visualization',
             ),
             StructFieldDecl(
                 name='edgestiffness',
                 type=ValueType(name='double'),
                 doc='edge stiffness',
             ),
             StructFieldDecl(
                 name='edgedamping',
                 type=ValueType(name='double'),
                 doc='edge damping',
             ),
             StructFieldDecl(
                 name='rgba',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='rgba when material is omitted',
             ),
             StructFieldDecl(
                 name='material',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of material used for rendering',
             ),
             StructFieldDecl(
                 name='young',
                 type=ValueType(name='double'),
                 doc="Young's modulus",
             ),
             StructFieldDecl(
                 name='poisson',
                 type=ValueType(name='double'),
                 doc="Poisson's ratio",
             ),
             StructFieldDecl(
                 name='damping',
                 type=ValueType(name='double'),
                 doc="Rayleigh's damping",
             ),
             StructFieldDecl(
                 name='thickness',
                 type=ValueType(name='double'),
                 doc='thickness (2D only)',
             ),
             StructFieldDecl(
                 name='elastic2d',
                 type=ValueType(name='int'),
                 doc='2D passive forces; 0: none, 1: bending, 2: stretching, 3: both',  # pylint: disable=line-too-long
             ),
             StructFieldDecl(
                 name='nodebody',
                 type=PointerType(
                     inner_type=ValueType(name='mjStringVec'),
                 ),
                 doc='node body names',
             ),
             StructFieldDecl(
                 name='vertbody',
                 type=PointerType(
                     inner_type=ValueType(name='mjStringVec'),
                 ),
                 doc='vertex body names',
             ),
             StructFieldDecl(
                 name='node',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='node positions',
             ),
             StructFieldDecl(
                 name='vert',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='vertex positions',
             ),
             StructFieldDecl(
                 name='elem',
                 type=PointerType(
                     inner_type=ValueType(name='mjIntVec'),
                 ),
                 doc='element vertex ids',
             ),
             StructFieldDecl(
                 name='texcoord',
                 type=PointerType(
                     inner_type=ValueType(name='mjFloatVec'),
                 ),
                 doc='vertex texture coordinates',
             ),
             StructFieldDecl(
                 name='elemtexcoord',
                 type=PointerType(
                     inner_type=ValueType(name='mjIntVec'),
                 ),
                 doc='element texture coordinates',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsMesh',
     StructDecl(
         name='mjsMesh',
         declname='struct mjsMesh_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='content_type',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='content type of file',
             ),
             StructFieldDecl(
                 name='file',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='mesh file',
             ),
             StructFieldDecl(
                 name='refpos',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='reference position',
             ),
             StructFieldDecl(
                 name='refquat',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(4,),
                 ),
                 doc='reference orientation',
             ),
             StructFieldDecl(
                 name='scale',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='rescale mesh',
             ),
             StructFieldDecl(
                 name='inertia',
                 type=ValueType(name='mjtMeshInertia'),
                 doc='inertia type (convex, legacy, exact, shell)',
             ),
             StructFieldDecl(
                 name='smoothnormal',
                 type=ValueType(name='mjtByte'),
                 doc='do not exclude large-angle faces from normals',
             ),
             StructFieldDecl(
                 name='needsdf',
                 type=ValueType(name='mjtByte'),
                 doc='compute sdf from mesh',
             ),
             StructFieldDecl(
                 name='maxhullvert',
                 type=ValueType(name='int'),
                 doc='maximum vertex count for the convex hull',
             ),
             StructFieldDecl(
                 name='uservert',
                 type=PointerType(
                     inner_type=ValueType(name='mjFloatVec'),
                 ),
                 doc='user vertex data',
             ),
             StructFieldDecl(
                 name='usernormal',
                 type=PointerType(
                     inner_type=ValueType(name='mjFloatVec'),
                 ),
                 doc='user normal data',
             ),
             StructFieldDecl(
                 name='usertexcoord',
                 type=PointerType(
                     inner_type=ValueType(name='mjFloatVec'),
                 ),
                 doc='user texcoord data',
             ),
             StructFieldDecl(
                 name='userface',
                 type=PointerType(
                     inner_type=ValueType(name='mjIntVec'),
                 ),
                 doc='user vertex indices',
             ),
             StructFieldDecl(
                 name='userfacenormal',
                 type=PointerType(
                     inner_type=ValueType(name='mjIntVec'),
                 ),
                 doc='user face normal indices',
             ),
             StructFieldDecl(
                 name='userfacetexcoord',
                 type=PointerType(
                     inner_type=ValueType(name='mjIntVec'),
                 ),
                 doc='user texcoord indices',
             ),
             StructFieldDecl(
                 name='plugin',
                 type=ValueType(name='mjsPlugin'),
                 doc='sdf plugin',
             ),
             StructFieldDecl(
                 name='material',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of material',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsHField',
     StructDecl(
         name='mjsHField',
         declname='struct mjsHField_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='content_type',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='content type of file',
             ),
             StructFieldDecl(
                 name='file',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='file: (nrow, ncol, [elevation data])',
             ),
             StructFieldDecl(
                 name='size',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(4,),
                 ),
                 doc='hfield size (ignore referencing geom size)',
             ),
             StructFieldDecl(
                 name='nrow',
                 type=ValueType(name='int'),
                 doc='number of rows',
             ),
             StructFieldDecl(
                 name='ncol',
                 type=ValueType(name='int'),
                 doc='number of columns',
             ),
             StructFieldDecl(
                 name='userdata',
                 type=PointerType(
                     inner_type=ValueType(name='mjFloatVec'),
                 ),
                 doc='user-provided elevation data',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsSkin',
     StructDecl(
         name='mjsSkin',
         declname='struct mjsSkin_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='file',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='skin file',
             ),
             StructFieldDecl(
                 name='material',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of material used for rendering',
             ),
             StructFieldDecl(
                 name='rgba',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='rgba when material is omitted',
             ),
             StructFieldDecl(
                 name='inflate',
                 type=ValueType(name='float'),
                 doc='inflate in normal direction',
             ),
             StructFieldDecl(
                 name='group',
                 type=ValueType(name='int'),
                 doc='group for visualization',
             ),
             StructFieldDecl(
                 name='vert',
                 type=PointerType(
                     inner_type=ValueType(name='mjFloatVec'),
                 ),
                 doc='vertex positions',
             ),
             StructFieldDecl(
                 name='texcoord',
                 type=PointerType(
                     inner_type=ValueType(name='mjFloatVec'),
                 ),
                 doc='texture coordinates',
             ),
             StructFieldDecl(
                 name='face',
                 type=PointerType(
                     inner_type=ValueType(name='mjIntVec'),
                 ),
                 doc='faces',
             ),
             StructFieldDecl(
                 name='bodyname',
                 type=PointerType(
                     inner_type=ValueType(name='mjStringVec'),
                 ),
                 doc='body names',
             ),
             StructFieldDecl(
                 name='bindpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjFloatVec'),
                 ),
                 doc='bind pos',
             ),
             StructFieldDecl(
                 name='bindquat',
                 type=PointerType(
                     inner_type=ValueType(name='mjFloatVec'),
                 ),
                 doc='bind quat',
             ),
             StructFieldDecl(
                 name='vertid',
                 type=PointerType(
                     inner_type=ValueType(name='mjIntVecVec'),
                 ),
                 doc='vertex ids',
             ),
             StructFieldDecl(
                 name='vertweight',
                 type=PointerType(
                     inner_type=ValueType(name='mjFloatVecVec'),
                 ),
                 doc='vertex weights',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsTexture',
     StructDecl(
         name='mjsTexture',
         declname='struct mjsTexture_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='mjtTexture'),
                 doc='texture type',
             ),
             StructFieldDecl(
                 name='colorspace',
                 type=ValueType(name='mjtColorSpace'),
                 doc='colorspace',
             ),
             StructFieldDecl(
                 name='builtin',
                 type=ValueType(name='int'),
                 doc='builtin type (mjtBuiltin)',
             ),
             StructFieldDecl(
                 name='mark',
                 type=ValueType(name='int'),
                 doc='mark type (mjtMark)',
             ),
             StructFieldDecl(
                 name='rgb1',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='first color for builtin',
             ),
             StructFieldDecl(
                 name='rgb2',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='second color for builtin',
             ),
             StructFieldDecl(
                 name='markrgb',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(3,),
                 ),
                 doc='mark color',
             ),
             StructFieldDecl(
                 name='random',
                 type=ValueType(name='double'),
                 doc='probability of random dots',
             ),
             StructFieldDecl(
                 name='height',
                 type=ValueType(name='int'),
                 doc='height in pixels (square for cube and skybox)',
             ),
             StructFieldDecl(
                 name='width',
                 type=ValueType(name='int'),
                 doc='width in pixels',
             ),
             StructFieldDecl(
                 name='nchannel',
                 type=ValueType(name='int'),
                 doc='number of channels',
             ),
             StructFieldDecl(
                 name='content_type',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='content type of file',
             ),
             StructFieldDecl(
                 name='file',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='png file to load; use for all sides of cube',
             ),
             StructFieldDecl(
                 name='gridsize',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(2,),
                 ),
                 doc='size of grid for composite file; (1,1)-repeat',
             ),
             StructFieldDecl(
                 name='gridlayout',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(12,),
                 ),
                 doc='row-major: L,R,F,B,U,D for faces; . for unused',
             ),
             StructFieldDecl(
                 name='cubefiles',
                 type=PointerType(
                     inner_type=ValueType(name='mjStringVec'),
                 ),
                 doc='different file for each side of the cube',
             ),
             StructFieldDecl(
                 name='data',
                 type=PointerType(
                     inner_type=ValueType(name='mjByteVec'),
                 ),
                 doc='texture data',
             ),
             StructFieldDecl(
                 name='hflip',
                 type=ValueType(name='mjtByte'),
                 doc='horizontal flip',
             ),
             StructFieldDecl(
                 name='vflip',
                 type=ValueType(name='mjtByte'),
                 doc='vertical flip',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsMaterial',
     StructDecl(
         name='mjsMaterial',
         declname='struct mjsMaterial_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='textures',
                 type=PointerType(
                     inner_type=ValueType(name='mjStringVec'),
                 ),
                 doc='names of textures (empty: none)',
             ),
             StructFieldDecl(
                 name='texuniform',
                 type=ValueType(name='mjtByte'),
                 doc='make texture cube uniform',
             ),
             StructFieldDecl(
                 name='texrepeat',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(2,),
                 ),
                 doc='texture repetition for 2D mapping',
             ),
             StructFieldDecl(
                 name='emission',
                 type=ValueType(name='float'),
                 doc='emission',
             ),
             StructFieldDecl(
                 name='specular',
                 type=ValueType(name='float'),
                 doc='specular',
             ),
             StructFieldDecl(
                 name='shininess',
                 type=ValueType(name='float'),
                 doc='shininess',
             ),
             StructFieldDecl(
                 name='reflectance',
                 type=ValueType(name='float'),
                 doc='reflectance',
             ),
             StructFieldDecl(
                 name='metallic',
                 type=ValueType(name='float'),
                 doc='metallic',
             ),
             StructFieldDecl(
                 name='roughness',
                 type=ValueType(name='float'),
                 doc='roughness',
             ),
             StructFieldDecl(
                 name='rgba',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='rgba',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsPair',
     StructDecl(
         name='mjsPair',
         declname='struct mjsPair_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='geomname1',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of geom 1',
             ),
             StructFieldDecl(
                 name='geomname2',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of geom 2',
             ),
             StructFieldDecl(
                 name='condim',
                 type=ValueType(name='int'),
                 doc='contact dimensionality',
             ),
             StructFieldDecl(
                 name='solref',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='solver reference, normal direction',
             ),
             StructFieldDecl(
                 name='solreffriction',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='solver reference, frictional directions',
             ),
             StructFieldDecl(
                 name='solimp',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='solver impedance',
             ),
             StructFieldDecl(
                 name='margin',
                 type=ValueType(name='double'),
                 doc='margin for contact detection',
             ),
             StructFieldDecl(
                 name='gap',
                 type=ValueType(name='double'),
                 doc='include in solver if dist<margin-gap',
             ),
             StructFieldDecl(
                 name='friction',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(5,),
                 ),
                 doc='full contact friction',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to errors',
             ),
         ),
     )),
    ('mjsExclude',
     StructDecl(
         name='mjsExclude',
         declname='struct mjsExclude_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='bodyname1',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of geom 1',
             ),
             StructFieldDecl(
                 name='bodyname2',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of geom 2',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to errors',
             ),
         ),
     )),
    ('mjsEquality',
     StructDecl(
         name='mjsEquality',
         declname='struct mjsEquality_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='mjtEq'),
                 doc='constraint type',
             ),
             StructFieldDecl(
                 name='data',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(11,),
                 ),
                 doc='type-dependent data',
             ),
             StructFieldDecl(
                 name='active',
                 type=ValueType(name='mjtByte'),
                 doc='is equality initially active',
             ),
             StructFieldDecl(
                 name='name1',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of object 1',
             ),
             StructFieldDecl(
                 name='name2',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of object 2',
             ),
             StructFieldDecl(
                 name='objtype',
                 type=ValueType(name='mjtObj'),
                 doc='type of both objects',
             ),
             StructFieldDecl(
                 name='solref',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='solver reference',
             ),
             StructFieldDecl(
                 name='solimp',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='solver impedance',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to errors',
             ),
         ),
     )),
    ('mjsTendon',
     StructDecl(
         name='mjsTendon',
         declname='struct mjsTendon_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='stiffness',
                 type=ValueType(name='double'),
                 doc='stiffness coefficient',
             ),
             StructFieldDecl(
                 name='springlength',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(2,),
                 ),
                 doc='spring resting length; {-1, -1}: use qpos_spring',
             ),
             StructFieldDecl(
                 name='damping',
                 type=ValueType(name='double'),
                 doc='damping coefficient',
             ),
             StructFieldDecl(
                 name='frictionloss',
                 type=ValueType(name='double'),
                 doc='friction loss',
             ),
             StructFieldDecl(
                 name='solref_friction',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='solver reference: tendon friction',
             ),
             StructFieldDecl(
                 name='solimp_friction',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='solver impedance: tendon friction',
             ),
             StructFieldDecl(
                 name='armature',
                 type=ValueType(name='double'),
                 doc='inertia associated with tendon velocity',
             ),
             StructFieldDecl(
                 name='limited',
                 type=ValueType(name='int'),
                 doc='does tendon have limits (mjtLimited)',
             ),
             StructFieldDecl(
                 name='actfrclimited',
                 type=ValueType(name='int'),
                 doc='does tendon have actuator force limits',
             ),
             StructFieldDecl(
                 name='range',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(2,),
                 ),
                 doc='length limits',
             ),
             StructFieldDecl(
                 name='actfrcrange',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(2,),
                 ),
                 doc='actuator force limits',
             ),
             StructFieldDecl(
                 name='margin',
                 type=ValueType(name='double'),
                 doc='margin value for tendon limit detection',
             ),
             StructFieldDecl(
                 name='solref_limit',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(2,),
                 ),
                 doc='solver reference: tendon limits',
             ),
             StructFieldDecl(
                 name='solimp_limit',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(5,),
                 ),
                 doc='solver impedance: tendon limits',
             ),
             StructFieldDecl(
                 name='material',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of material for rendering',
             ),
             StructFieldDecl(
                 name='width',
                 type=ValueType(name='double'),
                 doc='width for rendering',
             ),
             StructFieldDecl(
                 name='rgba',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='rgba when material is omitted',
             ),
             StructFieldDecl(
                 name='group',
                 type=ValueType(name='int'),
                 doc='group',
             ),
             StructFieldDecl(
                 name='userdata',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='user data',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to errors',
             ),
         ),
     )),
    ('mjsWrap',
     StructDecl(
         name='mjsWrap',
         declname='struct mjsWrap_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='mjtWrap'),
                 doc='wrap type',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to errors',
             ),
         ),
     )),
    ('mjsActuator',
     StructDecl(
         name='mjsActuator',
         declname='struct mjsActuator_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='gaintype',
                 type=ValueType(name='mjtGain'),
                 doc='gain type',
             ),
             StructFieldDecl(
                 name='gainprm',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(10,),
                 ),
                 doc='gain parameters',
             ),
             StructFieldDecl(
                 name='biastype',
                 type=ValueType(name='mjtBias'),
                 doc='bias type',
             ),
             StructFieldDecl(
                 name='biasprm',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(10,),
                 ),
                 doc='bias parameters',
             ),
             StructFieldDecl(
                 name='dyntype',
                 type=ValueType(name='mjtDyn'),
                 doc='dynamics type',
             ),
             StructFieldDecl(
                 name='dynprm',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(10,),
                 ),
                 doc='dynamics parameters',
             ),
             StructFieldDecl(
                 name='actdim',
                 type=ValueType(name='int'),
                 doc='number of activation variables',
             ),
             StructFieldDecl(
                 name='actearly',
                 type=ValueType(name='mjtByte'),
                 doc='apply next activations to qfrc',
             ),
             StructFieldDecl(
                 name='trntype',
                 type=ValueType(name='mjtTrn'),
                 doc='transmission type',
             ),
             StructFieldDecl(
                 name='gear',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(6,),
                 ),
                 doc='length and transmitted force scaling',
             ),
             StructFieldDecl(
                 name='target',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of transmission target',
             ),
             StructFieldDecl(
                 name='refsite',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='reference site, for site transmission',
             ),
             StructFieldDecl(
                 name='slidersite',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='site defining cylinder, for slider-crank',
             ),
             StructFieldDecl(
                 name='cranklength',
                 type=ValueType(name='double'),
                 doc='crank length, for slider-crank',
             ),
             StructFieldDecl(
                 name='lengthrange',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(2,),
                 ),
                 doc='transmission length range',
             ),
             StructFieldDecl(
                 name='inheritrange',
                 type=ValueType(name='double'),
                 doc='automatic range setting for position and intvelocity',
             ),
             StructFieldDecl(
                 name='ctrllimited',
                 type=ValueType(name='int'),
                 doc='are control limits defined (mjtLimited)',
             ),
             StructFieldDecl(
                 name='ctrlrange',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(2,),
                 ),
                 doc='control range',
             ),
             StructFieldDecl(
                 name='forcelimited',
                 type=ValueType(name='int'),
                 doc='are force limits defined (mjtLimited)',
             ),
             StructFieldDecl(
                 name='forcerange',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(2,),
                 ),
                 doc='force range',
             ),
             StructFieldDecl(
                 name='actlimited',
                 type=ValueType(name='int'),
                 doc='are activation limits defined (mjtLimited)',
             ),
             StructFieldDecl(
                 name='actrange',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(2,),
                 ),
                 doc='activation range',
             ),
             StructFieldDecl(
                 name='group',
                 type=ValueType(name='int'),
                 doc='group',
             ),
             StructFieldDecl(
                 name='nsample',
                 type=ValueType(name='int'),
                 doc='number of samples in history buffer',
             ),
             StructFieldDecl(
                 name='interp',
                 type=ValueType(name='int'),
                 doc='interpolation order (0=ZOH, 1=linear, 2=cubic)',
             ),
             StructFieldDecl(
                 name='delay',
                 type=ValueType(name='double'),
                 doc='delay time in seconds; 0: no delay',
             ),
             StructFieldDecl(
                 name='userdata',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='user data',
             ),
             StructFieldDecl(
                 name='plugin',
                 type=ValueType(name='mjsPlugin'),
                 doc='actuator plugin',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsSensor',
     StructDecl(
         name='mjsSensor',
         declname='struct mjsSensor_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='mjtSensor'),
                 doc='type of sensor',
             ),
             StructFieldDecl(
                 name='objtype',
                 type=ValueType(name='mjtObj'),
                 doc='type of sensorized object',
             ),
             StructFieldDecl(
                 name='objname',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of sensorized object',
             ),
             StructFieldDecl(
                 name='reftype',
                 type=ValueType(name='mjtObj'),
                 doc='type of referenced object',
             ),
             StructFieldDecl(
                 name='refname',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='name of referenced object',
             ),
             StructFieldDecl(
                 name='intprm',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(3,),
                 ),
                 doc='integer parameters',
             ),
             StructFieldDecl(
                 name='datatype',
                 type=ValueType(name='mjtDataType'),
                 doc='data type for sensor measurement',
             ),
             StructFieldDecl(
                 name='needstage',
                 type=ValueType(name='mjtStage'),
                 doc='compute stage needed to simulate sensor',
             ),
             StructFieldDecl(
                 name='dim',
                 type=ValueType(name='int'),
                 doc='number of scalar outputs',
             ),
             StructFieldDecl(
                 name='cutoff',
                 type=ValueType(name='double'),
                 doc='cutoff for real and positive datatypes',
             ),
             StructFieldDecl(
                 name='noise',
                 type=ValueType(name='double'),
                 doc='noise stdev',
             ),
             StructFieldDecl(
                 name='nsample',
                 type=ValueType(name='int'),
                 doc='number of samples in history buffer',
             ),
             StructFieldDecl(
                 name='interp',
                 type=ValueType(name='int'),
                 doc='interpolation order (0=ZOH, 1=linear, 2=cubic)',
             ),
             StructFieldDecl(
                 name='delay',
                 type=ValueType(name='double'),
                 doc='delay time in seconds',
             ),
             StructFieldDecl(
                 name='interval',
                 type=ArrayType(
                     inner_type=ValueType(name='double'),
                     extents=(2,),
                 ),
                 doc='[period, time_prev] in seconds',
             ),
             StructFieldDecl(
                 name='userdata',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='user data',
             ),
             StructFieldDecl(
                 name='plugin',
                 type=ValueType(name='mjsPlugin'),
                 doc='sensor plugin',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsNumeric',
     StructDecl(
         name='mjsNumeric',
         declname='struct mjsNumeric_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='data',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='initialization data',
             ),
             StructFieldDecl(
                 name='size',
                 type=ValueType(name='int'),
                 doc='array size, can be bigger than data size',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsText',
     StructDecl(
         name='mjsText',
         declname='struct mjsText_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='data',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='text string',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsTuple',
     StructDecl(
         name='mjsTuple',
         declname='struct mjsTuple_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='objtype',
                 type=PointerType(
                     inner_type=ValueType(name='mjIntVec'),
                 ),
                 doc='object types',
             ),
             StructFieldDecl(
                 name='objname',
                 type=PointerType(
                     inner_type=ValueType(name='mjStringVec'),
                 ),
                 doc='object names',
             ),
             StructFieldDecl(
                 name='objprm',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='object parameters',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsKey',
     StructDecl(
         name='mjsKey',
         declname='struct mjsKey_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='time',
                 type=ValueType(name='double'),
                 doc='time',
             ),
             StructFieldDecl(
                 name='qpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='qpos',
             ),
             StructFieldDecl(
                 name='qvel',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='qvel',
             ),
             StructFieldDecl(
                 name='act',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='act',
             ),
             StructFieldDecl(
                 name='mpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='mocap pos',
             ),
             StructFieldDecl(
                 name='mquat',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='mocap quat',
             ),
             StructFieldDecl(
                 name='ctrl',
                 type=PointerType(
                     inner_type=ValueType(name='mjDoubleVec'),
                 ),
                 doc='ctrl',
             ),
             StructFieldDecl(
                 name='info',
                 type=PointerType(
                     inner_type=ValueType(name='mjString'),
                 ),
                 doc='message appended to compiler errors',
             ),
         ),
     )),
    ('mjsDefault',
     StructDecl(
         name='mjsDefault',
         declname='struct mjsDefault_',
         fields=(
             StructFieldDecl(
                 name='element',
                 type=PointerType(
                     inner_type=ValueType(name='mjsElement'),
                 ),
                 doc='element type',
             ),
             StructFieldDecl(
                 name='joint',
                 type=PointerType(
                     inner_type=ValueType(name='mjsJoint'),
                 ),
                 doc='joint defaults',
             ),
             StructFieldDecl(
                 name='geom',
                 type=PointerType(
                     inner_type=ValueType(name='mjsGeom'),
                 ),
                 doc='geom defaults',
             ),
             StructFieldDecl(
                 name='site',
                 type=PointerType(
                     inner_type=ValueType(name='mjsSite'),
                 ),
                 doc='site defaults',
             ),
             StructFieldDecl(
                 name='camera',
                 type=PointerType(
                     inner_type=ValueType(name='mjsCamera'),
                 ),
                 doc='camera defaults',
             ),
             StructFieldDecl(
                 name='light',
                 type=PointerType(
                     inner_type=ValueType(name='mjsLight'),
                 ),
                 doc='light defaults',
             ),
             StructFieldDecl(
                 name='flex',
                 type=PointerType(
                     inner_type=ValueType(name='mjsFlex'),
                 ),
                 doc='flex defaults',
             ),
             StructFieldDecl(
                 name='mesh',
                 type=PointerType(
                     inner_type=ValueType(name='mjsMesh'),
                 ),
                 doc='mesh defaults',
             ),
             StructFieldDecl(
                 name='material',
                 type=PointerType(
                     inner_type=ValueType(name='mjsMaterial'),
                 ),
                 doc='material defaults',
             ),
             StructFieldDecl(
                 name='pair',
                 type=PointerType(
                     inner_type=ValueType(name='mjsPair'),
                 ),
                 doc='pair defaults',
             ),
             StructFieldDecl(
                 name='equality',
                 type=PointerType(
                     inner_type=ValueType(name='mjsEquality'),
                 ),
                 doc='equality defaults',
             ),
             StructFieldDecl(
                 name='tendon',
                 type=PointerType(
                     inner_type=ValueType(name='mjsTendon'),
                 ),
                 doc='tendon defaults',
             ),
             StructFieldDecl(
                 name='actuator',
                 type=PointerType(
                     inner_type=ValueType(name='mjsActuator'),
                 ),
                 doc='actuator defaults',
             ),
         ),
     )),
    ('mjvPerturb',
     StructDecl(
         name='mjvPerturb',
         declname='struct mjvPerturb_',
         fields=(
             StructFieldDecl(
                 name='select',
                 type=ValueType(name='int'),
                 doc='selected body id; non-positive: none',
             ),
             StructFieldDecl(
                 name='flexselect',
                 type=ValueType(name='int'),
                 doc='selected flex id; negative: none',
             ),
             StructFieldDecl(
                 name='skinselect',
                 type=ValueType(name='int'),
                 doc='selected skin id; negative: none',
             ),
             StructFieldDecl(
                 name='active',
                 type=ValueType(name='int'),
                 doc='perturbation bitmask (mjtPertBit)',
             ),
             StructFieldDecl(
                 name='active2',
                 type=ValueType(name='int'),
                 doc='secondary perturbation bitmask (mjtPertBit)',
             ),
             StructFieldDecl(
                 name='refpos',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(3,),
                 ),
                 doc='reference position for selected object',
             ),
             StructFieldDecl(
                 name='refquat',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(4,),
                 ),
                 doc='reference orientation for selected object',
             ),
             StructFieldDecl(
                 name='refselpos',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(3,),
                 ),
                 doc='reference position for selection point',
             ),
             StructFieldDecl(
                 name='localpos',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(3,),
                 ),
                 doc='selection point in object coordinates',
             ),
             StructFieldDecl(
                 name='localmass',
                 type=ValueType(name='mjtNum'),
                 doc='spatial inertia at selection point',
             ),
             StructFieldDecl(
                 name='scale',
                 type=ValueType(name='mjtNum'),
                 doc='relative mouse motion-to-space scaling (set by initPerturb)',  # pylint: disable=line-too-long
             ),
         ),
     )),
    ('mjvCamera',
     StructDecl(
         name='mjvCamera',
         declname='struct mjvCamera_',
         fields=(
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='int'),
                 doc='camera type (mjtCamera)',
             ),
             StructFieldDecl(
                 name='fixedcamid',
                 type=ValueType(name='int'),
                 doc='fixed camera id',
             ),
             StructFieldDecl(
                 name='trackbodyid',
                 type=ValueType(name='int'),
                 doc='body id to track',
             ),
             StructFieldDecl(
                 name='lookat',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtNum'),
                     extents=(3,),
                 ),
                 doc='lookat point',
             ),
             StructFieldDecl(
                 name='distance',
                 type=ValueType(name='mjtNum'),
                 doc='distance to lookat point or tracked body',
             ),
             StructFieldDecl(
                 name='azimuth',
                 type=ValueType(name='mjtNum'),
                 doc='camera azimuth (deg)',
             ),
             StructFieldDecl(
                 name='elevation',
                 type=ValueType(name='mjtNum'),
                 doc='camera elevation (deg)',
             ),
             StructFieldDecl(
                 name='orthographic',
                 type=ValueType(name='int'),
                 doc='0: perspective; 1: orthographic',
             ),
         ),
     )),
    ('mjvGLCamera',
     StructDecl(
         name='mjvGLCamera',
         declname='struct mjvGLCamera_',
         fields=(
             StructFieldDecl(
                 name='pos',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='position',
             ),
             StructFieldDecl(
                 name='forward',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='forward direction',
             ),
             StructFieldDecl(
                 name='up',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='up direction',
             ),
             StructFieldDecl(
                 name='frustum_center',
                 type=ValueType(name='float'),
                 doc='hor. center (left,right set to match aspect)',
             ),
             StructFieldDecl(
                 name='frustum_width',
                 type=ValueType(name='float'),
                 doc='width (not used for rendering)',
             ),
             StructFieldDecl(
                 name='frustum_bottom',
                 type=ValueType(name='float'),
                 doc='bottom',
             ),
             StructFieldDecl(
                 name='frustum_top',
                 type=ValueType(name='float'),
                 doc='top',
             ),
             StructFieldDecl(
                 name='frustum_near',
                 type=ValueType(name='float'),
                 doc='near',
             ),
             StructFieldDecl(
                 name='frustum_far',
                 type=ValueType(name='float'),
                 doc='far',
             ),
             StructFieldDecl(
                 name='orthographic',
                 type=ValueType(name='int'),
                 doc='0: perspective; 1: orthographic',
             ),
         ),
     )),
    ('mjvGeom',
     StructDecl(
         name='mjvGeom',
         declname='struct mjvGeom_',
         fields=(
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='int'),
                 doc='geom type (mjtGeom)',
             ),
             StructFieldDecl(
                 name='dataid',
                 type=ValueType(name='int'),
                 doc='mesh, hfield or plane id; -1: none; mesh: 2*id or 2*id+1 (hull)',  # pylint: disable=line-too-long
             ),
             StructFieldDecl(
                 name='objtype',
                 type=ValueType(name='int'),
                 doc='mujoco object type; mjOBJ_UNKNOWN for decor',
             ),
             StructFieldDecl(
                 name='objid',
                 type=ValueType(name='int'),
                 doc='mujoco object id; -1 for decor',
             ),
             StructFieldDecl(
                 name='category',
                 type=ValueType(name='int'),
                 doc='visual category',
             ),
             StructFieldDecl(
                 name='matid',
                 type=ValueType(name='int'),
                 doc='material id; -1: no textured material',
             ),
             StructFieldDecl(
                 name='texcoord',
                 type=ValueType(name='int'),
                 doc='mesh or flex geom has texture coordinates',
             ),
             StructFieldDecl(
                 name='segid',
                 type=ValueType(name='int'),
                 doc='segmentation id; -1: not shown',
             ),
             StructFieldDecl(
                 name='size',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='size parameters',
             ),
             StructFieldDecl(
                 name='pos',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='Cartesian position',
             ),
             StructFieldDecl(
                 name='mat',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(9,),
                 ),
                 doc='Cartesian orientation',
             ),
             StructFieldDecl(
                 name='rgba',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='color and transparency',
             ),
             StructFieldDecl(
                 name='emission',
                 type=ValueType(name='float'),
                 doc='emission coef',
             ),
             StructFieldDecl(
                 name='specular',
                 type=ValueType(name='float'),
                 doc='specular coef',
             ),
             StructFieldDecl(
                 name='shininess',
                 type=ValueType(name='float'),
                 doc='shininess coef',
             ),
             StructFieldDecl(
                 name='reflectance',
                 type=ValueType(name='float'),
                 doc='reflectance coef',
             ),
             StructFieldDecl(
                 name='label',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(100,),
                 ),
                 doc='text label',
             ),
             StructFieldDecl(
                 name='camdist',
                 type=ValueType(name='float'),
                 doc='distance to camera (used by sorter)',
             ),
             StructFieldDecl(
                 name='modelrbound',
                 type=ValueType(name='float'),
                 doc='geom rbound from model, 0 if not model geom',
             ),
             StructFieldDecl(
                 name='transparent',
                 type=ValueType(name='mjtByte'),
                 doc='treat geom as transparent',
             ),
         ),
     )),
    ('mjvLight',
     StructDecl(
         name='mjvLight',
         declname='struct mjvLight_',
         fields=(
             StructFieldDecl(
                 name='id',
                 type=ValueType(name='int'),
                 doc='light id, -1 for headlight',
             ),
             StructFieldDecl(
                 name='pos',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='position rel. to body frame',
             ),
             StructFieldDecl(
                 name='dir',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='direction rel. to body frame',
             ),
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='int'),
                 doc='type (mjtLightType)',
             ),
             StructFieldDecl(
                 name='texid',
                 type=ValueType(name='int'),
                 doc='texture id for image lights',
             ),
             StructFieldDecl(
                 name='attenuation',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='OpenGL attenuation (quadratic model)',
             ),
             StructFieldDecl(
                 name='cutoff',
                 type=ValueType(name='float'),
                 doc='OpenGL cutoff',
             ),
             StructFieldDecl(
                 name='exponent',
                 type=ValueType(name='float'),
                 doc='OpenGL exponent',
             ),
             StructFieldDecl(
                 name='ambient',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='ambient rgb (alpha=1)',
             ),
             StructFieldDecl(
                 name='diffuse',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='diffuse rgb (alpha=1)',
             ),
             StructFieldDecl(
                 name='specular',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='specular rgb (alpha=1)',
             ),
             StructFieldDecl(
                 name='headlight',
                 type=ValueType(name='mjtByte'),
                 doc='headlight',
             ),
             StructFieldDecl(
                 name='castshadow',
                 type=ValueType(name='mjtByte'),
                 doc='does light cast shadows',
             ),
             StructFieldDecl(
                 name='bulbradius',
                 type=ValueType(name='float'),
                 doc='bulb radius for soft shadows',
             ),
             StructFieldDecl(
                 name='intensity',
                 type=ValueType(name='float'),
                 doc='intensity, in candelas',
             ),
             StructFieldDecl(
                 name='range',
                 type=ValueType(name='float'),
                 doc='range of effectiveness',
             ),
         ),
     )),
    ('mjvOption',
     StructDecl(
         name='mjvOption',
         declname='struct mjvOption_',
         fields=(
             StructFieldDecl(
                 name='label',
                 type=ValueType(name='int'),
                 doc='what objects to label (mjtLabel)',
             ),
             StructFieldDecl(
                 name='frame',
                 type=ValueType(name='int'),
                 doc='which frame to show (mjtFrame)',
             ),
             StructFieldDecl(
                 name='geomgroup',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtByte'),
                     extents=(6,),
                 ),
                 doc='geom visualization by group',
             ),
             StructFieldDecl(
                 name='sitegroup',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtByte'),
                     extents=(6,),
                 ),
                 doc='site visualization by group',
             ),
             StructFieldDecl(
                 name='jointgroup',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtByte'),
                     extents=(6,),
                 ),
                 doc='joint visualization by group',
             ),
             StructFieldDecl(
                 name='tendongroup',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtByte'),
                     extents=(6,),
                 ),
                 doc='tendon visualization by group',
             ),
             StructFieldDecl(
                 name='actuatorgroup',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtByte'),
                     extents=(6,),
                 ),
                 doc='actuator visualization by group',
             ),
             StructFieldDecl(
                 name='flexgroup',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtByte'),
                     extents=(6,),
                 ),
                 doc='flex visualization by group',
             ),
             StructFieldDecl(
                 name='skingroup',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtByte'),
                     extents=(6,),
                 ),
                 doc='skin visualization by group',
             ),
             StructFieldDecl(
                 name='flags',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtByte'),
                     extents=(31,),
                 ),
                 doc='visualization flags (indexed by mjtVisFlag)',
             ),
             StructFieldDecl(
                 name='bvh_depth',
                 type=ValueType(name='int'),
                 doc='depth of the bounding volume hierarchy to be visualized',
             ),
             StructFieldDecl(
                 name='flex_layer',
                 type=ValueType(name='int'),
                 doc='element layer to be visualized for 3D flex',
             ),
         ),
     )),
    ('mjvScene',
     StructDecl(
         name='mjvScene',
         declname='struct mjvScene_',
         fields=(
             StructFieldDecl(
                 name='maxgeom',
                 type=ValueType(name='int'),
                 doc='size of allocated geom buffer',
             ),
             StructFieldDecl(
                 name='ngeom',
                 type=ValueType(name='int'),
                 doc='number of geoms currently in buffer',
             ),
             StructFieldDecl(
                 name='geoms',
                 type=PointerType(
                     inner_type=ValueType(name='mjvGeom'),
                 ),
                 doc='buffer for geoms (ngeom)',
             ),
             StructFieldDecl(
                 name='geomorder',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='buffer for ordering geoms by distance to camera (ngeom)',
             ),
             StructFieldDecl(
                 name='nflex',
                 type=ValueType(name='int'),
                 doc='number of flexes',
             ),
             StructFieldDecl(
                 name='flexedgeadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of flex edges (nflex)',
             ),
             StructFieldDecl(
                 name='flexedgenum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of edges in flex (nflex)',
             ),
             StructFieldDecl(
                 name='flexvertadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of flex vertices (nflex)',
             ),
             StructFieldDecl(
                 name='flexvertnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of vertices in flex (nflex)',
             ),
             StructFieldDecl(
                 name='flexfaceadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of flex faces (nflex)',
             ),
             StructFieldDecl(
                 name='flexfacenum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of flex faces allocated (nflex)',
             ),
             StructFieldDecl(
                 name='flexfaceused',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of flex faces currently in use (nflex)',
             ),
             StructFieldDecl(
                 name='flexedge',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='flex edge data (2*nflexedge)',
             ),
             StructFieldDecl(
                 name='flexvert',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='flex vertices (3*nflexvert)',
             ),
             StructFieldDecl(
                 name='flexface',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='flex faces vertices (9*sum(flexfacenum))',
             ),
             StructFieldDecl(
                 name='flexnormal',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='flex face normals (9*sum(flexfacenum))',
             ),
             StructFieldDecl(
                 name='flextexcoord',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='flex face texture coordinates (6*sum(flexfacenum))',
             ),
             StructFieldDecl(
                 name='flexvertopt',
                 type=ValueType(name='mjtByte'),
                 doc='copy of mjVIS_FLEXVERT mjvOption flag',
             ),
             StructFieldDecl(
                 name='flexedgeopt',
                 type=ValueType(name='mjtByte'),
                 doc='copy of mjVIS_FLEXEDGE mjvOption flag',
             ),
             StructFieldDecl(
                 name='flexfaceopt',
                 type=ValueType(name='mjtByte'),
                 doc='copy of mjVIS_FLEXFACE mjvOption flag',
             ),
             StructFieldDecl(
                 name='flexskinopt',
                 type=ValueType(name='mjtByte'),
                 doc='copy of mjVIS_FLEXSKIN mjvOption flag',
             ),
             StructFieldDecl(
                 name='nskin',
                 type=ValueType(name='int'),
                 doc='number of skins',
             ),
             StructFieldDecl(
                 name='skinfacenum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of faces in skin (nskin)',
             ),
             StructFieldDecl(
                 name='skinvertadr',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='address of skin vertices (nskin)',
             ),
             StructFieldDecl(
                 name='skinvertnum',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='number of vertices in skin (nskin)',
             ),
             StructFieldDecl(
                 name='skinvert',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='skin vertex data (3*nskinvert)',
             ),
             StructFieldDecl(
                 name='skinnormal',
                 type=PointerType(
                     inner_type=ValueType(name='float'),
                 ),
                 doc='skin normal data (3*nskinvert)',
             ),
             StructFieldDecl(
                 name='nlight',
                 type=ValueType(name='int'),
                 doc='number of lights currently in buffer',
             ),
             StructFieldDecl(
                 name='lights',
                 type=ArrayType(
                     inner_type=ValueType(name='mjvLight'),
                     extents=(100,),
                 ),
                 doc='buffer for lights (nlight)',
             ),
             StructFieldDecl(
                 name='camera',
                 type=ArrayType(
                     inner_type=ValueType(name='mjvGLCamera'),
                     extents=(2,),
                 ),
                 doc='left and right camera',
             ),
             StructFieldDecl(
                 name='enabletransform',
                 type=ValueType(name='mjtByte'),
                 doc='enable model transformation',
             ),
             StructFieldDecl(
                 name='translate',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='model translation',
             ),
             StructFieldDecl(
                 name='rotate',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='model quaternion rotation',
             ),
             StructFieldDecl(
                 name='scale',
                 type=ValueType(name='float'),
                 doc='model scaling',
             ),
             StructFieldDecl(
                 name='stereo',
                 type=ValueType(name='int'),
                 doc='stereoscopic rendering (mjtStereo)',
             ),
             StructFieldDecl(
                 name='flags',
                 type=ArrayType(
                     inner_type=ValueType(name='mjtByte'),
                     extents=(11,),
                 ),
                 doc='rendering flags (indexed by mjtRndFlag)',
             ),
             StructFieldDecl(
                 name='framewidth',
                 type=ValueType(name='int'),
                 doc='frame pixel width; 0: disable framing',
             ),
             StructFieldDecl(
                 name='framergb',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='frame color',
             ),
             StructFieldDecl(
                 name='status',
                 type=ValueType(name='int'),
                 doc='status; 0: ok, 1: geoms exhausted',
             ),
         ),
     )),
    ('mjvFigure',
     StructDecl(
         name='mjvFigure',
         declname='struct mjvFigure_',
         fields=(
             StructFieldDecl(
                 name='flg_legend',
                 type=ValueType(name='int'),
                 doc='show legend',
             ),
             StructFieldDecl(
                 name='flg_ticklabel',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(2,),
                 ),
                 doc='show grid tick labels (x,y)',
             ),
             StructFieldDecl(
                 name='flg_extend',
                 type=ValueType(name='int'),
                 doc='automatically extend axis ranges to fit data',
             ),
             StructFieldDecl(
                 name='flg_barplot',
                 type=ValueType(name='int'),
                 doc='isolated line segments (i.e. GL_LINES)',
             ),
             StructFieldDecl(
                 name='flg_selection',
                 type=ValueType(name='int'),
                 doc='vertical selection line',
             ),
             StructFieldDecl(
                 name='flg_symmetric',
                 type=ValueType(name='int'),
                 doc='symmetric y-axis',
             ),
             StructFieldDecl(
                 name='linewidth',
                 type=ValueType(name='float'),
                 doc='line width',
             ),
             StructFieldDecl(
                 name='gridwidth',
                 type=ValueType(name='float'),
                 doc='grid line width',
             ),
             StructFieldDecl(
                 name='gridsize',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(2,),
                 ),
                 doc='number of grid points in (x,y)',
             ),
             StructFieldDecl(
                 name='gridrgb',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='grid line rgb',
             ),
             StructFieldDecl(
                 name='figurergba',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='figure color and alpha',
             ),
             StructFieldDecl(
                 name='panergba',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='pane color and alpha',
             ),
             StructFieldDecl(
                 name='legendrgba',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='legend color and alpha',
             ),
             StructFieldDecl(
                 name='textrgb',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='text color',
             ),
             StructFieldDecl(
                 name='linergb',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(100, 3),
                 ),
                 doc='line colors',
             ),
             StructFieldDecl(
                 name='range',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(2, 2),
                 ),
                 doc='axis ranges; (min>=max) automatic',
             ),
             StructFieldDecl(
                 name='xformat',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(20,),
                 ),
                 doc='x-tick label format for sprintf',
             ),
             StructFieldDecl(
                 name='yformat',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(20,),
                 ),
                 doc='y-tick label format for sprintf',
             ),
             StructFieldDecl(
                 name='minwidth',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(20,),
                 ),
                 doc='string used to determine min y-tick width',
             ),
             StructFieldDecl(
                 name='title',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(1000,),
                 ),
                 doc='figure title; subplots separated with 2+ spaces',
             ),
             StructFieldDecl(
                 name='xlabel',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(100,),
                 ),
                 doc='x-axis label',
             ),
             StructFieldDecl(
                 name='linename',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(100, 100),
                 ),
                 doc='line names for legend',
             ),
             StructFieldDecl(
                 name='legendoffset',
                 type=ValueType(name='int'),
                 doc='number of lines to offset legend',
             ),
             StructFieldDecl(
                 name='subplot',
                 type=ValueType(name='int'),
                 doc='selected subplot (for title rendering)',
             ),
             StructFieldDecl(
                 name='highlight',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(2,),
                 ),
                 doc='if point is in legend rect, highlight line',
             ),
             StructFieldDecl(
                 name='highlightid',
                 type=ValueType(name='int'),
                 doc='if id>=0 and no point, highlight id',
             ),
             StructFieldDecl(
                 name='selection',
                 type=ValueType(name='float'),
                 doc='selection line x-value',
             ),
             StructFieldDecl(
                 name='linepnt',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(100,),
                 ),
                 doc='number of points in line; (0) disable',
             ),
             StructFieldDecl(
                 name='linedata',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(100, 2002),
                 ),
                 doc='line data (x,y)',
             ),
             StructFieldDecl(
                 name='xaxispixel',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(2,),
                 ),
                 doc='range of x-axis in pixels',
             ),
             StructFieldDecl(
                 name='yaxispixel',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(2,),
                 ),
                 doc='range of y-axis in pixels',
             ),
             StructFieldDecl(
                 name='xaxisdata',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(2,),
                 ),
                 doc='range of x-axis in data units',
             ),
             StructFieldDecl(
                 name='yaxisdata',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(2,),
                 ),
                 doc='range of y-axis in data units',
             ),
         ),
     )),
    ('mjSDF',
     StructDecl(
         name='mjSDF',
         declname='struct mjSDF_',
         fields=(
             StructFieldDecl(
                 name='plugin',
                 type=PointerType(
                     inner_type=PointerType(
                         inner_type=ValueType(name='mjpPlugin', is_const=True),
                     ),
                 ),
                 doc='',
             ),
             StructFieldDecl(
                 name='id',
                 type=PointerType(
                     inner_type=ValueType(name='int'),
                 ),
                 doc='',
             ),
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='mjtSDFType'),
                 doc='',
             ),
             StructFieldDecl(
                 name='relpos',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='',
             ),
             StructFieldDecl(
                 name='relmat',
                 type=PointerType(
                     inner_type=ValueType(name='mjtNum'),
                 ),
                 doc='',
             ),
             StructFieldDecl(
                 name='geomtype',
                 type=PointerType(
                     inner_type=ValueType(name='mjtGeom'),
                 ),
                 doc='',
             ),
         ),
     )),
    ('mjrRect',
     StructDecl(
         name='mjrRect',
         declname='struct mjrRect_',
         fields=(
             StructFieldDecl(
                 name='left',
                 type=ValueType(name='int'),
                 doc='left (usually 0)',
             ),
             StructFieldDecl(
                 name='bottom',
                 type=ValueType(name='int'),
                 doc='bottom (usually 0)',
             ),
             StructFieldDecl(
                 name='width',
                 type=ValueType(name='int'),
                 doc='width (usually buffer width)',
             ),
             StructFieldDecl(
                 name='height',
                 type=ValueType(name='int'),
                 doc='height (usually buffer height)',
             ),
         ),
     )),
    ('mjrContext',
     StructDecl(
         name='mjrContext',
         declname='struct mjrContext_',
         fields=(
             StructFieldDecl(
                 name='lineWidth',
                 type=ValueType(name='float'),
                 doc='line width for wireframe rendering',
             ),
             StructFieldDecl(
                 name='shadowClip',
                 type=ValueType(name='float'),
                 doc='clipping radius for directional lights',
             ),
             StructFieldDecl(
                 name='shadowScale',
                 type=ValueType(name='float'),
                 doc='fraction of light cutoff for spot lights',
             ),
             StructFieldDecl(
                 name='fogStart',
                 type=ValueType(name='float'),
                 doc='fog start = stat.extent * vis.map.fogstart',
             ),
             StructFieldDecl(
                 name='fogEnd',
                 type=ValueType(name='float'),
                 doc='fog end = stat.extent * vis.map.fogend',
             ),
             StructFieldDecl(
                 name='fogRGBA',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(4,),
                 ),
                 doc='fog rgba',
             ),
             StructFieldDecl(
                 name='shadowSize',
                 type=ValueType(name='int'),
                 doc='size of shadow map texture',
             ),
             StructFieldDecl(
                 name='offWidth',
                 type=ValueType(name='int'),
                 doc='width of offscreen buffer',
             ),
             StructFieldDecl(
                 name='offHeight',
                 type=ValueType(name='int'),
                 doc='height of offscreen buffer',
             ),
             StructFieldDecl(
                 name='offSamples',
                 type=ValueType(name='int'),
                 doc='number of offscreen buffer multisamples',
             ),
             StructFieldDecl(
                 name='fontScale',
                 type=ValueType(name='int'),
                 doc='font scale',
             ),
             StructFieldDecl(
                 name='auxWidth',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(10,),
                 ),
                 doc='auxiliary buffer width',
             ),
             StructFieldDecl(
                 name='auxHeight',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(10,),
                 ),
                 doc='auxiliary buffer height',
             ),
             StructFieldDecl(
                 name='auxSamples',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(10,),
                 ),
                 doc='auxiliary buffer multisamples',
             ),
             StructFieldDecl(
                 name='offFBO',
                 type=ValueType(name='unsigned int'),
                 doc='offscreen framebuffer object',
             ),
             StructFieldDecl(
                 name='offFBO_r',
                 type=ValueType(name='unsigned int'),
                 doc='offscreen framebuffer for resolving multisamples',
             ),
             StructFieldDecl(
                 name='offColor',
                 type=ValueType(name='unsigned int'),
                 doc='offscreen color buffer',
             ),
             StructFieldDecl(
                 name='offColor_r',
                 type=ValueType(name='unsigned int'),
                 doc='offscreen color buffer for resolving multisamples',
             ),
             StructFieldDecl(
                 name='offDepthStencil',
                 type=ValueType(name='unsigned int'),
                 doc='offscreen depth and stencil buffer',
             ),
             StructFieldDecl(
                 name='offDepthStencil_r',
                 type=ValueType(name='unsigned int'),
                 doc='offscreen depth and stencil buffer for multisamples',
             ),
             StructFieldDecl(
                 name='shadowFBO',
                 type=ValueType(name='unsigned int'),
                 doc='shadow map framebuffer object',
             ),
             StructFieldDecl(
                 name='shadowTex',
                 type=ValueType(name='unsigned int'),
                 doc='shadow map texture',
             ),
             StructFieldDecl(
                 name='auxFBO',
                 type=ArrayType(
                     inner_type=ValueType(name='unsigned int'),
                     extents=(10,),
                 ),
                 doc='auxiliary framebuffer object',
             ),
             StructFieldDecl(
                 name='auxFBO_r',
                 type=ArrayType(
                     inner_type=ValueType(name='unsigned int'),
                     extents=(10,),
                 ),
                 doc='auxiliary framebuffer object for resolving',
             ),
             StructFieldDecl(
                 name='auxColor',
                 type=ArrayType(
                     inner_type=ValueType(name='unsigned int'),
                     extents=(10,),
                 ),
                 doc='auxiliary color buffer',
             ),
             StructFieldDecl(
                 name='auxColor_r',
                 type=ArrayType(
                     inner_type=ValueType(name='unsigned int'),
                     extents=(10,),
                 ),
                 doc='auxiliary color buffer for resolving',
             ),
             StructFieldDecl(
                 name='mat_texid',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(10000,),
                 ),
                 doc='material texture ids (-1: no texture)',
             ),
             StructFieldDecl(
                 name='mat_texuniform',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(1000,),
                 ),
                 doc='uniform cube mapping',
             ),
             StructFieldDecl(
                 name='mat_texrepeat',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(2000,),
                 ),
                 doc='texture repetition for 2d mapping',
             ),
             StructFieldDecl(
                 name='ntexture',
                 type=ValueType(name='int'),
                 doc='number of allocated textures',
             ),
             StructFieldDecl(
                 name='textureType',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(1000,),
                 ),
                 doc='type of texture (mjtTexture) (ntexture)',
             ),
             StructFieldDecl(
                 name='texture',
                 type=ArrayType(
                     inner_type=ValueType(name='unsigned int'),
                     extents=(1000,),
                 ),
                 doc='texture names',
             ),
             StructFieldDecl(
                 name='basePlane',
                 type=ValueType(name='unsigned int'),
                 doc='all planes from model',
             ),
             StructFieldDecl(
                 name='baseMesh',
                 type=ValueType(name='unsigned int'),
                 doc='all meshes from model',
             ),
             StructFieldDecl(
                 name='baseHField',
                 type=ValueType(name='unsigned int'),
                 doc='all height fields from model',
             ),
             StructFieldDecl(
                 name='baseBuiltin',
                 type=ValueType(name='unsigned int'),
                 doc='all builtin geoms, with quality from model',
             ),
             StructFieldDecl(
                 name='baseFontNormal',
                 type=ValueType(name='unsigned int'),
                 doc='normal font',
             ),
             StructFieldDecl(
                 name='baseFontShadow',
                 type=ValueType(name='unsigned int'),
                 doc='shadow font',
             ),
             StructFieldDecl(
                 name='baseFontBig',
                 type=ValueType(name='unsigned int'),
                 doc='big font',
             ),
             StructFieldDecl(
                 name='rangePlane',
                 type=ValueType(name='int'),
                 doc='all planes from model',
             ),
             StructFieldDecl(
                 name='rangeMesh',
                 type=ValueType(name='int'),
                 doc='all meshes from model',
             ),
             StructFieldDecl(
                 name='rangeHField',
                 type=ValueType(name='int'),
                 doc='all hfields from model',
             ),
             StructFieldDecl(
                 name='rangeBuiltin',
                 type=ValueType(name='int'),
                 doc='all builtin geoms, with quality from model',
             ),
             StructFieldDecl(
                 name='rangeFont',
                 type=ValueType(name='int'),
                 doc='all characters in font',
             ),
             StructFieldDecl(
                 name='nskin',
                 type=ValueType(name='int'),
                 doc='number of skins',
             ),
             StructFieldDecl(
                 name='skinvertVBO',
                 type=PointerType(
                     inner_type=ValueType(name='unsigned int'),
                 ),
                 doc='skin vertex position VBOs (nskin)',
             ),
             StructFieldDecl(
                 name='skinnormalVBO',
                 type=PointerType(
                     inner_type=ValueType(name='unsigned int'),
                 ),
                 doc='skin vertex normal VBOs (nskin)',
             ),
             StructFieldDecl(
                 name='skintexcoordVBO',
                 type=PointerType(
                     inner_type=ValueType(name='unsigned int'),
                 ),
                 doc='skin vertex texture coordinate VBOs (nskin)',
             ),
             StructFieldDecl(
                 name='skinfaceVBO',
                 type=PointerType(
                     inner_type=ValueType(name='unsigned int'),
                 ),
                 doc='skin face index VBOs (nskin)',
             ),
             StructFieldDecl(
                 name='charWidth',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(127,),
                 ),
                 doc='character widths: normal and shadow',
             ),
             StructFieldDecl(
                 name='charWidthBig',
                 type=ArrayType(
                     inner_type=ValueType(name='int'),
                     extents=(127,),
                 ),
                 doc='character widths: big',
             ),
             StructFieldDecl(
                 name='charHeight',
                 type=ValueType(name='int'),
                 doc='character heights: normal and shadow',
             ),
             StructFieldDecl(
                 name='charHeightBig',
                 type=ValueType(name='int'),
                 doc='character heights: big',
             ),
             StructFieldDecl(
                 name='glInitialized',
                 type=ValueType(name='int'),
                 doc='is OpenGL initialized',
             ),
             StructFieldDecl(
                 name='windowAvailable',
                 type=ValueType(name='int'),
                 doc='is default/window framebuffer available',
             ),
             StructFieldDecl(
                 name='windowSamples',
                 type=ValueType(name='int'),
                 doc='number of samples for default/window framebuffer',
             ),
             StructFieldDecl(
                 name='windowStereo',
                 type=ValueType(name='int'),
                 doc='is stereo available for default/window framebuffer',
             ),
             StructFieldDecl(
                 name='windowDoublebuffer',
                 type=ValueType(name='int'),
                 doc='is default/window framebuffer double buffered',
             ),
             StructFieldDecl(
                 name='currentBuffer',
                 type=ValueType(name='int'),
                 doc='currently active framebuffer: mjFB_WINDOW or mjFB_OFFSCREEN',  # pylint: disable=line-too-long
             ),
             StructFieldDecl(
                 name='readPixelFormat',
                 type=ValueType(name='int'),
                 doc='default color pixel format for mjr_readPixels',
             ),
             StructFieldDecl(
                 name='readDepthMap',
                 type=ValueType(name='int'),
                 doc='depth mapping: mjDEPTH_ZERONEAR or mjDEPTH_ZEROFAR',
             ),
         ),
     )),
    ('mjuiState',
     StructDecl(
         name='mjuiState',
         declname='struct mjuiState_',
         fields=(
             StructFieldDecl(
                 name='nrect',
                 type=ValueType(name='int'),
                 doc='number of rectangles used',
             ),
             StructFieldDecl(
                 name='rect',
                 type=ArrayType(
                     inner_type=ValueType(name='mjrRect'),
                     extents=(25,),
                 ),
                 doc='rectangles (index 0: entire window)',
             ),
             StructFieldDecl(
                 name='userdata',
                 type=PointerType(
                     inner_type=ValueType(name='void'),
                 ),
                 doc='pointer to user data (for callbacks)',
             ),
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='int'),
                 doc='(type mjtEvent)',
             ),
             StructFieldDecl(
                 name='left',
                 type=ValueType(name='int'),
                 doc='is left button down',
             ),
             StructFieldDecl(
                 name='right',
                 type=ValueType(name='int'),
                 doc='is right button down',
             ),
             StructFieldDecl(
                 name='middle',
                 type=ValueType(name='int'),
                 doc='is middle button down',
             ),
             StructFieldDecl(
                 name='doubleclick',
                 type=ValueType(name='int'),
                 doc='is last press a double click',
             ),
             StructFieldDecl(
                 name='button',
                 type=ValueType(name='int'),
                 doc='which button was pressed (mjtButton)',
             ),
             StructFieldDecl(
                 name='buttontime',
                 type=ValueType(name='double'),
                 doc='time of last button press',
             ),
             StructFieldDecl(
                 name='x',
                 type=ValueType(name='double'),
                 doc='x position',
             ),
             StructFieldDecl(
                 name='y',
                 type=ValueType(name='double'),
                 doc='y position',
             ),
             StructFieldDecl(
                 name='dx',
                 type=ValueType(name='double'),
                 doc='x displacement',
             ),
             StructFieldDecl(
                 name='dy',
                 type=ValueType(name='double'),
                 doc='y displacement',
             ),
             StructFieldDecl(
                 name='sx',
                 type=ValueType(name='double'),
                 doc='x scroll',
             ),
             StructFieldDecl(
                 name='sy',
                 type=ValueType(name='double'),
                 doc='y scroll',
             ),
             StructFieldDecl(
                 name='control',
                 type=ValueType(name='int'),
                 doc='is control down',
             ),
             StructFieldDecl(
                 name='shift',
                 type=ValueType(name='int'),
                 doc='is shift down',
             ),
             StructFieldDecl(
                 name='alt',
                 type=ValueType(name='int'),
                 doc='is alt down',
             ),
             StructFieldDecl(
                 name='key',
                 type=ValueType(name='int'),
                 doc='which key was pressed',
             ),
             StructFieldDecl(
                 name='keytime',
                 type=ValueType(name='double'),
                 doc='time of last key press',
             ),
             StructFieldDecl(
                 name='mouserect',
                 type=ValueType(name='int'),
                 doc='which rectangle contains mouse',
             ),
             StructFieldDecl(
                 name='dragrect',
                 type=ValueType(name='int'),
                 doc='which rectangle is dragged with mouse',
             ),
             StructFieldDecl(
                 name='dragbutton',
                 type=ValueType(name='int'),
                 doc='which button started drag (mjtButton)',
             ),
             StructFieldDecl(
                 name='dropcount',
                 type=ValueType(name='int'),
                 doc='number of files dropped',
             ),
             StructFieldDecl(
                 name='droppaths',
                 type=PointerType(
                     inner_type=PointerType(
                         inner_type=ValueType(name='char', is_const=True),
                     ),
                 ),
                 doc='paths to files dropped',
             ),
         ),
     )),
    ('mjuiThemeSpacing',
     StructDecl(
         name='mjuiThemeSpacing',
         declname='struct mjuiThemeSpacing_',
         fields=(
             StructFieldDecl(
                 name='total',
                 type=ValueType(name='int'),
                 doc='total width',
             ),
             StructFieldDecl(
                 name='scroll',
                 type=ValueType(name='int'),
                 doc='scrollbar width',
             ),
             StructFieldDecl(
                 name='label',
                 type=ValueType(name='int'),
                 doc='label width',
             ),
             StructFieldDecl(
                 name='section',
                 type=ValueType(name='int'),
                 doc='section gap',
             ),
             StructFieldDecl(
                 name='cornersect',
                 type=ValueType(name='int'),
                 doc='corner radius for section',
             ),
             StructFieldDecl(
                 name='cornersep',
                 type=ValueType(name='int'),
                 doc='corner radius for separator',
             ),
             StructFieldDecl(
                 name='itemside',
                 type=ValueType(name='int'),
                 doc='item side gap',
             ),
             StructFieldDecl(
                 name='itemmid',
                 type=ValueType(name='int'),
                 doc='item middle gap',
             ),
             StructFieldDecl(
                 name='itemver',
                 type=ValueType(name='int'),
                 doc='item vertical gap',
             ),
             StructFieldDecl(
                 name='texthor',
                 type=ValueType(name='int'),
                 doc='text horizontal gap',
             ),
             StructFieldDecl(
                 name='textver',
                 type=ValueType(name='int'),
                 doc='text vertical gap',
             ),
             StructFieldDecl(
                 name='linescroll',
                 type=ValueType(name='int'),
                 doc='number of pixels to scroll',
             ),
             StructFieldDecl(
                 name='samples',
                 type=ValueType(name='int'),
                 doc='number of multisamples',
             ),
         ),
     )),
    ('mjuiThemeColor',
     StructDecl(
         name='mjuiThemeColor',
         declname='struct mjuiThemeColor_',
         fields=(
             StructFieldDecl(
                 name='master',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='master background',
             ),
             StructFieldDecl(
                 name='thumb',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='scrollbar thumb',
             ),
             StructFieldDecl(
                 name='secttitle',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='section title',
             ),
             StructFieldDecl(
                 name='secttitle2',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='section title: bottom color',
             ),
             StructFieldDecl(
                 name='secttitleuncheck',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='section title with unchecked box',
             ),
             StructFieldDecl(
                 name='secttitleuncheck2',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='section title with unchecked box: bottom color',
             ),
             StructFieldDecl(
                 name='secttitlecheck',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='section title with checked box',
             ),
             StructFieldDecl(
                 name='secttitlecheck2',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='section title with checked box: bottom color',
             ),
             StructFieldDecl(
                 name='sectfont',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='section font',
             ),
             StructFieldDecl(
                 name='sectsymbol',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='section symbol',
             ),
             StructFieldDecl(
                 name='sectpane',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='section pane',
             ),
             StructFieldDecl(
                 name='separator',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='separator title',
             ),
             StructFieldDecl(
                 name='separator2',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='separator title: bottom color',
             ),
             StructFieldDecl(
                 name='shortcut',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='shortcut background',
             ),
             StructFieldDecl(
                 name='fontactive',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='font active',
             ),
             StructFieldDecl(
                 name='fontinactive',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='font inactive',
             ),
             StructFieldDecl(
                 name='decorinactive',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='decor inactive',
             ),
             StructFieldDecl(
                 name='decorinactive2',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='inactive slider color 2',
             ),
             StructFieldDecl(
                 name='button',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='button',
             ),
             StructFieldDecl(
                 name='check',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='check',
             ),
             StructFieldDecl(
                 name='radio',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='radio',
             ),
             StructFieldDecl(
                 name='select',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='select',
             ),
             StructFieldDecl(
                 name='select2',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='select pane',
             ),
             StructFieldDecl(
                 name='slider',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='slider',
             ),
             StructFieldDecl(
                 name='slider2',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='slider color 2',
             ),
             StructFieldDecl(
                 name='edit',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='edit',
             ),
             StructFieldDecl(
                 name='edit2',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='edit invalid',
             ),
             StructFieldDecl(
                 name='cursor',
                 type=ArrayType(
                     inner_type=ValueType(name='float'),
                     extents=(3,),
                 ),
                 doc='edit cursor',
             ),
         ),
     )),
    ('mjuiItem',
     StructDecl(
         name='mjuiItem',
         declname='struct mjuiItem_',
         fields=(
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='int'),
                 doc='type (mjtItem)',
             ),
             StructFieldDecl(
                 name='name',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(40,),
                 ),
                 doc='name',
             ),
             StructFieldDecl(
                 name='state',
                 type=ValueType(name='int'),
                 doc='0: disable, 1: enable, 2+: use predicate',
             ),
             StructFieldDecl(
                 name='pdata',
                 type=PointerType(
                     inner_type=ValueType(name='void'),
                 ),
                 doc='data pointer (type-specific)',
             ),
             StructFieldDecl(
                 name='sectionid',
                 type=ValueType(name='int'),
                 doc='id of section containing item',
             ),
             StructFieldDecl(
                 name='itemid',
                 type=ValueType(name='int'),
                 doc='id of item within section',
             ),
             StructFieldDecl(
                 name='userid',
                 type=ValueType(name='int'),
                 doc='user-supplied id (for event handling)',
             ),
             AnonymousUnionDecl(
                 fields=(
                     StructFieldDecl(
                         name='single',
                         type=ValueType(name='struct mjuiItemSingle_'),
                         doc='check and button',
                     ),
                     StructFieldDecl(
                         name='multi',
                         type=ValueType(name='struct mjuiItemMulti_'),
                         doc='static, radio and select',
                     ),
                     StructFieldDecl(
                         name='slider',
                         type=ValueType(name='struct mjuiItemSlider_'),
                         doc='slider',
                     ),
                     StructFieldDecl(
                         name='edit',
                         type=ValueType(name='struct mjuiItemEdit_'),
                         doc='edit',
                     ),
                 ),
             ),
             StructFieldDecl(
                 name='rect',
                 type=ValueType(name='mjrRect'),
                 doc='rectangle occupied by item',
             ),
             StructFieldDecl(
                 name='skip',
                 type=ValueType(name='int'),
                 doc='item skipped due to closed separator',
             ),
         ),
     )),
    ('mjuiSection',
     StructDecl(
         name='mjuiSection',
         declname='struct mjuiSection_',
         fields=(
             StructFieldDecl(
                 name='name',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(40,),
                 ),
                 doc='name',
             ),
             StructFieldDecl(
                 name='state',
                 type=ValueType(name='int'),
                 doc='section state (mjtSection)',
             ),
             StructFieldDecl(
                 name='modifier',
                 type=ValueType(name='int'),
                 doc='0: none, 1: control, 2: shift; 4: alt',
             ),
             StructFieldDecl(
                 name='shortcut',
                 type=ValueType(name='int'),
                 doc='shortcut key; 0: undefined',
             ),
             StructFieldDecl(
                 name='checkbox',
                 type=ValueType(name='int'),
                 doc='0: none, 1: unchecked, 2: checked',
             ),
             StructFieldDecl(
                 name='nitem',
                 type=ValueType(name='int'),
                 doc='number of items in use',
             ),
             StructFieldDecl(
                 name='item',
                 type=ArrayType(
                     inner_type=ValueType(name='mjuiItem'),
                     extents=(200,),
                 ),
                 doc='preallocated array of items',
             ),
             StructFieldDecl(
                 name='rtitle',
                 type=ValueType(name='mjrRect'),
                 doc='rectangle occupied by title',
             ),
             StructFieldDecl(
                 name='rcontent',
                 type=ValueType(name='mjrRect'),
                 doc='rectangle occupied by content',
             ),
             StructFieldDecl(
                 name='lastclick',
                 type=ValueType(name='int'),
                 doc='last mouse click over this section',
             ),
         ),
     )),
    ('mjUI',
     StructDecl(
         name='mjUI',
         declname='struct mjUI_',
         fields=(
             StructFieldDecl(
                 name='spacing',
                 type=ValueType(name='mjuiThemeSpacing'),
                 doc='UI theme spacing',
             ),
             StructFieldDecl(
                 name='color',
                 type=ValueType(name='mjuiThemeColor'),
                 doc='UI theme color',
             ),
             StructFieldDecl(
                 name='predicate',
                 type=ValueType(name='mjfItemEnable'),
                 doc='callback to set item state programmatically',
             ),
             StructFieldDecl(
                 name='userdata',
                 type=PointerType(
                     inner_type=ValueType(name='void'),
                 ),
                 doc='pointer to user data (passed to predicate)',
             ),
             StructFieldDecl(
                 name='rectid',
                 type=ValueType(name='int'),
                 doc='index of this ui rectangle in mjuiState',
             ),
             StructFieldDecl(
                 name='auxid',
                 type=ValueType(name='int'),
                 doc='aux buffer index of this ui',
             ),
             StructFieldDecl(
                 name='radiocol',
                 type=ValueType(name='int'),
                 doc='number of radio columns (0 defaults to 2)',
             ),
             StructFieldDecl(
                 name='width',
                 type=ValueType(name='int'),
                 doc='width',
             ),
             StructFieldDecl(
                 name='height',
                 type=ValueType(name='int'),
                 doc='current height',
             ),
             StructFieldDecl(
                 name='maxheight',
                 type=ValueType(name='int'),
                 doc='height when all sections open',
             ),
             StructFieldDecl(
                 name='scroll',
                 type=ValueType(name='int'),
                 doc='scroll from top of UI',
             ),
             StructFieldDecl(
                 name='mousesect',
                 type=ValueType(name='int'),
                 doc='0: none, -1: scroll, otherwise 1+section',
             ),
             StructFieldDecl(
                 name='mouseitem',
                 type=ValueType(name='int'),
                 doc='item within section',
             ),
             StructFieldDecl(
                 name='mousehelp',
                 type=ValueType(name='int'),
                 doc='help button down: print shortcuts',
             ),
             StructFieldDecl(
                 name='mouseclicks',
                 type=ValueType(name='int'),
                 doc='number of mouse clicks over UI',
             ),
             StructFieldDecl(
                 name='mousesectcheck',
                 type=ValueType(name='int'),
                 doc='0: none, otherwise 1+section',
             ),
             StructFieldDecl(
                 name='editsect',
                 type=ValueType(name='int'),
                 doc='0: none, otherwise 1+section',
             ),
             StructFieldDecl(
                 name='edititem',
                 type=ValueType(name='int'),
                 doc='item within section',
             ),
             StructFieldDecl(
                 name='editcursor',
                 type=ValueType(name='int'),
                 doc='cursor position',
             ),
             StructFieldDecl(
                 name='editscroll',
                 type=ValueType(name='int'),
                 doc='horizontal scroll',
             ),
             StructFieldDecl(
                 name='edittext',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(300,),
                 ),
                 doc='current text',
             ),
             StructFieldDecl(
                 name='editchanged',
                 type=PointerType(
                     inner_type=ValueType(name='mjuiItem'),
                 ),
                 doc='pointer to changed edit in last mjui_event',
             ),
             StructFieldDecl(
                 name='nsect',
                 type=ValueType(name='int'),
                 doc='number of sections in use',
             ),
             StructFieldDecl(
                 name='sect',
                 type=ArrayType(
                     inner_type=ValueType(name='mjuiSection'),
                     extents=(10,),
                 ),
                 doc='preallocated array of sections',
             ),
         ),
     )),
    ('mjuiDef',
     StructDecl(
         name='mjuiDef',
         declname='struct mjuiDef_',
         fields=(
             StructFieldDecl(
                 name='type',
                 type=ValueType(name='int'),
                 doc='type (mjtItem); -1: section',
             ),
             StructFieldDecl(
                 name='name',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(40,),
                 ),
                 doc='name',
             ),
             StructFieldDecl(
                 name='state',
                 type=ValueType(name='int'),
                 doc='state',
             ),
             StructFieldDecl(
                 name='pdata',
                 type=PointerType(
                     inner_type=ValueType(name='void'),
                 ),
                 doc='pointer to data',
             ),
             StructFieldDecl(
                 name='other',
                 type=ArrayType(
                     inner_type=ValueType(name='char'),
                     extents=(300,),
                 ),
                 doc='string with type-specific properties',
             ),
             StructFieldDecl(
                 name='otherint',
                 type=ValueType(name='int'),
                 doc='int with type-specific properties',
             ),
         ),
     )),
])
