This file is indexed.

/usr/include/grits/roam.h is in libgrits-dev 0.8.1-3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/*
 * Copyright (C) 2009-2010 Andy Spencer <andy753421@gmail.com>
 *
 * This program 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 of the License, or
 * (at your option) any later version.
 *
 * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef __ROAM_H__
#define __ROAM_H__

#include "gpqueue.h"

/* Roam */
typedef struct _RoamView     RoamView;
typedef struct _RoamPoint    RoamPoint;
typedef struct _RoamTriangle RoamTriangle;
typedef struct _RoamDiamond  RoamDiamond;
typedef struct _RoamSphere   RoamSphere;
/**
 * RoamHeightFunc:
 * @lat:       the latitude
 * @lon:       the longitude
 * @user_data: user data passed to the function
 *
 * See #GritsHeightFunc
 *
 * Returns: the elevation
 */
typedef gdouble (*RoamHeightFunc)(gdouble lat, gdouble lon, gpointer user_data);

/* Misc */
/**
 * RoamView:
 * @model:   model view matrix
 * @proj:    projection matrix
 * @view:    viewport matrix
 * @version: version
 *
 * Stores projection matrices
 */
struct _RoamView {
	gdouble model[16];
	gdouble proj[16];
	gint view[4];
	gint version;
};

/*************
 * RoamPoint *
 *************/
/**
 * RoamPoint:
 *
 * Points are used as vertices for triangles. A single point my be shared among
 * several triangles in order to conceive space and avoid recalculating
 * projections. Points also store a lot of cached data. The normal vertex normal
 * is the averaged surface normal of each associated triangle.
 */
struct _RoamPoint {
	/*< private >*/
	gdouble  x, y, z;    /* Model coordinates */
	gdouble  px, py, pz; /* Projected coordinates */
	gint     pversion;   /* Version of cached projection */

	gint     tris;       /* Count of associated triangles */
	gdouble  norm[3];    /* Vertex normal */

	/* For get_intersect */
	gdouble  lat, lon, elev;

	/* For terrain */
	RoamHeightFunc height_func;
	gpointer       height_data;
};
RoamPoint *roam_point_new(double lat, double lon, double elev);
void roam_point_add_triangle(RoamPoint *point, RoamTriangle *triangle);
void roam_point_remove_triangle(RoamPoint *point, RoamTriangle *triangle);
void roam_point_update_height(RoamPoint *point);
void roam_point_update_projection(RoamPoint *point, RoamView *view);

/****************
 * RoamTriangle *
 ****************/
/**
 * RoamTriangle:
 *
 * Triangles are one of the key datatypes in ROAM. The surface is made up of
 * triangles. Each triangle has an associated "error". When the surface is being
 * updated after the view changes, each triangles error is updated. Afterwards
 * the triangles with the most error are split int to triangles, each with a
 * lower error than the original.
 *
 * Triangles store a lot of data about their location in the mesh so that they
 * can be split and merged (unsplit) without having to recreate the mesh.
 */
struct _RoamTriangle {
	/*< private >*/
	/* Left, middle and right vertices */
	struct { RoamPoint    *l,*m,*r; } p;

	/* Left, base, and right neighbor triangles */
	struct { RoamTriangle *l,*b,*r; } t;

	RoamPoint *split;      /* Split point */
	RoamDiamond *parent;   /* Parent diamond */
	RoamTriangle *kids[2]; /* Higher-res triangles */
	double norm[3];        /* Surface normal */
	double error;          /* Screen space error */
	GPQueueHandle handle;

	/* For get_intersect */
	struct { gdouble n,s,e,w; } edge;
};
RoamTriangle *roam_triangle_new(RoamPoint *l, RoamPoint *m, RoamPoint *r,
		RoamDiamond *parent);
void roam_triangle_free(RoamTriangle *triangle);
void roam_triangle_add(RoamTriangle *triangle,
		RoamTriangle *left, RoamTriangle *base, RoamTriangle *right,
		RoamSphere *sphere);
void roam_triangle_remove(RoamTriangle *triangle, RoamSphere *sphere);
void roam_triangle_update_errors(RoamTriangle *triangle, RoamSphere *sphere);
void roam_triangle_split(RoamTriangle *triangle, RoamSphere *sphere);
void roam_triangle_draw(RoamTriangle *triangle);
void roam_triangle_draw_normal(RoamTriangle *triangle);

/***************
 * RoamDiamond *
 ***************/
/**
 * RoamDiamond:
 *
 * When two adjacent triangles are split, they, along with the four new child
 * triangles, are added to a diamond which keeps track of them.
 *
 * Like triangles, diamond have an error associated with it. However, when a
 * diamonds error is small enough it is "merged". That is, the diamond along
 * with the child triangles is removed and the original two triangles triangles
 * are added back into the mesh.
 */
struct _RoamDiamond {
	/*< private >*/
	RoamTriangle *parents[2]; /* Parent triangles */
	double error;             /* Screen space error */
	gboolean active;          /* For internal use */
	GPQueueHandle handle;
};
RoamDiamond *roam_diamond_new(RoamTriangle *parent0, RoamTriangle *parent1);
void roam_diamond_add(RoamDiamond *diamond, RoamSphere *sphere);
void roam_diamond_remove(RoamDiamond *diamond, RoamSphere *sphere);
void roam_diamond_merge(RoamDiamond *diamond, RoamSphere *sphere);
void roam_diamond_update_errors(RoamDiamond *diamond, RoamSphere *sphere);

/**************
 * RoamSphere *
 **************/
/**
 * RoamSphere:
 *
 * The sphere keeps track of the triangles and diamonds in the mesh. 
 *
 * Originally the sphere consists of only 8 triangles forming a octahedron.
 * These triangles are quickly split to create a smoother sphere.
 */
struct _RoamSphere {
	/*< private >*/
	GPQueue *triangles; /* List of triangles */
	GPQueue *diamonds;  /* List of diamonds */
	RoamView *view;     /* Current projection */
	gint polys;         /* Polygon count */

	/* For get_intersect */
	RoamTriangle *roots[8]; /* Original 8 triangles */
};
RoamSphere *roam_sphere_new();
void roam_sphere_update_view(RoamSphere *sphere);
void roam_sphere_update_errors(RoamSphere *sphere);
void roam_sphere_split_one(RoamSphere *sphere);
void roam_sphere_merge_one(RoamSphere *sphere);
gint roam_sphere_split_merge(RoamSphere *sphere);
void roam_sphere_draw(RoamSphere *sphere);
void roam_sphere_draw_normals(RoamSphere *sphere);
GList *roam_sphere_get_intersect(RoamSphere *sphere, gboolean all,
		gdouble n, gdouble s, gdouble e, gdouble w);
void roam_sphere_free(RoamSphere *sphere);

#endif