File: global.h

package info (click to toggle)
s3d 0.2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,708 kB
  • sloc: ansic: 23,609; python: 488; perl: 98; makefile: 31; sh: 29
file content (414 lines) | stat: -rw-r--r-- 13,737 bytes parent folder | download
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* SPDX-FileCopyrightText: 2004-2015  Simon Wunderlich <sw@simonwunderlich.de>
 */

#ifndef _GLOBAL_H_
#define _GLOBAL_H_

#include "config.h"
#ifdef __APPLE__
#ifdef SHM
#undef SHM
#endif
#endif
#include <stdint.h>		/*  integer types */
#ifdef SHM
#include <sys/shm.h>		/* key_t */
#endif
#ifdef G_SDL
#include <SDL3/SDL.h>
#endif
/*  variables and defines */
#ifdef G_SDL
extern SDL_Window *sdl_window;
#endif
extern int frame_mode;		/*  SDL, ... ? */
extern int running;		/*  server running flag */
/*  relevance macros */
#ifndef S3DUNUSED
#if defined(UNUSEDPARAM_ATTRIBUTE)
#define S3DUNUSED(x) (x)__attribute__((unused))
#elif defined(UNUSEDPARAM_OMIT)
#define S3DUNUSED(x)		/* x */
#else
#define S3DUNUSED(x) x
#endif
#endif

#ifdef __GNUC_MINOR__
#define S3D_FORMAT(type, fmt_pos, arg_pos)  __attribute__ ((format (type, fmt_pos, arg_pos)))
#else
#define S3D_FORMAT(type, fmt_pos, arg_pos)
#endif

#ifndef S3D_NAME_MAX
#define S3D_NAME_MAX 256	/*  limit for names [e.g. process names] */
#endif /* S3D_NAME_MAX */

#define MCP   0			/*  the mcp's pid  */
#define TEXTURE_MAX_W 4096
#define TEXTURE_MAX_H 4096
/*  server version */
#define S3D_SERVER_MAJOR 0
#define S3D_SERVER_MINOR 1
#define S3D_SERVER_PATCH 1
#define S3D_SERVER_NAME  "dotslash s3d server"

#define MAXPLEN 65536

#define RB_STD_SIZE  1024*512
#define RB_MAX_SIZE  1048*4096
#define SHM_SIZE  sizeof(key_t)*2	/* space for the keys */

#define RB_OVERHEAD  sizeof(struct buf_t)

#define OBJ_VALID(p,oid,o) (oid >= 0) && ((oid < p->n_obj) && ((o=p->object[oid])!=NULL))
typedef float t_mtrx[16];

struct buf_t {
	uint32_t start, end, bufsize;	/* start/end of the data */
};

/*  some graphic simple prototypes, they might get into some headerfile later ... */
/*  our lovely vertex list ... */
struct t_vertex {
	float x, y, z;
};

struct t_texc {
	float x, y;
};

/*  polygon definition; */
/*  it's all handled via list types as usually we have only one surface for many polygons, */
/*  and many vertexes have 2 or more polygons connected. OpenGL will optimize the lists for us */
/*  anyways, so we shouldn't care ... */
struct t_poly {
	uint32_t v[3];		/*  we define a poly as set of 3 vertexes, as its usual */
	struct t_vertex n[3];	/*  normal vectors */
	uint32_t mat;		/*  material index */
	struct t_texc tc[3];	/*  texture coords */
};

struct t_line {
	uint32_t v[2];
	struct t_vertex n[2];	/* normal vectors */
	uint32_t mat;
};

/*  material of surfaces, as it's usual in the OpenGL standard */
struct t_mat {
	float amb_r, amb_g, amb_b, amb_a,	/*  ambience */
	 spec_r, spec_g, spec_b, spec_a,	/*  specualar */
	 diff_r, diff_g, diff_b, diff_a;	/*  diffusion */
	int32_t tex;		/*  texture index, -1 if there is no */
};
/*  this defines a texture */
struct t_tex {
	uint16_t w, h;		/*  width and height */
	uint16_t tw, th;	/*  texture width */
	uint8_t *buf;		/*  the data */
	float xs, ys;		/*  scale data for gl-implementations which require 2^x */
	int shmid;		/* shared memory id, is -1 if it's not attached */
	/*  texture sizes. */
	int32_t gl_texnum;	/*  the gl texture number. */
};

