rendered paste body/*
* This Program will allow for universal editing of
* bzflag maps.
*
*
*
*/
/*
* gtkbzedit - the gtk+ bzflag editer client
*
*
* Copyright (C) 2008 Nathaniel Nelson
*
* gtkatlantic 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 2 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define _GNU_SOURCE
#include "global.h"
#include "main.h"
#include "callback.h"
#include "mesh3d.h"
int main(int argc, char **argv) {
gtk_init(&argc, &argv);
gdk_init(&argc, &argv);
g = malloc(sizeof(_global));
d3d = malloc(sizeof(_3d_data));
// get the first char
g->t = unit_rt();
if(!argc >= 2) {
printf("Usage: \n gtkbzedit filename.bzw \n");
exit(0);
}
g->fname = argv[1];
g->stage = 0;
g->made_gc =0;
g->t_color = TRUE;
g->m_color = FALSE;
g->k_flip = FALSE;
printf("g->fname = %s\n", g->fname);
create_window();
gtk_timeout_add(200, client_loop, NULL);
gtk_main();
}
void print_object(int obj_num) {
printf("Object Added; Number %d\n", obj_num);
printf("Object Info:\n");
if(o[obj_num]->name) printf("Name: %s\n", o[obj_num]->name);
if(o[obj_num]->obj == ARC) printf("Type: ARC\n");
if(o[obj_num]->obj == BASE) printf("Type: BASE\n");
if(o[obj_num]->obj == BOX) printf("Type: BOX\n");
if(o[obj_num]->obj == COLOR) printf("Type: COLOR\n");
if(o[obj_num]->obj == CONE) printf("Type: CONE\n");
if(o[obj_num]->obj == DEFINE) printf("Type: DEFINE\n");
if(o[obj_num]->obj == DYNAMICCOLOR) printf("Type: DYNAMICCOLOR\n");
if(o[obj_num]->obj == GROUP) printf("Type: GROUP\n");
if(o[obj_num]->obj == LINK) printf("Type: LINK\n");
if(o[obj_num]->obj == MATERIAL) printf("Type: MATERIAL\n");
if(o[obj_num]->obj == MESH) printf("Type: MESH\n");
if(o[obj_num]->obj == MESHBOX) printf("Type: MESHBOX\n");
if(o[obj_num]->obj == MESHPYR) printf("Type: MESHPYR\n");
if(o[obj_num]->obj == OPTIONS) printf("Type: OPTIONS\n");
if(o[obj_num]->obj == PHYSICS) printf("Type: PHYSICS\n");
if(o[obj_num]->obj == PYRAMID) printf("Type: PYRIMID\n");
if(o[obj_num]->obj == SPHERE) printf("Type: SPHERE\n");
if(o[obj_num]->obj == TELEPORTER) printf("Type: TELEPORTER\n");
if(o[obj_num]->obj == TEXTUREMATRIX) printf("Type: TEXTUREMATRIX\n");
if(o[obj_num]->obj == WATERLEVEL) printf("Type: WATERLEVEL\n");
if(o[obj_num]->obj == WEAPON) printf("Type: WEAPON\n");
if(o[obj_num]->obj == WORLD) printf("Type: WORLD\n");
if(o[obj_num]->obj == ZONE) printf("Type: ZONE\n");
printf("Size: %f %f %f\n", o[obj_num]->size.x, o[obj_num]->size.y, o[obj_num]->size.z);
printf("Position: %f %f %f\n", o[obj_num]->pos.x, o[obj_num]->pos.y, o[obj_num]->pos.z);
printf("Rotation: %f\n\n", o[obj_num]->rotation);
printf("Spin %f %f %f %f\n", o[obj_num]->spin.angle, o[obj_num]->spin.x, o[obj_num]->spin.y, o[obj_num]->spin.z);
printf("Shift: %f %f %f\n", o[obj_num]->shift.x, o[obj_num]->shift.y, o[obj_num]->shift.z);
printf("Shear: %f %f %f\n", o[obj_num]->shear.x, o[obj_num]->shear.y, o[obj_num]->shear.z);
printf("Scale: %f %f %f\n", o[obj_num]->scale.x, o[obj_num]->scale.y, o[obj_num]->scale.z);
printf("Texturesize: %f %f %f %f\n", o[obj_num]->texsize[1], o[obj_num]->texsize[2], o[obj_num]->texsize[3], o[obj_num]->texsize[4]);
if(o[obj_num]->phydrv) printf("Phydrv: %s\n", o[obj_num]->phydrv);
printf("Divisions: %d\n", o[obj_num]->divisions);
printf("Ratio: %d\n", o[obj_num]->ratio);
printf("Flatshading: %d\n", o[obj_num]->flatshading);
printf("Smoothbounce: %d\n", o[obj_num]->smoothbounce);
printf("Tcolor: %d\n", o[obj_num]->tcolor);
printf("Oncap flag id: %d\n", o[obj_num]->oncap);
printf("Tint: %f %f %f %f\n", o[obj_num]->tint[1], o[obj_num]->tint[2], o[obj_num]->tint[3], o[obj_num]->tint[4]);
printf("Drive Through: %d\n", o[obj_num]->drivethrough);
printf("Smoot Through: %d\n", o[obj_num]->shootthrough);
printf("From: %s\n", o[obj_num]->from);
printf("To: %s\n", o[obj_num]->to);
printf("border: %f\n", o[obj_num]->border);
printf("Color: %f %f %f %f\n", o[obj_num]->color[1], o[obj_num]->color[2], o[obj_num]->color[3], o[obj_num]->color[4]);
// TO DO: add matref
}
void new_map_object() {
o[g->n_obj] = malloc(sizeof(objects));
// o[g->n_obj]->name = NULL;
o[g->n_obj]->obj = BOX;
o[g->n_obj]->size = (point){ 0.0, 0.0, 0.0};
o[g->n_obj]->pos = (point){ 0.0, 0.0, 0.0};
o[g->n_obj]->rotation = 0.0;
o[g->n_obj]->spin = (apoint){ 0.0, 0.0, 0.0, 0.0};
o[g->n_obj]->shift = (point){ 0.0, 0.0, 0.0};
o[g->n_obj]->shear = (point){ 0.0, 0.0, 0.0};
o[g->n_obj]->scale = (point){ 0.0, 0.0, 0.0};
//o[g->n_obj]->texsize = {0.0, 0.0, 0.0, 0.0};
// o[g->n_obj]->phydrv = NULL;
o[g->n_obj]->divisions =0;
o[g->n_obj]->ratio =0;
o[g->n_obj]->flatshading =0;
o[g->n_obj]->smoothbounce =0;
o[g->n_obj]->tcolor = 1;
o[g->n_obj]->oncap = f_SW;
//o[g->n_obj]->tint = { 0.0, 0.0, 0.0, 0.0};
o[g->n_obj]->drivethrough = 0;
o[g->n_obj]->shootthrough = 0;
// o[g->n_obj]->from = NULL;
// o[g->n_obj]->to = NULL;
o[g->n_obj]->border = 0.0;
// o[g->n_obj]->color = { 0.0, 0.0, 0.0, 0.0};
o[g->n_obj]->b_color = 0;
// o[g->n_obj]->matrefs = { 0, 0, 0, 0, 0, 0, 0};
}
gboolean client_loop() {
FILE *map;
if(g->stage == 0) {
g->stage = 1;
map = fopen(g->fname, "r");
if(map == NULL){
printf("failed to open file %s\n", g->fname);
exit(0);
}
g->n_obj = 0;
g->n_box = 0;
g->n_pyr = 0;
g->n_base = 0;
g->n_tel = 0;
g->n_link = 0;
g->c = fgetc(map);
g->string = malloc(300);
while (!(feof(map))) {
new_map_object();
read_map(map);
//print_object(g->n_obj);
g->n_obj++;
//sleep(1);
}
printf("Done Reading file\n");
printf("Read: \n");
printf("%i objects\n", g->n_obj);
printf("%i boxes\n", g->n_box);
printf("%i pyramids\n", g->n_pyr);
printf("%i bases\n", g->n_base);
printf("%i teleports\n", g->n_tel);
printf("%i links\n", g->n_link);
fclose(map);
// this is so that the map is not drawn to early
g->stage = 2;
}
return(TRUE);
}
void create_window(){
g->mainwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(g->mainwin), "Bzedit2");
gtk_window_set_policy(GTK_WINDOW(g->mainwin), FALSE, TRUE, TRUE);
gtk_widget_set_usize(g->mainwin, 700, 500);
gtk_widget_set_events(g->mainwin, GDK_KEY_PRESS_MASK);
//call backs
gtk_signal_connect(GTK_OBJECT(g->mainwin), "delete-event", (GtkSignalFunc) cb_exit, NULL);
gtk_signal_connect(GTK_OBJECT(g->mainwin), "destroy", (GtkSignalFunc) gtk_exit, NULL);
gtk_signal_connect(GTK_OBJECT(g->mainwin), "key-press-event", (GtkSignalFunc) cb_keypress, NULL);
g->w_height = 500;
g->w_with = 700;
g->mainbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(g->mainwin), g->mainbox);
g->draw = gtk_drawing_area_new();
gtk_drawing_area_size(GTK_DRAWING_AREA(g->draw), 700, 500);
gtk_box_pack_start(GTK_BOX(g->mainbox), g->draw, TRUE, TRUE, 0);
gtk_signal_connect(GTK_OBJECT(g->draw), "expose_event", (GtkSignalFunc) cb_expose, NULL);
g->d_with = 700;
g->d_height = 500;
//margian = 2
//view port
d3d->left = 0;
d3d->top = 0;
d3d->right = g->d_with;
d3d->bottom = g->d_height;
// originally all the fallowing were /2
d3d->Ox = (d3d->right + d3d->left)/2;
d3d->Oy = (d3d->bottom + d3d->top)/2;
d3d->x1 = -(d3d->right + d3d->left);
d3d->x2 = (d3d->bottom + d3d->top);
d3d->y1 = (d3d->right + d3d->left);
d3d->y2 = -(d3d->bottom + d3d->top);
d3d->perspective = FALSE;
d3d->subjective = FALSE;
gtk_widget_show_all(g->mainwin);
}
void draw_map() {
int i;
// clear drawing
gdk_draw_rectangle(g->draw->window, g->draw->style->bg_gc[GTK_WIDGET_STATE (g->draw)], TRUE, 0, 0, g->draw->allocation.width, g->draw->allocation.height);
d3d->e = (point){0.0, 0.0, 800};
draw_wall(800, g->t);
// if done loading ....
if(g->stage >= 2) {
//loop and draw all objects
for(i=0; i<g->n_obj; i++){
if(o[i]->obj == BOX || o[i]->obj == BASE || o[i]->obj == TELEPORTER){
draw_box(o[i]->size.x, o[i]->size.y, o[i]->size.z, o[i]->pos, o[i]->rotation, i, g->t);
}
else if(o[i]->obj == PYRAMID){
draw_pyr(o[i]->size, o[i]->pos, o[i]->rotation, g->t);
}
else {
//printf("not drawn yet\n");
}
}
}
}
void new_frame() {
// free old one
if(g->bdraw) g_free(g->bdraw);
// now make a pix map to draw on
g->bdraw = gdk_pixmap_new( g->draw->window, g->d_with, g->d_height, -1);
}
char fgetch(FILE *in) {
char c;
c = fgetc(in);
if(feof(in)) {
g->s = sym_eof;
return(EOF);
}
return(c);
}
int phrase(FILE *in) {
int clear;
char *str;
int len;
//char c;
bool done;
len = 0;
done = 0;
// 9 = TAB
// 10 = LF (line Feed)
// 13 = CR (carage Return)
//if(g->s == sym_eof) return(0);
// clear out string
for(clear=0; clear<200; clear++) {
g->string[clear] = ' ';
}
// if(feof(in)) return(0);
if(g->c == EOF) return(0);
//if(g->c == '@' ) return;
while(g->c == ' ' || g->c == '\x09' || g->c == '\n' || g->c == '\r' || g->c == '#') {
// to do FIX ME keep comments
//printf("in first while first char :%c\n", g->c);
if(g->c == '#'){
while(1)
{
g->c = fgetc(in);
if(g->c == EOF) return(0);
putchar(g->c);
if(g->c == '\n' || g->c == '\r' || g->c == 0) break;
done = 1;
}
}
else g->c = fgetc(in);
if(g->c == EOF) return(0);
putchar(g->c);
//
}
// printf("Secound part \n\n");
// now see if it maches cryteria
if(isalpha(g->c) || g->c == '_') {
// set the string to it
g->string[0] = g->c;
len = 0;
while(isalpha(g->c) || g->c == '_') {
g->c = fgetc(in);
if(g->c == EOF) return(0);
g->string[len + 1] = g->c;
putchar(g->c);
len ++;
//printf("%s\n", g->string);
}
str = strndup( g->string, len);
if(!strncmp(str, "box", len)) g->s = sym_box;
else if(!strncmp(str, "position", len)) g->s = sym_position;
else if(!strncmp(str, "rotation", len)) g->s = sym_rotation;
else if(!strncmp(str, "size", len)) g->s = sym_size;
else if(!strncmp(str, "end", len)) g->s = sym_end;
else if(!strncmp(str, "border", len)) g->s = sym_border;
else if(!strncmp(str, "angle", len)) g->s = sym_angle;
else if(!strncmp(str, "base", len)) g->s = sym_base;
else if(!strncmp(str, "color", len)) g->s = sym_color;
else if(!strncmp(str, "delay", len)) g->s = sym_delay;
else if(!strncmp(str, "divisions", len)) g->s = sym_divisions;
else if(!strncmp(str, "drivethrough", len)) g->s = sym_drivethrough;
else if(!strncmp(str, "flagheight", len)) g->s = sym_flagheight;
else if(!strncmp(str, "flatshading", len)) g->s = sym_flatshading;
else if(!strncmp(str, "from", len)) g->s = sym_from;
else if(!strncmp(str, "initdelay", len)) g->s = sym_initdelay;
else if(!strncmp(str, "link", len)) g->s = sym_link;
else if(!strncmp(str, "name", len)) g->s = sym_name;
else if(!strncmp(str, "passable", len)) g->s = sym_passable;
else if(!strncmp(str, "pyramid", len)) g->s = sym_pyramid;
else if(!strncmp(str, "ratio", len)) g->s = sym_ratio;
else if(!strncmp(str, "scale", len)) g->s = sym_scale;
else if(!strncmp(str, "shear", len)) g->s = sym_shear;
else if(!strncmp(str, "shift", len)) g->s = sym_shift;
else if(!strncmp(str, "shootthrough", len)) g->s = sym_shootthrough;
else if(!strncmp(str, "smoothbounce", len)) g->s = sym_smoothbounce;
else if(!strncmp(str, "teleporter", len)) g->s = sym_teleporter;
else if(!strncmp(str, "to", len)) g->s = sym_to;
else if(!strncmp(str, "type", len)) g->s = sym_type;
else if(!strncmp(str, "weapon", len)) g->s = sym_weapon;
else if(!strncmp(str, "world", len)) g->s = sym_world;
else if(!strncmp(str, "spin", len)) g->s = sym_spin;
else if(!strncmp(str, "meshbox", len)) g->s = sym_meshbox;
else if(!strncmp(str, "meshpyr", len)) g->s = sym_meshpyr;
else if(!strncmp(str, "material", len)) g->s = sym_material;
else if(!strncmp(str, "physics", len)) g->s = sym_physics;
else if(!strncmp(str, "zone", len)) g->s = sym_zone;
else if(!strncmp(str, "phydrv", len)) g->s = sym_phydrv;
else if(!strncmp(str, "matref", len)) g->s = sym_matref;
else if(!strncmp(str, "linear", len)) g->s = sym_linear;
else if(!strncmp(str, "angular", len)) g->s = sym_angular;
else if(!strncmp(str, "slide", len)) g->s = sym_slide;
else if(!strncmp(str, "death", len)) g->s = sym_death;
else if(!strncmp(str, "texture", len)) g->s = sym_texture;
else if(!strncmp(str, "addtexture", len)) g->s = sym_addtexture;
else if(!strncmp(str, "notexture", len)) g->s = sym_notexture;
else if(!strncmp(str, "notexcolor", len)) g->s = sym_notexcolor;
else if(!strncmp(str, "notexalpha", len)) g->s = sym_notexalpha;
else if(!strncmp(str, "texmat", len)) g->s = sym_texmat;
else if(!strncmp(str, "dyncol", len)) g->s = sym_dyncol;
else if(!strncmp(str, "ambient", len)) g->s = sym_ambient;
else if(!strncmp(str, "diffuse", len)) g->s = sym_diffuse;
else if(!strncmp(str, "specular", len)) g->s = sym_specular;
else if(!strncmp(str, "emission", len)) g->s = sym_emission;
else if(!strncmp(str, "shininess", len)) g->s = sym_shininess;
else if(!strncmp(str, "zoneflag", len)) g->s = sym_zoneflag;
else if(!strncmp(str, "flag", len)) g->s = sym_flag;
else if(!strncmp(str, "team", len)) g->s = sym_team;
else if(!strncmp(str, "safety", len)) g->s = sym_safety;
else if(!strncmp(str, "texturematrix", len)) g->s = sym_texturematrix;
else if(!strncmp(str, "center", len)) g->s = sym_center;
else if(!strncmp(str, "fixedscale", len)) g->s = sym_fixedscale;
else if(!strncmp(str, "fixedspin", len)) g->s = sym_fixedspin;
else if(!strncmp(str, "fixedshift", len)) g->s = sym_fixedshift;
else if(!strncmp(str, "cone", len)) g->s = sym_cone;
else if(!strncmp(str, "sphere", len)) g->s = sym_sphere;
else if(!strncmp(str, "radius", len)) g->s = sym_radius;
printf("symble Number %i\n", g->s);
}
// printf("third part\n");
if(isdigit(g->c) || g->c == '.' || g->c =='-') {
// set the string to it
g->string[0] = g->c;
len = 0;
g->inf = 0.0;
while(isdigit(g->c) || g->c == '.' || g->c =='-') {
g->c = fgetc(in);
if(g->c == EOF) return(0);
g->string[len + 1] = g->c;
putchar(g->c);
len ++;
//printf("%s\n", g->string);
}
str = strndup(g->string, len);
//str[len + 1] = '\0';
//printf("%i,%s\n\n", len, str);
//g->isint = 0;
if(g->isint == TRUE) {
g->ini = atoi(str);
}
g->inf = atof(str);
//printf("got float: %f \n", g->inf);
//g->s = sym_number;
}
//printf("forth part\n");
//if(feof(in)) return(0);
//printf("\n\nstring: %s\n\n", str);
//g->string = strdup(str);
//sleep(1);
//free(g->string);
return (1);
}
float read_number(FILE *in) {
float tmp;
//if(!g->s == sym_number){
// printf("ERROR expected NUMBER\n");
// return(0.0);
// }
tmp = g->inf;
//printf("\n%f\n",tmp);
phrase(in);
return(tmp);
}
void read_map(FILE *in){
// to start malloc a block
g->isint = FALSE;
phrase(in);
if(feof(in)) return;
if(g->s == sym_box) {
g->n_box++;
o[g->n_obj]->obj = BOX;
}
if(g->s == sym_pyramid) {
g->n_pyr++;
o[g->n_obj]->obj = PYRAMID;
}
if(g->s == sym_base) {
g->n_base++;
o[g->n_obj]->obj = BASE;
}
if(g->s == sym_teleporter) {
g->n_tel++;
o[g->n_obj]->obj = TELEPORTER;
}
if(g->s == sym_link) {
g->n_link++;
o[g->n_obj]->obj = LINK;
}
phrase(in);
// untill the function returns
while(1) {
g->isint = FALSE;
if(feof(in)) return;
//sleep(1);
// read symbles
if(g->s == sym_end) {
//phrase(in);
return;
}
else if(g->s == sym_name) {
phrase(in);
// o[g->n_obj]->name = strdup( g->string );
//printf("object name: %s", o[g->n_obj]->name);
phrase(in);
}
else if(g->s == sym_position) {
phrase(in);
o[g->n_obj]->pos.x = read_number(in);
o[g->n_obj]->pos.y = read_number(in);
o[g->n_obj]->pos.z = read_number(in);
}
else if(g->s == sym_size) {
phrase(in);
o[g->n_obj]->size.x = read_number(in);
o[g->n_obj]->size.y = read_number(in);
o[g->n_obj]->size.z = read_number(in);
}
else if(g->s == sym_rotation) {
phrase(in);
o[g->n_obj]->rotation = read_number(in);
}
// base color
else if(g->s == sym_color && o[g->n_obj]->obj == BASE) {
// Getting int
g->isint = TRUE;
phrase(in);
o[g->n_obj]->b_color = g->ini;
g->isint = FALSE;
phrase(in);
}
else {
printf("missing, phrase error or ???\n");
phrase(in);
//sleep(5);
}
}
}