/* scene.h
Copyright (C) 2005,2006,2007 Eugene K. Ressler, Jr.
This file is part of Sketch, a small, simple system for making
3d drawings with LaTeX and the PSTricks or TikZ package.
Sketch is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
Sketch is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Sketch; see the file COPYING.txt. If not, see
http://www.gnu.org/copyleft */
#ifndef __SCENE_H
#define __SCENE_H
#include "opts.h"
#include "error.h"
#include "geometry.h"
#include "expr.h"
#include "bsp.h"
#include "dynarray.h"
#include "global.h"
typedef struct point_list_3d_t
{
DYNAMIC_2D_ARRAY_FIELDS (POINT_3D, v, n_pts);
}
POINT_LIST_3D;
DECLARE_DYNAMIC_2D_ARRAY_PROTOS (POINT_LIST_3D, POINT_3D, FLOAT,
point_list_3d, v, n_pts)
typedef struct transform_list_t
{
DYNAMIC_2D_ARRAY_FIELDS (TRANSFORM, xf, n_xfs);
}
TRANSFORM_LIST;
DECLARE_DYNAMIC_2D_ARRAY_PROTOS (TRANSFORM_LIST, TRANSFORM, FLOAT,
transform_list, xf, n_xfs)
// object_type_str[] definition in scene.c must match!
typedef enum object_type_t
{
O_BASE,
O_TAG_DEF,
O_OPTS_DEF,
O_SCALAR_DEF,
O_POINT_DEF,
O_VECTOR_DEF,
O_TRANSFORM_DEF,
O_DOTS,
O_LINE,
O_CURVE,
O_POLYGON,
O_SPECIAL,
O_SWEEP,
O_REPEAT,
O_COMPOUND,
}
OBJECT_TYPE;
#define is_drawable(P) ((P)->tag >= O_DOTS)
extern char *object_type_str[];
#define BASE_OBJECT_FIELDS \
struct object_t *sibling; \
OBJECT_TYPE tag
typedef struct object_t
{
BASE_OBJECT_FIELDS;
}
OBJECT;
typedef OBJECT TAG_DEF;
OBJECT *new_tag_def (void);
typedef struct opts_def_t
{
BASE_OBJECT_FIELDS;
OPTS *opts;
}
OPTS_DEF;
OBJECT *new_opts_def (char *opts_str, SRC_LINE line);
typedef struct scalar_def_t
{
BASE_OBJECT_FIELDS;
FLOAT val;
}
SCALAR_DEF;
OBJECT *new_scalar_def (FLOAT val);
typedef struct point_def_t
{
BASE_OBJECT_FIELDS;
POINT_3D p;
}
POINT_DEF;
OBJECT *new_point_def (POINT_3D p);
typedef struct vector_def_t
{
BASE_OBJECT_FIELDS;
VECTOR_3D v;
}
VECTOR_DEF;
OBJECT *new_vector_def (VECTOR_3D v);
typedef struct transform_def_t
{
BASE_OBJECT_FIELDS;
TRANSFORM xf;
}
TRANSFORM_DEF;
OBJECT *new_transform_def (TRANSFORM xf);
typedef struct dots_t
{
BASE_OBJECT_FIELDS;
OPTS *opts;
POINT_LIST_3D pts[1];
}
DOTS_OBJECT;
OBJECT *new_dots (OPTS * opts, OBJECT * pts);
typedef struct line_object_t
{
BASE_OBJECT_FIELDS;
OPTS *opts;
POINT_LIST_3D pts[1];
}
LINE_OBJECT;
OBJECT *new_line (OPTS * opts, OBJECT * pts);
typedef struct curve_t
{
BASE_OBJECT_FIELDS;
OPTS *opts;
POINT_LIST_3D pts[1];
}
CURVE_OBJECT;
OBJECT *new_curve (OPTS * opts, OBJECT * pts);
typedef struct polygon_t
{
BASE_OBJECT_FIELDS;
OPTS *opts;
int border_p;
POINT_LIST_3D pts[1];
}
POLYGON_OBJECT;
OBJECT *new_polygon (OPTS * opts, OBJECT * pts);
typedef struct special_t
{
BASE_OBJECT_FIELDS;
char *code;
OPTS *opts;
POINT_LIST_3D pts[1];
}
SPECIAL_OBJECT;
OBJECT *new_special (char *code, OPTS * opts, OBJECT * pts,
SRC_LINE line);
typedef struct sweep_t
{
BASE_OBJECT_FIELDS;
OPTS *opts;
int n_slices;
int closed_p;
TRANSFORM_LIST xforms[1];
OBJECT *swept;
}
SWEEP_OBJECT;
OBJECT *new_sweep (OPTS * opts, int n_slices, int closed_p, OBJECT * xfs,
OBJECT * swept);
typedef struct repeat_t
{
BASE_OBJECT_FIELDS;
int n;
TRANSFORM_LIST xforms[1];
OBJECT *repeated;
}
REPEAT_OBJECT;
OBJECT *new_repeat (int n, OBJECT * xfs, OBJECT * repeated);
typedef struct compound_t
{
BASE_OBJECT_FIELDS;
TRANSFORM xform;
OBJECT *child;
}
COMPOUND_OBJECT;
OBJECT *new_compound (TRANSFORM xform, OBJECT * child);
OBJECT *copy_drawable (OBJECT * obj);
OBJECT *cat_objects (OBJECT * lft, OBJECT * rgt);
OBJECT *sibling_reverse (OBJECT * obj);
OBJECT *object_from_expr (EXPR_VAL * val);
OBJECT *flat_scene (OBJECT * obj, GLOBAL_ENV * env);
OBJECT *hsr_scene_with_bsp (OBJECT * scene);
OBJECT *hsr_scene_with_depth_sort (OBJECT * scene);
void get_extent (OBJECT * obj, BOX_3D * e, int *n_obj);
int xy_overlap_p (OBJECT * obj, BOX_3D * e);
#endif