/*  the object type */
struct t_obj {
	uint32_t oflags;	/*  flags, like this object beeing input etc. */
#define OF_TURN_ON   1
#define OF_TURN_OFF  2
#define OF_TURN_SWAP  3

#define OF_VISIBLE  0x00000001
#define OF_SELECTABLE 0x00000002
#define OF_POINTABLE 0x00000004

#define OF_CLONE_SRC 0x01000000
#define OF_LINK_SRC  0x02000000
#define OF_LINK   0x04000000

#define OF_TYPE   0xF0000000
#define OF_NODATA  0xF0000000	/* no data allowed! */

#define OF_CLONE  0x10000000
#define OF_VIRTUAL  0x20000000

#define OF_SYSTEM  0x80000000
#define OF_CAM   0x90000000
#define OF_POINTER  0xA0000000
#define OF_3DPOINTER 0xB0000000

#define OF_MASK   0x00FFFFFF
	int32_t virtual_pid;	/* if virtual, this contains the pid */
	int32_t clone_ooid;	/* if clone, this contains the oid of the original */

	int32_t n_vertex, n_mat, n_poly, n_tex, n_line;
	int32_t dplist;		/*  opengl display list number */
	int32_t linkid;		/*  linking target, -1 if there is none */
	int32_t lsub, lnext, lprev;
	/*  pointer to our objects; */
	struct t_vertex *p_vertex;
	struct t_mat *p_mat;
	struct t_poly *p_poly;
	struct t_line *p_line;
	struct t_tex *p_tex;
	struct t_vertex translate, rotate;
	float scale;
	t_mtrx m;
	int m_uptodate;
	float r, o_r;		/*  radius, object radius */
};

#ifdef SHM
struct t_shmcb {
	int shmid_ctos, shmid_stoc;
	key_t key_ctos, key_stoc;
	char *data_ctos, *data_stoc;
	int size_ctos, size_stoc;
	int idle;
};
#endif

/*  l_* is a list-type, t_* is the type itself */
struct t_process {
	char name[S3D_NAME_MAX];	/*  process name */
	struct t_obj **object;	/*  initial pointer to object list */
	int32_t n_obj;		/*  number of objects */
	int32_t biggest_obj;	/*  the biggest object */
	int32_t mcp_oid;	/*  oid in mcp */
	int id;			/*  pid */
	int con_type;		/*  type of connection, one of following: */
#define CON_NULL 0
#define CON_TCP  1
#define CON_SHM  2
#ifdef TCP
	int sockid;
#endif
#ifdef SHM
	struct t_shmcb shmsock;
#endif
};

enum {
	zero,
	FRAME_SDL
};
/*  main.c */
int rc_init(void);
int init(void);
void quit(void);
void one_time(void);
/*  network.c */
extern uint8_t ibuf[MAXPLEN];
extern uint8_t obuf[MAXPLEN];
extern volatile int turn;
void sigpipe_handler(int);
void sigio_handler(int);
int network_init(void);
int network_quit(void);
int network_main(void);
int n_readn(struct t_process *p, uint8_t * str, int s);
int n_writen(struct t_process *p, uint8_t * str, int s);
int n_remove(struct t_process *p);
#ifdef G_SDL
uint32_t net_turn_off(void *userdata, SDL_TimerID timerID, uint32_t interval);
#endif
/* tcp.c */
int tcp_init(void);
int tcp_quit(void);
int tcp_pollport(void);
int tcp_pollproc(void);
int tcp_prot_com_in(struct t_process *p);
int tcp_writen(int sock, uint8_t * str, int s);
int tcp_readn(int sock, uint8_t * str, int s);
int tcp_remove(int sock);
/* shm.c/shm_ringbuf.c */
int shm_init(void);
int shm_quit(void);
int shm_main(void);
int shm_next_key(void);
int shm_remove(struct t_process *p);
int shm_writen(struct buf_t *rb, uint8_t * buf, int n);
int shm_readn(struct buf_t *rb, uint8_t * buf, int n);
int shm_prot_com_in(struct t_process *p);
/* shm_ringbuf.c */
void ringbuf_init(char *data, uint32_t init_size);
int shm_write(struct buf_t *rb, char *buf, int n);
int shm_read(struct buf_t *rb, char *buf, int n);
/*  proto.c */
extern int focus_oid;
int prot_com_in(struct t_process *p, uint8_t * pbuf);
int prot_com_out(struct t_process *p, uint8_t opcode, uint8_t * buf, uint16_t length);
/* event.c */
int event_obj_info(struct t_process *p, int32_t oid);
int event_obj_click(struct t_process *p, int32_t oid);
int event_key_pressed(uint16_t key, uint16_t uni, uint16_t mod, int state);
int event_mbutton_clicked(uint8_t button, uint8_t state);
int event_texshm(struct t_process *p, int32_t oid, int32_t tex);
int event_cam_changed(void);
int event_ptr_changed(void);
int event_init(struct t_process *p);
int event_quit(struct t_process *p);
int event_ping_in(struct t_process *p, uint32_t o);
/*   user.c */
extern int but;
int user_init(void);
int user_quit(void);
int user_main(void);
#ifdef G_SDL
int user_init_sdl(void);
int user_quit_sdl(void);
int user_main_sdl(void);
#endif
void user_mouse(int button, int state, int x, int y);
void user_key(unsigned short key, unsigned short unicode, unsigned short mod, int state);

