Loading...
Searching...
No Matches
gvl2.c
Go to the documentation of this file.
/*!
\file lib/ogsf/gvl2.c
\brief OGSF library - loading and manipulating volumes
GRASS OpenGL gsurf OGSF Library
(C) 1999-2008 by the GRASS Development Team
This program is free software under the
GNU General Public License (>=v2).
Read the file COPYING that comes with GRASS
for details.
\author Bill Brown UI-GMSL (May 1997)
Tomas Paudits (February 2004)
*/
#include <string.h>
#include <grass/gis.h>
#include <grass/raster3d.h>
#include <grass/ogsf.h>
#include <grass/glocale.h>
#include "gsget.h"
static int Vol_ID[MAX_VOLS];
static int Next_vol = 0;
static RASTER3D_Region wind3;
static double Region[6];
/*!
\brief Library initialization for volumes
Set region extent (N,S,W,E,T,B)
*/
void GVL_libinit(void)
{
Rast3d_init_defaults();
Rast3d_get_window(&wind3);
Region[0] = wind3.north;
Region[1] = wind3.south;
Region[2] = wind3.west;
Region[3] = wind3.east;
Region[4] = wind3.top;
Region[5] = wind3.bottom;
return;
}
/*!
\brief Initialize 3D region
Set region extent (N,S,W,E,T,B)
*/
void GVL_init_region(void)
{
Rast3d_read_window(&wind3, NULL);
Region[0] = wind3.north;
Region[1] = wind3.south;
Region[2] = wind3.west;
Region[3] = wind3.east;
Region[4] = wind3.top;
Region[5] = wind3.bottom;
return;
}
/*!
\brief Get region extent settings
\param[out] n,s,w,e north, south, west, east
\param[out] t,b top, bottom
\return 1
*/
int GVL_get_region(float *n, float *s, float *w, float *e, float *t, float *b)
{
*n = Region[0];
*s = Region[1];
*w = Region[2];
*e = Region[3];
*t = Region[4];
*b = Region[5];
return (1);
}
/*!
\brief Get window
\todo gvl_file.c use this - change
\return pointer to RASTER3D_Region struct (static)
*/
void *GVL_get_window(void)
{
return &wind3;
}
/*!
\brief Check if volume set exists
\param id volume set id
\return 1 found
\return 0 not found
*/
int GVL_vol_exists(int id)
{
int i, found = 0;
G_debug(3, "GVL_vol_exists");
if (NULL == gvl_get_vol(id)) {
return (0);
}
for (i = 0; i < Next_vol && !found; i++) {
if (Vol_ID[i] == id) {
found = 1;
}
}
return (found);
}
/*!
\brief Create new volume set
\return volume set id
\return -1 on error
*/
int GVL_new_vol(void)
{
geovol *nvl;
G_debug(3, "GVL_new_vol():");
if (Next_vol < MAX_VOLS) {
nvl = gvl_get_new_vol();
gvl_init_vol(nvl, wind3.west + wind3.ew_res / 2.,
wind3.south + wind3.ns_res / 2., wind3.bottom, wind3.rows,
wind3.cols, wind3.depths, wind3.ew_res, wind3.ns_res,
wind3.tb_res);
Vol_ID[Next_vol] = nvl->gvol_id;
++Next_vol;
G_debug(3, " id=%d", nvl->gvol_id);
return (nvl->gvol_id);
}
return (-1);
}
/*!
\brief Get number of loaded volume sets
\return number of volume sets
*/
int GVL_num_vols(void)
{
return (gvl_num_vols());
}
/*!
\brief Get list of loaded volume sets
Must be freed if not needed!
\param[out] numvols number of volume sets
\return pointer to list of volume sets
\return NULL on error
*/
int *GVL_get_vol_list(int *numvols)
{
int i, *ret;
*numvols = Next_vol;
if (Next_vol) {
ret = (int *)G_malloc(Next_vol * sizeof(int));
if (!ret)
return (NULL);
for (i = 0; i < Next_vol; i++) {
ret[i] = Vol_ID[i];
}
return (ret);
}
return (NULL);
}
/*!
\brief Delete volume set from list
\param id volume set id
\return 1 on success
\return -1 on error (invalid volume set id)
*/
int GVL_delete_vol(int id)
{
int i, j, found = 0;
G_debug(3, "GVL_delete_vol");
if (GVL_vol_exists(id)) {
for (i = 0; i < GVL_isosurf_num_isosurfs(id); i++) {
GVL_isosurf_del(id, 0);
}
for (i = 0; i < GVL_slice_num_slices(id); i++) {
GVL_slice_del(id, 0);
}
gvl_delete_vol(id);
for (i = 0; i < Next_vol && !found; i++) {
if (Vol_ID[i] == id) {
found = 1;
for (j = i; j < Next_vol; j++) {
Vol_ID[j] = Vol_ID[j + 1];
}
}
}
if (found) {
--Next_vol;
return (1);
}
}
return (-1);
}
/*!
\brief Load 3d raster map to volume set
\param id volume set id
\param filename 3d raster map name
\return -1 on error
\return 0 on success
*/
int GVL_load_vol(int id, const char *filename)
{
geovol *gvl;
int handle;
G_debug(3, "GVL_load_vol(): id=%d, name=%s", id, filename);
if (NULL == (gvl = gvl_get_vol(id))) {
return (-1);
}
G_message(_("Loading 3d raster map <%s>..."), filename);
if (0 > (handle = gvl_file_newh(filename, VOL_FTYPE_RASTER3D)))
return (-1);
gvl->hfile = handle;
return (0);
}
/*!
\brief Get volume set name
\param id volume set id
\param[out] filename name (must be allocated)
\return -1 on error
\return 1 on success
*/
int GVL_get_volname(int id, char *filename)
{
geovol *gvl;
if (NULL == (gvl = gvl_get_vol(id))) {
return (-1);
}
if (0 > gvl->hfile) {
return (-1);
}
strcpy(filename, gvl_file_get_name(gvl->hfile));
return (1);
}
/*!
\brief Get volume dimensions
\param id volume set id
\param[out] rows,cols,depths number of rows, cols, depths
*/
void GVL_get_dims(int id, int *rows, int *cols, int *depths)
{
geovol *gvl;
gvl = gvl_get_vol(id);
if (gvl) {
*rows = gvl->rows;
*cols = gvl->cols;
*depths = gvl->depths;
G_debug(3, "GVL_get_dims() id=%d, rows=%d, cols=%d, depths=%d",
gvl->gvol_id, gvl->rows, gvl->cols, gvl->depths);
}
else {
G_debug(2,
"GVL_get_dims(): Attempted to access a null volume structure "
"for id=%d",
id);
}
return;
}
/*!
\brief Set trans ?
\param id volume set id
\param xtrans,ytrans,ztrans x/y/z trans values
*/
void GVL_set_trans(int id, float xtrans, float ytrans, float ztrans)
{
geovol *gvl;
G_debug(3, "GVL_set_trans");
gvl = gvl_get_vol(id);
if (gvl) {
gvl->x_trans = xtrans;
gvl->y_trans = ytrans;
gvl->z_trans = ztrans;
}
return;
}
/*!
\brief Get trans ?
\param id volume set id
\param[out] xtrans,ytrans,ztrans x/y/z trans values
\return 1 on success
\return -1 on error
*/
int GVL_get_trans(int id, float *xtrans, float *ytrans, float *ztrans)
{
geovol *gvl;
gvl = gvl_get_vol(id);
if (gvl) {
*xtrans = gvl->x_trans;
*ytrans = gvl->y_trans;
*ztrans = gvl->z_trans;
return (1);
}
return (-1);
}
/*!
\brief Set drawing wire box
\param id volume set id
\param draw_wire 1 for drawing wire, 0 otherwise
*/
void GVL_set_draw_wire(int id, int draw_wire)
{
geovol *gvl;
G_debug(3, "GVL_set_draw_wire");
gvl = gvl_get_vol(id);
if (gvl) {
gvl->draw_wire = draw_wire;
}
return;
}
/*!
\brief Draw volume set
\param vid volume set id
*/
void GVL_draw_vol(int vid)
{
geovol *gvl;
gvl = gvl_get_vol(vid);
if (gvl) {
gvld_vol(gvl);
if (gvl->draw_wire) {
gvld_wind3_box(gvl);
}
}
return;
}
/*!
\brief Draw volume in wire mode
\param id volume set id
*/
void GVL_draw_wire(int id)
{
geovol *gvl;
G_debug(3, "GVL_draw_wire(): id=%d", id);
gvl = gvl_get_vol(id);
if (gvl) {
gvld_wire_vol(gvl);
}
return;
}
/*!
\brief Draw all volume sets
*/
void GVL_alldraw_vol(void)
{
int id;
for (id = 0; id < Next_vol; id++) {
GVL_draw_vol(Vol_ID[id]);
}
return;
}
/*!
\brief Draw all volume sets in wire mode
*/
void GVL_alldraw_wire(void)
{
int id;
for (id = 0; id < Next_vol; id++) {
GVL_draw_wire(Vol_ID[id]);
}
return;
}
/*!
\brief Set client data for volume set
\param id volume set id
\param clientd pointer to client data
\return 1 on success
\return -1 on error
*/
int GVL_Set_ClientData(int id, void *clientd)
{
geovol *gvl;
gvl = gvl_get_vol(id);
if (gvl) {
gvl->clientdata = clientd;
return (1);
}
return (-1);
}
/*!
\brief Get client data
\param id volume set id
\return pointer to client data
\return NULL on error
*/
void *GVL_Get_ClientData(int id)
{
geovol *gvl;
gvl = gvl_get_vol(id);
if (gvl) {
return (gvl->clientdata);
}
return (NULL);
}
/*!
\brief Set focus on map center
\param id volume set id
*/
void GVL_set_focus_center_map(int id)
{
float center[3];
geovol *gvl;
G_debug(3, "GS_set_focus_center_map");
gvl = gvl_get_vol(id);
if (gvl) {
center[X] = (gvl->xmax - gvl->xmin) / 2.;
center[Y] = (gvl->ymax - gvl->ymin) / 2.;
center[Z] = (gvl->zmax - gvl->zmin) / 2.;
GS_set_focus(center);
}
return;
}
/************************************************************************/
/* ISOSURFACES */
/************************************************************************/
/*!
\brief Get draw resolution for isosurface
\todo error handling
\param id volume set id
\param[out] xres,yres,zres x/y/z resolution value
*/
void GVL_isosurf_get_drawres(int id, int *xres, int *yres, int *zres)
{
geovol *gvl;
G_debug(3, "GVL_isosurf_get_drawres");
gvl = gvl_get_vol(id);
if (gvl) {
*xres = gvl->isosurf_x_mod;
*yres = gvl->isosurf_y_mod;
*zres = gvl->isosurf_z_mod;
}
return;
}
/*!
\brief Set isosurface draw resolution
\param id volume set id
\param xres,yres,zres x/y/z resolution value
\return -1 on error (invalid values/volume set id)
\return 0 on success
*/
int GVL_isosurf_set_drawres(int id, int xres, int yres, int zres)
{
geovol *gvl;
int i;
G_debug(3, "GVL_isosurf_set_drawres(): id=%d", id);
if (xres < 1 || yres < 1 || zres < 1) {
return (-1);
}
gvl = gvl_get_vol(id);
if (gvl) {
gvl->isosurf_x_mod = xres;
gvl->isosurf_y_mod = yres;
gvl->isosurf_z_mod = zres;
for (i = 0; i < gvl->n_isosurfs; i++) {
gvl_isosurf_set_att_changed(gvl->isosurf[i], ATT_TOPO);
}
return (0);
}
return (-1);
}
/*!
\brief Get isosurface draw mode
\param id volume set id
\param[out] mode draw-mode
\return 1 on success
\return -1 on error
*/
int GVL_isosurf_get_drawmode(int id, int *mode)
{
geovol *gvl;
gvl = gvl_get_vol(id);
if (gvl) {
*mode = gvl->isosurf_draw_mode;
return (1);
}
return (-1);
}
/*!
\brief Set isosurface draw mode
\param id volume set id
\param mode draw mode
\return 0 on success
\return -1 on error (invalid volume set id)
*/
int GVL_isosurf_set_drawmode(int id, int mode)
{
geovol *gvl;
G_debug(3, "GVL_isosurf_set_drawmode(): id=%d mode=%d", id, mode);
gvl = gvl_get_vol(id);
if (gvl) {
gvl->isosurf_draw_mode = mode;
return (0);
}
return (-1);
}
/*!
\brief Add isosurface
\param id volume set id
\return -1 on error (invalid volume set id
\return 1 on success
*/
int GVL_isosurf_add(int id)
{
geovol *gvl;
geovol_isosurf *isosurf;
G_debug(3, "GVL_isosurf_add() id=%d", id);
gvl = gvl_get_vol(id);
if (!gvl)
return (-1);
if (gvl->n_isosurfs == MAX_ISOSURFS)
return (-1);
isosurf = (geovol_isosurf *)G_malloc(sizeof(geovol_isosurf));
if (!isosurf) {
return (-1);
}
gvl_isosurf_init(isosurf);
gvl->n_isosurfs++;
gvl->isosurf[gvl->n_isosurfs - 1] = (geovol_isosurf *)isosurf;
return (1);
}
/*!
\brief Delete isosurface
\param id volume set id
\param isosurf_id isosurface id
\return -1 on error
\return 1 on success
*/
int GVL_isosurf_del(int id, int isosurf_id)
{
geovol *gvl;
geovol_isosurf *isosurf;
int i;
G_debug(3, "GVL_isosurf_del");
isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
if (!isosurf)
return (-1);
if (!gvl_isosurf_freemem(isosurf)) {
return (-1);
}
gvl = gvl_get_vol(id);
G_free(gvl->isosurf[isosurf_id]);
for (i = isosurf_id + 1; i < gvl->n_isosurfs; i++) {
gvl->isosurf[i - 1] = gvl->isosurf[i];
}
gvl->n_isosurfs--;
return (1);
}
/*!
\brief Move up isosurface in list
\param id volume set id
\param isosurf_id isosurface id
\return -1 on error
\return 1 on success
*/
int GVL_isosurf_move_up(int id, int isosurf_id)
{
geovol *gvl;
geovol_isosurf *tmp;
G_debug(3, "GVL_isosurf_move_up");
gvl = gvl_get_vol(id);
if (!gvl)
return (-1);
if (isosurf_id < 0 || isosurf_id > (gvl->n_isosurfs - 1))
return (-1);
if (isosurf_id == 0)
return (1);
tmp = gvl->isosurf[isosurf_id - 1];
gvl->isosurf[isosurf_id - 1] = gvl->isosurf[isosurf_id];
gvl->isosurf[isosurf_id] = tmp;
return (1);
}
/*!
\brief Move down isosurface in list
\param id volume set id
\param isosurf_id isosurface id
\return -1 on error
\return 1 on success
*/
int GVL_isosurf_move_down(int id, int isosurf_id)
{
geovol *gvl;
geovol_isosurf *tmp;
G_debug(3, "GVL_isosurf_move_up");
gvl = gvl_get_vol(id);
if (!gvl)
return (-1);
if (isosurf_id < 0 || isosurf_id > (gvl->n_isosurfs - 1))
return (-1);
if (isosurf_id == (gvl->n_isosurfs - 1))
return (1);
tmp = gvl->isosurf[isosurf_id + 1];
gvl->isosurf[isosurf_id + 1] = gvl->isosurf[isosurf_id];
gvl->isosurf[isosurf_id] = tmp;
return (1);
}
/*!
\brief Get isosurface attributes
\param id volume set id
\param isosurf_id surface id
\param att attribute id
\param[out] set
\param[out] constant
\param[out] mapname
\return -1 on error
\return 1 on success
*/
int GVL_isosurf_get_att(int id, int isosurf_id, int att, int *set,
float *constant, char *mapname)
{
int src;
geovol_isosurf *isosurf;
G_debug(3, "GVL_isosurf_get_att");
isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
if (isosurf) {
if (-1 != (src = gvl_isosurf_get_att_src(isosurf, att))) {
*set = src;
if (src == CONST_ATT) {
*constant = isosurf->att[att].constant;
}
else if (src == MAP_ATT) {
strcpy(mapname, gvl_file_get_name(isosurf->att[att].hfile));
}
return (1);
}
return (-1);
}
return (-1);
}
/*!
\brief Unset isosurface attributes
\param id volume set id
\param isosurf_id isosurface id
\param att attribute id
\return ?
\return -1 on error
*/
int GVL_isosurf_unset_att(int id, int isosurf_id, int att)
{
geovol_isosurf *isosurf;
G_debug(3, "GVL_isosurf_unset_att");
isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
if (isosurf) {
return (gvl_isosurf_set_att_src(isosurf, att, NOTSET_ATT));
}
return (-1);
}
/*!
\brief Set constant isosurface attribute
Attributes:
- ATT_NORM
- ATT_TOPO topography (level) constant
- ATT_COLOR color map/constant
- ATT_MASK mask map
- ATT_TRANSP transparency map/constant
- ATT_SHINE shininess map/constant
- ATT_EMIT emission map/constant
\param id volume set id
\param isosurf_id isosurface id (0 - MAX_ISOSURFS)
\param att attribute descriptor
\param constant constant value
\return 1 on success
\return -1 on error
*/
int GVL_isosurf_set_att_const(int id, int isosurf_id, int att, float constant)
{
geovol_isosurf *isosurf;
G_debug(3,
"GVL_isosurf_set_att_const() id=%d isosurf_id=%d "
"att=%d const=%f",
id, isosurf_id, att, constant);
isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
if (isosurf) {
return (gvl_isosurf_set_att_const(isosurf, att, constant));
}
return (-1);
}
/*!
\brief Set isosurface map attribute
Attributes:
- ATT_NORM
- ATT_TOPO topography (level) constant
- ATT_COLOR color map/constant
- ATT_MASK mask map
- ATT_TRANSP transparency map/constant
- ATT_SHINE shininess map/constant
- ATT_EMIT emission map/constant
\param id volume set id
\param isosurf_id isosurface id (0 - MAX_ISOSURFS)
\param att attribute descriptor
\param filename map name
\return 1 on success
\return -1 on error
*/
int GVL_isosurf_set_att_map(int id, int isosurf_id, int att,
const char *filename)
{
geovol_isosurf *isosurf;
G_debug(3,
"GVL_isosurf_set_att_map(): id=%d, isosurf_id=%d "
"att=%d map=%s",
id, isosurf_id, att, filename);
isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
if (isosurf) {
return gvl_isosurf_set_att_map(isosurf, att, filename);
}
return (-1);
}
/*!
\brief Get isosurface flags
\param id volume set id
\param isosurf_id isosurface id
\param[out] inout map name
\return 1 on success
\return -1 on error
*/
int GVL_isosurf_get_flags(int id, int isosurf_id, int *inout)
{
geovol_isosurf *isosurf;
G_debug(3, "GVL_isosurf_get_flags");
isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
if (isosurf) {
*inout = isosurf->inout_mode;
return (1);
}
return (-1);
}
/*!
\brief Set isosurface flags
\param id volume set id
\param isosurf_id isosurface id
\param inout map name
\return 1 on success
\return -1 on error
*/
int GVL_isosurf_set_flags(int id, int isosurf_id, int inout)
{
geovol_isosurf *isosurf;
G_debug(3, "GVL_isosurf_get_flags");
isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
if (isosurf) {
isosurf->inout_mode = inout;
return (1);
}
return (-1);
}
/*!
\brief Get number of available isosurfaces
\param id volume set id
\return number of isosurfaces
\return -1 on error
*/
int GVL_isosurf_num_isosurfs(int id)
{
geovol *gvl;
G_debug(3, "GVL_isosurf_num_isosurfs");
gvl = gvl_get_vol(id);
if (gvl) {
return gvl->n_isosurfs;
}
return (-1);
}
/*!
\brief Set mask attribute mode
Mask attribute special: constant is set to indicate invert or no
\param id volume set id
\param isosurf_id isosurface id
\param mode attribute mode
\return mode id
\return -1 on error
*/
int GVL_isosurf_set_maskmode(int id, int isosurf_id, int mode)
{
geovol_isosurf *isosurf;
G_debug(3, "GVL_isosurf_set_att_const");
isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
if (isosurf) {
isosurf->att[ATT_MASK].constant = mode;
return (mode);
}
return (-1);
}
/*!
\brief Get isosurface mask mode
\param id volume set id
\param isosurf_id isosurface id
\param mode attribute mode
\return 1 on success
\return -1 on error
*/
int GVL_isosurf_get_maskmode(int id, int isosurf_id, int *mode)
{
geovol_isosurf *isosurf;
isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
if (isosurf) {
*mode = isosurf->att[ATT_MASK].constant;
return (1);
}
return (-1);
}
/************************************************************************/
/* SLICES */
/************************************************************************/
/*!
\brief Get draw resolution of slice
\param id volume set id
\param[out] xres,yres,zres x/y/z resolution value
*/
void GVL_slice_get_drawres(int id, int *xres, int *yres, int *zres)
{
geovol *gvl;
G_debug(3, "GVL_slice_get_drawres");
gvl = gvl_get_vol(id);
if (gvl) {
*xres = gvl->slice_x_mod;
*yres = gvl->slice_y_mod;
*zres = gvl->slice_z_mod;
}
return;
}
/*!
\brief Set slice draw resolution
\param id volume set id
\param xres,yres,zres x/y/z resolution value
\return 0 on success
\return -1 on error (invalid value or id)
*/
int GVL_slice_set_drawres(int id, int xres, int yres, int zres)
{
geovol *gvl;
int i;
G_debug(3, "GVL_slice_set_drawres(): id=%d", id);
if (xres < 1 || yres < 1 || zres < 1) {
return (-1);
}
gvl = gvl_get_vol(id);
if (gvl) {
gvl->slice_x_mod = xres;
gvl->slice_y_mod = yres;
gvl->slice_z_mod = zres;
for (i = 0; i < gvl->n_slices; i++) {
gvl->slice[i]->changed = 1;
}
return (0);
}
return (-1);
}
/*!
\brief Get slice draw mode
\param id volume set id
\param[out] mode draw mode
\return 1 on success
\return -1 on error (invalid id)
*/
int GVL_slice_get_drawmode(int id, int *mode)
{
geovol *gvl;
gvl = gvl_get_vol(id);
if (gvl) {
*mode = gvl->slice_draw_mode;
return (1);
}
return (-1);
}
/*!
\brief Set slice draw mode
\param id volume set id
\param mode draw mode
\return 0 on success
\return -1 on error (invalid id)
*/
int GVL_slice_set_drawmode(int id, int mode)
{
geovol *gvl;
G_debug(3, "GVL_slice_set_drawmode(): id=%d, mode=%d", id, mode);
gvl = gvl_get_vol(id);
if (gvl) {
gvl->slice_draw_mode = mode;
return (0);
}
return (-1);
}
/*!
\brief Add slice
\param id volume set id
\return -1 on error
\return 1 on success
*/
int GVL_slice_add(int id)
{
geovol *gvl;
geovol_slice *slice;
G_debug(3, "GVL_slice_add");
gvl = gvl_get_vol(id);
if (!gvl)
return (-1);
if (gvl->n_slices == MAX_SLICES)
return (-1);
if (NULL == (slice = (geovol_slice *)G_malloc(sizeof(geovol_slice)))) {
return (-1);
}
gvl_slice_init(slice);
gvl->n_slices++;
gvl->slice[gvl->n_slices - 1] = (geovol_slice *)slice;
return (1);
}
/*!
\brief Delete slice
\param id volume set id
\param slice_id slice id
\return -1 on error
\return 1 on success
*/
int GVL_slice_del(int id, int slice_id)
{
geovol *gvl;
geovol_slice *slice;
int i;
G_debug(3, "GVL_slice_del");
slice = gvl_slice_get_slice(id, slice_id);
if (!slice)
return (-1);
if (!gvl_slice_freemem(slice)) {
return (-1);
}
gvl = gvl_get_vol(id);
G_free(gvl->slice[slice_id]);
for (i = slice_id + 1; i < gvl->n_slices; i++) {
gvl->slice[i - 1] = gvl->slice[i];
}
gvl->n_slices--;
return (1);
}
/*!
\brief Move up slice
\param id volume set id
\param slice_id slice id
\return -1 on error
\return 1 on success
*/
int GVL_slice_move_up(int id, int slice_id)
{
geovol *gvl;
geovol_slice *tmp;
G_debug(3, "GVL_slice_move_up");
gvl = gvl_get_vol(id);
if (!gvl)
return (-1);
if (slice_id < 0 || slice_id > (gvl->n_slices - 1))
return (-1);
if (slice_id == 0)
return (1);
tmp = gvl->slice[slice_id - 1];
gvl->slice[slice_id - 1] = gvl->slice[slice_id];
gvl->slice[slice_id] = tmp;
return (1);
}
/*!
\brief Move down slice
\param id volume set id
\param slice_id slice id
\return -1 on error
\return 1 on success
*/
int GVL_slice_move_down(int id, int slice_id)
{
geovol *gvl;
geovol_slice *tmp;
G_debug(3, "GVL_slice_move_up");
gvl = gvl_get_vol(id);
if (!gvl)
return (-1);
if (slice_id < 0 || slice_id > (gvl->n_slices - 1))
return (-1);
if (slice_id == (gvl->n_slices - 1))
return (1);
tmp = gvl->slice[slice_id + 1];
gvl->slice[slice_id + 1] = gvl->slice[slice_id];
gvl->slice[slice_id] = tmp;
return (1);
}
/*!
\brief Get number or slices
\param id volume set id
\return number of slices
\return -1 on error
*/
int GVL_slice_num_slices(int id)
{
geovol *gvl;
G_debug(3, "GVL_isosurf_num_isosurfs");
gvl = gvl_get_vol(id);
if (gvl) {
return gvl->n_slices;
}
return (-1);
}
/*!
\brief Get slice position
\param id volume set id
\param slice_id slice id
\param[out] x1,y1,z1 coordinates ?
\param[out] x2,y2,z2 coordinates ?
\param[out] dir direction
\return -1 on error
\return 1 on success
*/
int GVL_slice_get_pos(int id, int slice_id, float *x1, float *x2, float *y1,
float *y2, float *z1, float *z2, int *dir)
{
geovol *gvl;
geovol_slice *slice;
int cols, rows, depths;
gvl = gvl_get_vol(id);
if (!gvl)
return (-1);
slice = gvl_slice_get_slice(id, slice_id);
if (!slice)
return (-1);
if (slice->dir == X) {
cols = gvl->rows;
rows = gvl->depths;
depths = gvl->cols;
}
else if (slice->dir == Y) {
cols = gvl->cols;
rows = gvl->depths;
depths = gvl->rows;
}
else if (slice->dir == Z) {
cols = gvl->cols;
rows = gvl->rows;
depths = gvl->depths;
}
else {
return (-1);
}
*x1 = slice->x1 / (cols - 1);
*x2 = slice->x2 / (cols - 1);
*y1 = slice->y1 / (rows - 1);
*y2 = slice->y2 / (rows - 1);
*z1 = slice->z1 / (depths - 1);
*z2 = slice->z2 / (depths - 1);
*dir = slice->dir;
return (1);
}
/*!
\brief Get slice position
\param id volume set id
\param slice_id slice id
\param x1,y1,z1 coordinates ?
\param x2,y2,z2 coordinates ?
\param dir direction
\return -1 on error
\return 1 on success
*/
int GVL_slice_set_pos(int id, int slice_id, float x1, float x2, float y1,
float y2, float z1, float z2, int dir)
{
geovol *gvl;
geovol_slice *slice;
int cols, rows, depths;
gvl = gvl_get_vol(id);
if (!gvl)
return (-1);
slice = gvl_slice_get_slice(id, slice_id);
if (!slice)
return (-1);
if (dir == X) {
cols = gvl->rows;
rows = gvl->depths;
depths = gvl->cols;
}
else if (dir == Y) {
cols = gvl->cols;
rows = gvl->depths;
depths = gvl->rows;
}
else if (dir == Z) {
cols = gvl->cols;
rows = gvl->rows;
depths = gvl->depths;
}
else {
return (-1);
}
slice->x1 = ((x1 < 0.) ? 0. : ((x1 > 1.) ? 1. : x1)) * (cols - 1);
slice->x2 = ((x2 < 0.) ? 0. : ((x2 > 1.) ? 1. : x2)) * (cols - 1);
slice->y1 = ((y1 < 0.) ? 0. : ((y1 > 1.) ? 1. : y1)) * (rows - 1);
slice->y2 = ((y2 < 0.) ? 0. : ((y2 > 1.) ? 1. : y2)) * (rows - 1);
slice->z1 = ((z1 < 0.) ? 0. : ((z1 > 1.) ? 1. : z1)) * (depths - 1);
slice->z2 = ((z2 < 0.) ? 0. : ((z2 > 1.) ? 1. : z2)) * (depths - 1);
slice->dir = dir;
slice->changed = 1;
return (1);
}
/*!
\brief Get slice trans ?
\param id volume set id
\param slice_id slice id
\param[out] transp transp value
\return -1 on error
\return 1 on success
*/
int GVL_slice_get_transp(int id, int slice_id, int *transp)
{
geovol_slice *slice;
G_debug(3, "GVL_get_transp");
slice = gvl_slice_get_slice(id, slice_id);
if (!slice)
return (-1);
*transp = slice->transp;
return (1);
}
/*!
\brief Set slice trans ?
\param id volume set id
\param slice_id slice id
\param transp transp value
\return -1 on error
\return 1 on success
*/
int GVL_slice_set_transp(int id, int slice_id, int transp)
{
geovol_slice *slice;
G_debug(3, "GVL_set_transp");
slice = gvl_slice_get_slice(id, slice_id);
if (!slice)
return (-1);
slice->transp = transp;
return (1);
}
G_free
void G_free(void *buf)
Free allocated memory.
Definition alloc.c:147
NULL
#define NULL
Definition ccmath.h:32
G_debug
int G_debug(int level, const char *msg,...)
Print debugging message.
Definition debug.c:66
b
double b
Definition driver/set_window.c:5
t
double t
Definition driver/set_window.c:5
G_message
void G_message(const char *msg,...)
Print a message to stderr.
Definition gis/error.c:89
GS_set_focus
void GS_set_focus(float *realto)
Set focus.
Definition gs2.c:2520
gsget.h
GVL_slice_get_drawmode
int GVL_slice_get_drawmode(int id, int *mode)
Get slice draw mode.
Definition gvl2.c:1151
GVL_isosurf_unset_att
int GVL_isosurf_unset_att(int id, int isosurf_id, int att)
Unset isosurface attributes.
Definition gvl2.c:855
GVL_isosurf_get_flags
int GVL_isosurf_get_flags(int id, int isosurf_id, int *inout)
Get isosurface flags.
Definition gvl2.c:957
GVL_isosurf_num_isosurfs
int GVL_isosurf_num_isosurfs(int id)
Get number of available isosurfaces.
Definition gvl2.c:1008
GVL_slice_get_pos
int GVL_slice_get_pos(int id, int slice_id, float *x1, float *x2, float *y1, float *y2, float *z1, float *z2, int *dir)
Get slice position.
Definition gvl2.c:1369
GVL_draw_wire
void GVL_draw_wire(int id)
Draw volume in wire mode.
Definition gvl2.c:429
GVL_slice_set_pos
int GVL_slice_set_pos(int id, int slice_id, float x1, float x2, float y1, float y2, float z1, float z2, int dir)
Get slice position.
Definition gvl2.c:1429
GVL_slice_move_down
int GVL_slice_move_down(int id, int slice_id)
Move down slice.
Definition gvl2.c:1309
GVL_isosurf_get_att
int GVL_isosurf_get_att(int id, int isosurf_id, int att, int *set, float *constant, char *mapname)
Get isosurface attributes.
Definition gvl2.c:815
GVL_slice_num_slices
int GVL_slice_num_slices(int id)
Get number or slices.
Definition gvl2.c:1342
GVL_load_vol
int GVL_load_vol(int id, const char *filename)
Load 3d raster map to volume set.
Definition gvl2.c:256
GVL_isosurf_get_drawres
void GVL_isosurf_get_drawres(int id, int *xres, int *yres, int *zres)
Get draw resolution for isosurface.
Definition gvl2.c:555
GVL_slice_set_transp
int GVL_slice_set_transp(int id, int slice_id, int transp)
Set slice trans ?
Definition gvl2.c:1515
GVL_isosurf_set_att_const
int GVL_isosurf_set_att_const(int id, int isosurf_id, int att, float constant)
Set constant isosurface attribute.
Definition gvl2.c:890
GVL_slice_set_drawres
int GVL_slice_set_drawres(int id, int xres, int yres, int zres)
Set slice draw resolution.
Definition gvl2.c:1114
GVL_isosurf_set_drawmode
int GVL_isosurf_set_drawmode(int id, int mode)
Set isosurface draw mode.
Definition gvl2.c:642
GVL_slice_get_drawres
void GVL_slice_get_drawres(int id, int *xres, int *yres, int *zres)
Get draw resolution of slice.
Definition gvl2.c:1088
GVL_get_volname
int GVL_get_volname(int id, char *filename)
Get volume set name.
Definition gvl2.c:286
GVL_isosurf_set_flags
int GVL_isosurf_set_flags(int id, int isosurf_id, int inout)
Set isosurface flags.
Definition gvl2.c:983
GVL_slice_move_up
int GVL_slice_move_up(int id, int slice_id)
Move up slice.
Definition gvl2.c:1275
GVL_isosurf_set_drawres
int GVL_isosurf_set_drawres(int id, int xres, int yres, int zres)
Set isosurface draw resolution.
Definition gvl2.c:581
GVL_get_window
void * GVL_get_window(void)
Get window.
Definition gvl2.c:98
GVL_isosurf_set_maskmode
int GVL_isosurf_set_maskmode(int id, int isosurf_id, int mode)
Set mask attribute mode.
Definition gvl2.c:1035
GVL_delete_vol
int GVL_delete_vol(int id)
Delete volume set from list.
Definition gvl2.c:210
GVL_num_vols
int GVL_num_vols(void)
Get number of loaded volume sets.
Definition gvl2.c:166
GVL_slice_get_transp
int GVL_slice_get_transp(int id, int slice_id, int *transp)
Get slice trans ?
Definition gvl2.c:1489
GVL_isosurf_del
int GVL_isosurf_del(int id, int isosurf_id)
Delete isosurface.
Definition gvl2.c:704
GVL_alldraw_vol
void GVL_alldraw_vol(void)
Draw all volume sets.
Definition gvl2.c:447
GVL_isosurf_move_up
int GVL_isosurf_move_up(int id, int isosurf_id)
Move up isosurface in list.
Definition gvl2.c:743
GVL_alldraw_wire
void GVL_alldraw_wire(void)
Draw all volume sets in wire mode.
Definition gvl2.c:461
GVL_isosurf_add
int GVL_isosurf_add(int id)
Add isosurface.
Definition gvl2.c:667
GVL_init_region
void GVL_init_region(void)
Initialize 3D region.
Definition gvl2.c:57
GVL_get_vol_list
int * GVL_get_vol_list(int *numvols)
Get list of loaded volume sets.
Definition gvl2.c:181
GVL_slice_set_drawmode
int GVL_slice_set_drawmode(int id, int mode)
Set slice draw mode.
Definition gvl2.c:1175
GVL_libinit
void GVL_libinit(void)
Library initialization for volumes.
Definition gvl2.c:37
GVL_Get_ClientData
void * GVL_Get_ClientData(int id)
Get client data.
Definition gvl2.c:504
GVL_Set_ClientData
int GVL_Set_ClientData(int id, void *clientd)
Set client data for volume set.
Definition gvl2.c:481
GVL_set_focus_center_map
void GVL_set_focus_center_map(int id)
Set focus on map center.
Definition gvl2.c:522
GVL_slice_add
int GVL_slice_add(int id)
Add slice.
Definition gvl2.c:1200
GVL_set_trans
void GVL_set_trans(int id, float xtrans, float ytrans, float ztrans)
Set trans ?
Definition gvl2.c:339
GVL_get_trans
int GVL_get_trans(int id, float *xtrans, float *ytrans, float *ztrans)
Get trans ?
Definition gvl2.c:365
GVL_slice_del
int GVL_slice_del(int id, int slice_id)
Delete slice.
Definition gvl2.c:1236
GVL_isosurf_move_down
int GVL_isosurf_move_down(int id, int isosurf_id)
Move down isosurface in list.
Definition gvl2.c:777
GVL_isosurf_get_maskmode
int GVL_isosurf_get_maskmode(int id, int isosurf_id, int *mode)
Get isosurface mask mode.
Definition gvl2.c:1062
GVL_set_draw_wire
void GVL_set_draw_wire(int id, int draw_wire)
Set drawing wire box.
Definition gvl2.c:388
GVL_get_region
int GVL_get_region(float *n, float *s, float *w, float *e, float *t, float *b)
Get region extent settings.
Definition gvl2.c:79
GVL_isosurf_set_att_map
int GVL_isosurf_set_att_map(int id, int isosurf_id, int att, const char *filename)
Set isosurface map attribute.
Definition gvl2.c:928
GVL_vol_exists
int GVL_vol_exists(int id)
Check if volume set exists.
Definition gvl2.c:111
GVL_get_dims
void GVL_get_dims(int id, int *rows, int *cols, int *depths)
Get volume dimensions.
Definition gvl2.c:309
GVL_new_vol
int GVL_new_vol(void)
Create new volume set.
Definition gvl2.c:136
GVL_isosurf_get_drawmode
int GVL_isosurf_get_drawmode(int id, int *mode)
Get isosurface draw mode.
Definition gvl2.c:618
GVL_draw_vol
void GVL_draw_vol(int vid)
Draw volume set.
Definition gvl2.c:408
gvl_get_new_vol
geovol * gvl_get_new_vol(void)
Allocate new volume set and add it to the list.
Definition gvl.c:148
gvl_isosurf_init
int gvl_isosurf_init(geovol_isosurf *isosurf)
Initialize geovol_isosurf struct.
Definition gvl.c:520
gvl_init_vol
int gvl_init_vol(geovol *gvl, double ox, double oy, double oz, int rows, int cols, int depths, double xres, double yres, double zres)
Initialize geovol structure.
Definition gvl.c:187
gvl_isosurf_set_att_map
int gvl_isosurf_set_att_map(geovol_isosurf *isosurf, int desc, const char *filename)
Set attribute map.
Definition gvl.c:690
gvl_slice_freemem
int gvl_slice_freemem(geovol_slice *slice)
Free geovol_slice struct.
Definition gvl.c:782
gvl_get_vol
geovol * gvl_get_vol(int id)
Get volume set structure.
Definition gvl.c:40
gvl_isosurf_get_att_src
int gvl_isosurf_get_att_src(geovol_isosurf *isosurf, int desc)
Get attribute source.
Definition gvl.c:607
gvl_isosurf_freemem
int gvl_isosurf_freemem(geovol_isosurf *isosurf)
Free geovol_isosurf struct.
Definition gvl.c:553
gvl_slice_get_slice
geovol_slice * gvl_slice_get_slice(int id, int slice_id)
Get geovol_slice struct.
Definition gvl.c:803
gvl_isosurf_get_isosurf
geovol_isosurf * gvl_isosurf_get_isosurf(int id, int isosurf_id)
Get isosurface of given volume set.
Definition gvl.c:580
gvl_isosurf_set_att_src
int gvl_isosurf_set_att_src(geovol_isosurf *isosurf, int desc, int src)
Set attribute source.
Definition gvl.c:632
gvl_isosurf_set_att_changed
int gvl_isosurf_set_att_changed(geovol_isosurf *isosurf, int desc)
Set attribute changed.
Definition gvl.c:723
gvl_isosurf_set_att_const
int gvl_isosurf_set_att_const(geovol_isosurf *isosurf, int desc, float constant)
Set isosurface attribute constant.
Definition gvl.c:665
gvl_slice_init
int gvl_slice_init(geovol_slice *slice)
Initialize geovol_slice struct.
Definition gvl.c:756
gvl_delete_vol
void gvl_delete_vol(int id)
Remove volume set from list.
Definition gvl.c:244
gvl_num_vols
int gvl_num_vols(void)
Get number of loaded volume sets.
Definition gvl.c:105
gvl_file_newh
int gvl_file_newh(const char *name, IFLAG file_type)
Get handle for given file name and type.
Definition gvl_file.c:269
gvl_file_get_name
char * gvl_file_get_name(int id)
Get file name for given handle.
Definition gvl_file.c:165
gvld_wind3_box
int gvld_wind3_box(geovol *gvl)
Draw volume bounding box.
Definition gvld.c:787
gvld_wire_vol
int gvld_wire_vol(geovol *gvl)
Draw volume in wire mode (bounding box).
Definition gvld.c:69
gvld_vol
int gvld_vol(geovol *gvl)
Draw volume set (slices and isosurfaces).
Definition gvld.c:38
strcpy
#define strcpy
Definition parson.c:66
X
#define X(j)
Y
#define Y(j)