Esempio n. 1
0
void object_player_look(obj_type *obj)
{
	float			look_add;
	weapon_type		*weap;
	
	look_add=obj->look.ang_add;
    if (look_add==0) return;
	
		// inverted looking
		
	if (setup.invert_look) look_add=-look_add;
	
		// zoom factors

	weap=weapon_find_current(obj);
	if (weap!=NULL) {
		if ((weap->zoom.on) && (weap->zoom.mode!=zoom_mode_off)) {
			look_add*=weap->zoom.look_factor;
		}
	}
	
		// change look

	obj->view_ang.x=object_player_look_constrain(obj,weap,(obj->view_ang.x+look_add));
}
Esempio n. 2
0
void view_draw(int tick)
{
	obj_type		*obj,*camera_obj;
	weapon_type		*weap;

		// get player object and held weapon
		
	obj=object_find_uid(server.player_obj_uid);
	weap=weapon_find_current(obj);

		// camera render

	view.render=&view_camera_render;
	
		// set view camera
	
	camera_obj=object_find_uid(camera.obj_uid);
	camera_get_position(&view.render->camera.pnt,&view.render->camera.ang);

	view.render->camera.fov=camera.plane.fov;
	view.render->camera.flip=FALSE;
	view.render->camera.under_liquid_idx=camera_check_liquid(&view.render->camera.pnt);
	
	view.render->no_shadow=FALSE;
	view.render->force_camera_obj=FALSE;

		// camera adjustments
	
	if (camera.mode==cv_fpp) {
		view_calculate_scope(tick,obj,camera_obj);
		view_calculate_recoil(obj);
	}
	
	view_calculate_shakes(tick,obj);
	view_calculate_sways(tick,obj);
	view_calculate_bump(obj);
	
		// build the scene
		
	view_draw_scene_build(tick);
	
		// do any back frame rendering
		
	gl_back_render_frame_start(tick);

		// render the scene

	view_draw_scene_render(tick,obj,weap);

		// draw tints and fades
		
	view_draw_liquid_tint(view.render->camera.under_liquid_idx);
	view_draw_effect_tint(tick,obj);

	fade_screen_draw(tick);
	fade_object_draw(tick,obj);
}
Esempio n. 3
0
void object_player_turn(obj_type *obj)
{
	float			turn_add,turn_restrict;
	weapon_type		*weap;
	
		// can it turn?
		
	if ((obj->turn.only_when_moving) && (!obj->forward_move.moving)) {
		obj->turn.ang_add.y=0;
		return;
	}
	
		// get turn speed
	
	obj->turn.fix_ang_add.y=0;
	
	turn_add=obj->turn.ang_add.y;
    if (turn_add==0) return;
	
		// zoom factors

	if (camera.mode==cv_fpp) {
		weap=weapon_find_current(obj);
		if (weap!=NULL) {
			if ((weap->zoom.on) && (weap->zoom.mode!=zoom_mode_off)) {
				if (obj->duck.mode!=dm_duck) {
					turn_add*=weap->zoom.turn_factor;
				}
				else {
					turn_add*=weap->zoom.crawl_turn_factor;
				}
			}
		}
	}
	
		// restriction

	if (obj->turn.restrict_player_turning) {
		turn_restrict=object_get_turn_speed(obj);
		
		if (turn_add<-turn_restrict) turn_add=-turn_restrict;
		if (turn_add>turn_restrict) turn_add=turn_restrict;
	}

		// turning
		
    obj->ang.y=angle_add(obj->ang.y,turn_add);
	obj->turn.fix_ang_add.y=turn_add;

		// turn any standing objects

	object_rotate_with_standing_object(obj,turn_add);
}
Esempio n. 4
0
JSValueRef js_event_call_held_weapon_func(JSContextRef cx,JSObjectRef func,JSObjectRef j_obj,size_t argc,const JSValueRef argv[],JSValueRef *exception)
{
	int				n,arg_count,script_idx;
	char			func_name[64],err_str[256];
	JSValueRef		rval,args[20];
	obj_type		*obj;
	weapon_type		*weap;
	script_type		*script;

	if (!script_check_param_at_least_count(cx,func,argc,1,exception)) return(script_null_to_value(cx));
	if (!script_check_fail_in_construct(cx,func,j_obj,exception)) return(script_null_to_value(cx));

		// find held weapon

	script_idx=(int)JSObjectGetPrivate(j_obj);
	script=js.script_list.scripts[script_idx];
	
	if (script->attach.thing_type!=thing_type_object) {
		*exception=script_create_exception(cx,"Not an object script");
		return(script_null_to_value(cx));
	}

	obj=object_get_attach(j_obj);
	weap=weapon_find_current(obj);
	if (weap==NULL) {
		*exception=script_create_exception(cx,"No held weapon");
		return(script_null_to_value(cx));
	}

		// get arguments

	script_value_to_string(cx,argv[0],func_name,64);

	arg_count=argc-1;
	if (arg_count<0) arg_count=0;
	if (arg_count>20) arg_count=20;

	for (n=0;n!=arg_count;n++) {
		args[n]=argv[n+1];
	}

		// call function

	rval=scripts_direct_call(script_get_index(j_obj),weap->script_idx,-1,func_name,arg_count,args,err_str);
	if (rval==NULL) {
		*exception=script_create_exception(cx,err_str);
		return(script_null_to_value(cx));
	}

	return(rval);
}
Esempio n. 5
0
JSBool js_event_send_message_to_held_weapon_func(JSContext *cx,JSObject *j_obj,uintN argc,jsval *argv,jsval *rval)
{
	obj_type		*obj;
	weapon_type		*weap;

	if (js.attach.thing_type!=thing_type_object) {
		JS_ReportError(js.cx,"Not an object script");
		return(JS_FALSE);
	}

	obj=object_find_uid(js.attach.thing_uid);
	weap=weapon_find_current(obj);
	if (weap==NULL) {
		JS_ReportError(js.cx,"No held weapon");
		return(JS_FALSE);
	}

	memmove(weap->attach.get_msg_data,js.attach.set_msg_data,(sizeof(attach_msg_type)*max_msg_data));

	scripts_post_event_console(&weap->attach,sd_event_message,sd_event_message_from_script,JSVAL_TO_INT(argv[0]));
	return(JS_TRUE);
}
Esempio n. 6
0
void run_objects_no_slice(int tick)
{
	int				n;
	obj_type		*obj;
	weapon_type		*weap;

	obj=server.objs;

	for (n=0;n!=server.count.obj;n++) {

		if (!obj->hidden) {
			
			model_draw_setup_object(tick,obj);
			model_run_animation(&obj->draw);

			if (!obj->scenery.on) {

					// fades

				model_fade_run(tick,&obj->draw);
				model_mesh_fade_run(tick,&obj->draw);

					// held weapons

				if (obj->player) {
					weap=weapon_find_current(obj);
					if (weap!=NULL) {
						model_draw_setup_weapon(tick,obj,weap,FALSE,FALSE);
						weapon_run_hand(obj,tick);
					}
				}

			}
		}
		
		obj++;
	}
}
Esempio n. 7
0
void camera_chase_get_position(d3pnt *pnt,d3ang *ang)
{
	int						n,xadd,yadd,zadd,radius,div,
							cx,cz,cy;
	float					fang,fx,fy,fz;
	d3pnt					spt,ept,hpt;
	ray_trace_contact_type	contact;
	matrix_type				mat;
	obj_type				*obj;
	weapon_type				*weap;

	obj=object_find_uid(camera.obj_uid);
	
		// get maximum camera offset
		
	fx=0;
	fy=0;
	fz=(float)camera.chase_distance;
	
	fang=angle_add(camera.cur_chase_ang.x,-obj->view_ang.x);
	
	matrix_rotate_zyx(&mat,fang,camera.cur_chase_ang.y,camera.cur_chase_ang.z);
	matrix_vertex_multiply(&mat,&fx,&fy,&fz);
	
	cx=(int)fx+obj->pnt.x;
	cy=(int)fy+obj->pnt.y;
	cz=(int)fz+obj->pnt.z;
    
        // get camera movement
        
	div=camera_chase_get_division(abs(cx-obj->pnt.x),abs(cz-obj->pnt.z),abs(cy-obj->pnt.y));
	if (div==0) div=1;
	
	xadd=(cx-obj->pnt.x)/div;
	yadd=(cy-obj->pnt.y)/div;
	zadd=(cz-obj->pnt.z)/div;
	
		// get camera starting position
	
	radius=camera.chase_size;
	
	fx=0;
	fy=0;
	fz=(float)(radius>>2);			// always move camera back to protect against hitting walls in front of player
	
	fang=angle_add(camera.cur_chase_ang.x,(obj->view_ang.x*2));
	
	matrix_rotate_zyx(&mat,fang,camera.cur_chase_ang.y,camera.cur_chase_ang.z);
	matrix_vertex_multiply(&mat,&fx,&fy,&fz);
	
	cx=(int)fx+obj->pnt.x;
	cz=(int)fz+obj->pnt.z;
	cy=(int)fy+(obj->pnt.y-obj->size.y);

		// setup contacts

	contact.obj.on=TRUE;
	contact.obj.ignore_uid=obj->uid;

	contact.proj.on=FALSE;

	contact.origin=poly_ray_trace_origin_unknown;
		
		// move camera
		
	for (n=0;n!=div;n++) {
		
			// xz movement
			
		spt.x=cx;
		spt.y=cy;
		spt.z=cz;

		ept.x=cx+xadd;
		ept.y=cy;
		ept.z=cz+zadd;

		contact.hit_mode=poly_ray_trace_hit_mode_wall_only;
		if (!ray_trace_map_by_point(&spt,&ept,&hpt,&contact)) {
			cx+=xadd;
			cz+=zadd;
		}
		
			// y movement

		spt.x=cx;
		spt.y=cy;
		spt.z=cz;

		ept.x=cx;
		ept.y=cy+yadd;
		ept.z=cz;

		contact.hit_mode=poly_ray_trace_hit_mode_floor_only;
		if (!ray_trace_map_by_point(&spt,&ept,&hpt,&contact)) cy+=yadd;
	}
	
        // new camera position

	camera.pnt.x=cx;
	camera.pnt.y=cy;
	camera.pnt.z=cz;
	
		// return values
		
    memmove(pnt,&camera.pnt,sizeof(d3pnt));
	
		// looking angles
	
	ang->x=(camera.cur_chase_ang.x+camera.ang.x)-obj->view_ang.x;

	weap=weapon_find_current(obj);
	if (weap!=NULL) ang->x=object_player_look_constrain(obj,weap,ang->x);

	ang->y=angle_add(camera.cur_chase_ang.y,camera.ang.y);
	ang->z=camera.ang.z;
}
Esempio n. 8
0
void view_draw_dim3rtl(void)
{
    obj_type		*obj,*camera_obj;
    weapon_type		*weap;

    // get player object and held weapon

    obj=server.obj_list.objs[server.player_obj_idx];
    weap=weapon_find_current(obj);

    // use the camera render

    view.render=&view_camera_render;

    // set view camera

    camera_view_draw_run();

    camera_obj=server.obj_list.objs[camera.obj_idx];
    memmove(&view.render->camera.pnt,&camera.cur_pos.pnt,sizeof(d3pnt));
    memmove(&view.render->camera.ang,&camera.cur_pos.ang,sizeof(d3ang));

    view.render->camera.fov=map.camera.plane.fov;
    view.render->camera.flip=FALSE;
    view.render->camera.under_liquid_idx=camera_check_liquid(obj,&view.render->camera.pnt);

    view.render->cull_idx=0;
    view.render->force_camera_obj=FALSE;

    // camera adjustments

    if (map.camera.camera_mode==cv_fpp) {
        view_calculate_scope(obj,camera_obj);
        view_calculate_recoil(obj);
    }

    view_calculate_shakes(obj);
    view_calculate_sways(obj);

    // build the scene

    view_draw_dim3rtl_scene_build();

    // we setup the 2D elements before
    // rendering because we get the last
    // frame so we want to use the last
    // frames eye point

    label_draw_setup();
    halo_draw_setup();

    if ((obj!=NULL) && (weap!=NULL)) {
        crosshair_setup(obj,weap);
        zoom_setup(obj,weap);
    }

    // dim3rtl rendering

    view_dim3rtl_render();

    // draw 2D opengl elements

    gl_2D_view_screen();

    label_draw_render();
    halo_draw_render();

    if (!view.cinema.on) {
        if ((obj!=NULL) && (weap!=NULL)) {
            crosshair_draw(obj,weap);
            zoom_draw(obj,weap);
        }
    }

    // draw tints and fades

    view_draw_liquid_tint(view.render->camera.under_liquid_idx);
    view_draw_effect_tint();
    view_fade_draw();
}
Esempio n. 9
0
File: objects.c Progetto: rzel/dim3
int object_start(spot_type *spot,char *name,int type,int bind,char *err_str)
{
	int					idx;
	obj_type			*obj;
	weapon_type			*weap;
	
		// create object
		
	idx=object_create(name,type,bind);
	if (idx==-1) {
		strcpy(err_str,"Out of memory");
		return(-1);
	}
	
	obj=server.obj_list.objs[idx];

		// player default setup
		
	if (obj->type==object_type_player) {
		obj->team_idx=net_team_none;
		obj->spawn_spot.name[0]=0x0;
		
		obj->hidden=FALSE;
		
		obj->tint_color_idx=setup.network.tint_color_idx;
		obj->character_idx=setup.network.character_idx;

		server.player_obj_idx=obj->idx;
	}

		// regular object setup

	else {

			// if there's an editor display model, then
			// default model to it
			
		if (spot->display_model[0]!=0x0) {
			obj->draw.on=TRUE;
			strcpy(obj->draw.name,spot->display_model);
		}

			// attach object to spot

		object_set_position(obj,spot->pnt.x,spot->pnt.y,spot->pnt.z,spot->ang.y,0);
		obj->turn.ang_to.y=spot->ang.y;
	}

		// parameters

	obj->spawn_spot.script[0]=0x0;
	obj->spawn_spot.params[0]=0x0;
	if (spot!=NULL) {
		strcpy(obj->spawn_spot.script,spot->script);
		strcpy(obj->spawn_spot.params,spot->params);
	}

		// if networked player or multiplayer bot, run rules
		// to pick the team
	
	if (net_setup.mode!=net_mode_none) {
		if ((obj->type==object_type_player) || (obj->type==object_type_bot_multiplayer)) object_multiplayer_setup(obj);
	}

		// start script

	if (!object_start_script(obj,FALSE,err_str)) {
		server.obj_list.objs[idx]=NULL;
		free(obj);
		return(-1);
	}

		// load object model

	if (!model_draw_load(&obj->draw,"Object",obj->name,FALSE,err_str)) {
		server.obj_list.objs[idx]=NULL;
		free(obj);
		return(-1);
	}

		// setup held weapon

	if (obj->held_weapon.current_idx!=-1) {
		weap=weapon_find_current(obj);
		weapon_set(obj,weap);
	}

	return(obj->idx);
}