/*  error.c */
void errn(const char *func, int en);
void errnf(const char *func, int en);
void errs(const char *func, const char *msg);
void errsf(const char *func, const char *msg);
#ifdef DEBUG
void errds(int relevance, const char *func, const char *fmt, ...) S3D_FORMAT(printf, 3, 4);
void s3dprintf(int relevance, const char *msg, ...) S3D_FORMAT(printf, 2, 3);
#else
static void errds(int relevance, const char *func, const char *fmt, ...) S3D_FORMAT(printf, 3, 4);
static void s3dprintf(int relevance, const char *msg, ...) S3D_FORMAT(printf, 2, 3);

static __inline__ void errds(int relevance __attribute__ ((unused)), const char *func __attribute__ ((unused)), const char *fmt __attribute__ ((unused)), ...)
{
}

static __inline__ void s3dprintf(int relevance __attribute__ ((unused)), const char *msg __attribute__ ((unused)), ...)
{
}
#endif
/*  graphics.c */
extern int winw, winh;
int graphics_quit(void);
void graphics_main(void);
int graphics_pick_obj(int x, int y);
int graphics_init(void);
int render_by_mcp(void);
#ifdef G_SDL
extern int aa_level;
extern int SDLFlags;
int graphics_init_sdl(void);
int graphics_quit_sdl(void);
#endif

void graphics_reshape(int w, int h);
/*  navigation.c */
void navi_left(void);
void navi_right(void);
void navi_fwd(void);
void navi_back(void);
void navi_rot_left(void);
void navi_rot_right(void);
void navi_rot_up(void);
void navi_rot_down(void);
void navi_pos(int xdif, int ydif);
void navi_rot(int xdif, int ydif);
void ptr_move(int x, int y);
/*  process.c */
extern struct t_process *procs_p;
extern int procs_n;
struct t_process *process_add(void);
int process_del(int id);
int process_init(void);
int process_quit(void);
struct t_process *process_protinit(struct t_process *p, const char *name);
struct t_process *get_proc_by_pid(int pid);
/*  object.c */
int obj_debug(struct t_process *p, int32_t oid);
int obj_new(struct t_process *p);
int obj_clone(struct t_process *p, int32_t oid);
int obj_clone_change(struct t_process *p, int32_t oid, int32_t toid);
int obj_link(struct t_process *p, int32_t oid_from, int32_t oid_to);
int obj_unlink(struct t_process *p, int32_t oid);
int obj_del(struct t_process *p, int32_t oid);
int obj_push_vertex(struct t_process *p, int32_t oid, float *x, int32_t n);
int obj_push_mat(struct t_process *p, int32_t oid, float *x, int32_t n);
int obj_push_poly(struct t_process *p, int32_t oid, uint32_t * x, int32_t n);
int obj_push_line(struct t_process *p, int32_t oid, uint32_t * x, int32_t n);
int obj_push_tex(struct t_process *p, int32_t oid, uint16_t * x, int32_t n);
int obj_pep_poly_normal(struct t_process *p, int32_t oid, float *x, int32_t n);
int obj_pep_line_normal(struct t_process *p, int32_t oid, float *x, int32_t n);
int obj_pep_poly_texc(struct t_process *p, int32_t oid, float *x, int32_t n);
int obj_pep_mat(struct t_process *p, int32_t oid, float *x, int32_t n);
int obj_pep_mat_tex(struct t_process *p, int32_t oid, uint32_t * x, int32_t n);
int obj_pep_vertex(struct t_process *p, int32_t oid, float *x, int32_t n);
int obj_pep_line(struct t_process *p, int32_t oid, uint32_t * x, int32_t n);
int obj_load_poly_normal(struct t_process *p, int32_t oid, float *x, int32_t start, int32_t n);
int obj_load_line_normal(struct t_process *p, int32_t oid, float *x, int32_t start, int32_t n);
int obj_load_poly_texc(struct t_process *p, int32_t oid, float *x, int32_t start, int32_t n);
int obj_load_mat(struct t_process *p, int32_t oid, float *x, int32_t start, int32_t n);
int obj_load_tex(struct t_process *p, int32_t oid, int32_t tex, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t * pixbuf);
int obj_update_tex(struct t_process *p, int32_t oid, int32_t tid, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t * pixbuf);
int obj_del_vertex(struct t_process *p, int32_t oid, int32_t n);
int obj_del_mat(struct t_process *p, int32_t oid, int32_t n);
int obj_del_poly(struct t_process *p, int32_t oid, int32_t n);
int obj_del_line(struct t_process *p, int32_t oid, int32_t n);
int obj_del_tex(struct t_process *p, int32_t oid, int32_t n);
int obj_toggle_flags(struct t_process *p, int32_t oid, uint8_t type, uint32_t flags);
int obj_translate(struct t_process *p, int32_t oid, float *transv);
int obj_rotate(struct t_process *p, int32_t oid, float *rotv);
int obj_scale(struct t_process *p, int32_t oid, float scav);
int obj_render(struct t_process *p, int32_t oid);
int obj_free(struct t_process *p, int32_t oid);
void obj_get_maximum(struct t_process *p, struct t_obj *obj);
void into_position(struct t_process *p, struct t_obj *obj, int depth);
void obj_recalc_tmat(struct t_process *p, int32_t oid);
void obj_size_update(struct t_process *p, int32_t oid);
void obj_pos_update(struct t_process *p, int32_t oid, int32_t first_oid);
void obj_check_biggest_object(struct t_process *p, int32_t oid);
int32_t get_pointer(struct t_process *p);
void link_delete(struct t_process *p, int32_t oid);
void link_insert(struct t_process *p, int32_t oid, int32_t target);
/*  mcp.c */
int mcp_rep_object(int32_t mcp_oid);
int mcp_del_object(int32_t mcp_oid);
int mcp_init(void);
int mcp_focus(int oid);
/*  matrix.c */
extern t_mtrx Identity;
void myMultMatrix(t_mtrx mat2);
void myGetMatrix(t_mtrx mat);
void mySetMatrix(t_mtrx mat);
void myTranslatef(float x, float y, float z);
void myScalef(float x, float y, float z);
void myRotatef(float angle, float x, float y, float z);
void myLoadIdentity(void);
void myTransform4f(float *v);
void myTransform3f(float *v);
void myTransformV(struct t_vertex *v);
int myInvert(void);

/* cull.c */
void cull_get_planes(void);
int cull_sphere_in_frustum(struct t_vertex *center, float radius);

/* allocate.c */
#if DEBUG <= HIGH
#include <stdlib.h>
void checkIntegrity(void);
void checkLeak(void);
void *debugMalloc(unsigned int length, int tag);
void *debugRealloc(void *memory, unsigned int length, int tag);
void debugFree(void *memoryParameter);
#define malloc(x)  debugMalloc(x,42)
#define free(x)   debugFree(x);
#define realloc(x,y) debugRealloc(x,y,42)
#endif

/* endian.c */
void htonfb(float *netfloat, int num);
void ntohfb(float *netfloat, int num);
void htonlb(uint32_t * netint32, int num);
void ntohlb(uint32_t * netint32, int num);
void htonsb(uint16_t * netint16, int num);
void ntohsb(uint16_t * netint16, int num);

#endif /* _GLOBAL_H_ */