Перейти к контенту

Редактирование движка X-Ray


Рекомендуемые сообщения

В чем проблема базовой брони или базового ХУДА РУК модели ГГ без брони в ЗП - я наблюдаю баг с гранатами. Анимации клинят, на гранату вешается анимка в частности пистолета, при отсутствии брони в слоте. А потом вообще невозможно гранаты сменить на другое оружие. Как исправить?

Изменено пользователем Дизель

andreyholkin.gif

rod_cccp.gif

 

Ссылка на комментарий

@aka_sektor, в оригинале всё нормально. Я пока не понял причину, так как у меня движок с видами правлен, да худ новый. Пока вероятно, что у меня худ рук баговый, так как на оригинальных худах, вроде всё в порядке.

andreyholkin.gif

rod_cccp.gif

 

Ссылка на комментарий

Кто нибудь в курсе про баги с солнцем в ТЧ? Почему-то в старых фиксах, там заставку запускали, чтоб оно появилась. Краем уха что-то слышал про какой-то движковый баг, что оно мол пропадает и все такое. Как лечить и где копать?

Ссылка на комментарий

@Kondr48, может про луну? Солнце вроде в Сталкере не пропадает... Если пропадает, то возможно нет апдаты или апдейта погоды в скриптах на ГГ?

Добавлено  HellRatz,

Нет, баг именно с солнцем, а вернее солнечным диском. Не светом или еще чем-либо. Прочитай про этот пункт у мода OGSM, он восстанавливал солнце через ролик.

andreyholkin.gif

rod_cccp.gif

 

Ссылка на комментарий

DDamian724, try this (попробуй так):

sun_dir.setHP(
        deg2rad(pSettings->r_float	(S,"sun_altitude")),
        deg2rad(pSettings->r_float	(S,"sun_longitude"))
        );

I have it working (у меня это работает).

Изменено пользователем Kondr48
  • Нравится 1
Ссылка на комментарий

Yes, I work in the engine SHoC weather system from CoP (Да, у меня в движке ТЧ система погоды из ЗП).

[sect_af3_bright_clear_0]
00:00:00		=	af3_bright_clear_0_00
01:00:00		=	af3_bright_clear_0_01
02:00:00		=	af3_bright_clear_0_02
03:00:00		=	af3_bright_clear_0_03
04:00:00		=	af3_bright_clear_0_04
04:30:00		=	af3_day_clear_00
05:00:00		=	af3_day_clear_01
05:30:00		=	af3_day_clear_02
06:00:00		=	af3_day_clear_03
06:10:00		=	af3_day_clear_04
07:00:00		=	af3_day_clear_05
08:00:00		=	af3_day_clear_06
09:00:00		=	af3_day_clear_07
10:00:00		=	af3_day_clear_08
11:00:00		=	af3_day_clear_09
12:00:00		=	af3_day_clear_10
13:00:00		=	af3_day_clear_11
14:00:00		=	af3_day_clear_12
15:00:00		=	af3_day_clear_13
16:00:00		=	af3_day_clear_14
17:00:00		=	af3_day_clear_15
18:00:00		=	af3_day_clear_16
19:00:00		=	af3_day_clear_17
19:50:00		=	af3_day_clear_18
20:00:00		=	af3_day_clear_19
20:30:00		=	af3_day_clear_20
21:00:00		=	af3_day_clear_21
21:30:00		=	af3_day_clear_22
22:00:00		=	af3_bright_clear_0_05
23:00:00		=	af3_bright_clear_0_06

[af3_bright_clear_0_00]
        ambient                          = ambient_env_night
        ambient_color                    = 0.007813, 0.007813, 0.007813
        clouds_color                     = 0.000000, 0.000000, 0.000000, 1.000000
        clouds_texture                   = sky\sky_oblaka
        far_plane                        = 1000.000000
        fog_color                        = 0.007813, 0.007813, 0.007813
        fog_density                      = 1.000000
        fog_distance                     = 1000.000000
        hemisphere_color                 = 0.574219, 0.621094, 0.726563, 1.000000
        rain_color                       = 0.679688, 0.640625, 0.601563
        rain_density                     = 0.000000
        sky_texture                      = sky\af3_clear\00-00-nm
        sky_color                        = 0.378906, 0.378906, 0.378906
        sky_rotation                     = 0.000000
        sun                              = none
        sun_color                        = 0.000000, 0.000000, 0.000000
        sun_longitude                    = -26.543000
        sun_altitude                     = 14.870000
        sun_shafts_intensity             = 0.000000
        thunderbolt_collection           = 
        thunderbolt_duration             = 0.000000
        thunderbolt_period               = 0.000000
        water_intensity                  = 0.100000
        wind_direction                   = 0.000000
        wind_velocity                    = 0.000000 

 

 

Part config, where the clock and associated sections, I left as in the original, I feel so comfortable. (Часть конфига, где связаны часы и секции сделаны как и в ТЧ, мне лично так удобнее.)

Изменено пользователем Kondr48
Ссылка на комментарий

DDamian724Yes, here my source code (да, вот файл из исходников):

#include "stdafx.h"
#pragma hdrstop

#include "Environment.h"
#include "xr_efflensflare.h"
#include "thunderbolt.h"
#include "rain.h"
#include "resourcemanager.h"

//-----------------------------------------------------------------------------
// Environment modifier
//-----------------------------------------------------------------------------
bool	CEnvModifier::load	(IReader* fs)
{
	// Проверка на корректность файла. Real Wolf.
	if (fs->tell() + 76 > fs->length())
		return false;

	fs->r_fvector3	(position);			// 4*3=12
	radius			= fs->r_float	();	// 4
	power			= fs->r_float	();	// 4
	far_plane		= fs->r_float	();	// 4
	fs->r_fvector3	(fog_color);		// 4*3=12
	fog_density		= fs->r_float	();	// 4
	fs->r_fvector3	(ambient);			// 4*3=12
	fs->r_fvector3	(sky_color);		// 4*3=12
	fs->r_fvector3	(hemi_color);		// 4*3=12

	return true;
}
float	CEnvModifier::sum	(CEnvModifier& M, Fvector3& view)
{
	float	_dist_sq	=	view.distance_to_sqr(M.position);
	if (_dist_sq>=(M.radius*M.radius))	return 0;
	float	_att		=	1-_sqrt(_dist_sq)/M.radius;	//[0..1];
	float	_power		=	M.power*_att;
	far_plane			+=	M.far_plane*_power;
	fog_color.mad		(M.fog_color,_power);
	fog_density			+=	M.fog_density*_power;
	ambient.mad			(M.ambient,_power);
//	lmap_color.mad		(M.lmap_color,_power);
	sky_color.mad		(M.sky_color,_power);
	hemi_color.mad		(M.hemi_color,_power);
	return				_power;
}

//-----------------------------------------------------------------------------
// Environment ambient
//-----------------------------------------------------------------------------
void CEnvAmbient::load(const shared_str& sect)
{
	section				= sect;
	string_path			tmp;
	// sounds
	if (pSettings->line_exist(sect,"sounds")){
		Fvector2 t		= pSettings->r_fvector2	(sect,"sound_period");
		sound_period.set(iFloor(t.x*1000.f),iFloor(t.y*1000.f));
		sound_dist		= pSettings->r_fvector2	(sect,"sound_dist"); if (sound_dist[0]>sound_dist[1]) std::swap(sound_dist[0],sound_dist[1]);
		LPCSTR snds		= pSettings->r_string	(sect,"sounds");
		u32 cnt			= _GetItemCount(snds);
		if (cnt){
			sounds.resize(cnt);
			for (u32 k=0; k<cnt; ++k)
				sounds[k].create(_GetItem(snds,k,tmp),st_Effect,sg_SourceType);
		}
	}
	// effects
	if (pSettings->line_exist(sect,"effects")){
		Fvector2 t		= pSettings->r_fvector2	(sect,"effect_period");
		effect_period.set(iFloor(t.x*1000.f),iFloor(t.y*1000.f));
		LPCSTR effs		= pSettings->r_string	(sect,"effects");
		u32 cnt			= _GetItemCount(effs);
		if (cnt){
			effects.resize(cnt);
			for (u32 k=0; k<cnt; ++k){
				_GetItem(effs,k,tmp);
				effects[k].life_time		= iFloor(pSettings->r_float(tmp,"life_time")*1000.f);
				effects[k].particles		= pSettings->r_string	(tmp,"particles");		VERIFY(effects[k].particles.size());
				effects[k].offset			= pSettings->r_fvector3	(tmp,"offset");
				effects[k].wind_gust_factor	= pSettings->r_float	(tmp,"wind_gust_factor");
				if (pSettings->line_exist(tmp,"sound"))
					effects[k].sound.create	(pSettings->r_string(tmp,"sound"),st_Effect,sg_SourceType);
			}
		}
	}
#ifndef DEBUG
	VERIFY(!sounds.empty() || !effects.empty());
#endif
}

//-----------------------------------------------------------------------------
// Environment descriptor
//-----------------------------------------------------------------------------
CEnvDescriptor::CEnvDescriptor()
{
	exec_time			= 0.0f;
	exec_time_loaded	= 0.0f;
	
	clouds_color.set	(1,1,1,1);
	sky_color.set		(1,1,1);
	sky_rotation		= 0.0f;

	far_plane			= 400.0f;;

	fog_color.set		(1,1,1);
	fog_density			= 0.0f;
	fog_distance		= 400.0f;

	rain_density		= 0.0f;
	rain_color.set		(0,0,0);

	bolt_period			= 0.0f;
	bolt_duration		= 0.0f;

    wind_velocity		= 0.0f;
    wind_direction		= 0.0f;
    
	ambient.set			(0,0,0);
	hemi_color.set		(1,1,1,1);
	sun_color.set		(1,1,1);
	sun_dir.set			(0,-1,0);
	
	m_fSunShaftsIntensity = 0;
	m_fWaterIntensity = 1;	
	//m_fColorGrading.set			(0,0,0);

    lens_flare_id		= -1;
	tb_id				= -1;
    
	env_ambient			= NULL;
}

#define	C_CHECK(C)	if (C.x<0 || C.x>2 || C.y<0 || C.y>2 || C.z<0 || C.z>2)	{ Msg("! Invalid '%s' in env-section '%s'",#C,S);}
void CEnvDescriptor::load	(LPCSTR exec_tm, LPCSTR S, CEnvironment* parent)
{
	Ivector3 tm				={0,0,0};
	sscanf					(exec_tm,"%d:%d:%d",&tm.x,&tm.y,&tm.z);
	R_ASSERT3				((tm.x>=0)&&(tm.x<24)&&(tm.y>=0)&&(tm.y<60)&&(tm.z>=0)&&(tm.z<60),"Incorrect weather time",S);
	exec_time				= tm.x*3600.f+tm.y*60.f+tm.z;
	exec_time_loaded		= exec_time;
	string_path				st,st_env;
	strcpy_s					(st,pSettings->r_string	(S,"sky_texture"));
	strconcat				(sizeof(st_env),st_env,st,"#small"		);
	sky_texture_name		= st;
	sky_texture_env_name	= st_env;
	clouds_texture_name		= pSettings->r_string	(S,"clouds_texture");
	LPCSTR	cldclr			= pSettings->r_string	(S,"clouds_color");
	float	multiplier		= 0, save=0;
	sscanf					(cldclr,"%f,%f,%f,%f,%f",&clouds_color.x,&clouds_color.y,&clouds_color.z,&clouds_color.w,&multiplier);
	save=clouds_color.w;	clouds_color.mul		(.5f*multiplier);		clouds_color.w	= save; 
	sky_color				= pSettings->r_fvector3	(S,"sky_color");		sky_color.mul(.5f);
	if (pSettings->line_exist(S,"sky_rotation"))	sky_rotation	= deg2rad(pSettings->r_float(S,"sky_rotation"));
	else											sky_rotation	= 0;
	far_plane				= pSettings->r_float	(S,"far_plane");
	fog_color				= pSettings->r_fvector3	(S,"fog_color");
	fog_density				= pSettings->r_float	(S,"fog_density");
	fog_distance			= pSettings->r_float	(S,"fog_distance");
	rain_density			= pSettings->r_float	(S,"rain_density");		clamp(rain_density,0.f,1.f);
	rain_color				= pSettings->r_fvector3	(S,"rain_color");            
	wind_velocity			= pSettings->r_float	(S,"wind_velocity");
	wind_direction			= deg2rad(pSettings->r_float(S,"wind_direction"));
	ambient					= pSettings->r_fvector3	(S,"ambient");
	hemi_color				= pSettings->r_fvector4	(S,"hemisphere_color");
	sun_color				= pSettings->r_fvector3	(S,"sun_color");
	sun_dir.setHP(
        deg2rad(pSettings->r_float	(S,"sun_altitude")),
        deg2rad(pSettings->r_float	(S,"sun_longitude"))
        );
    R_ASSERT(_valid(sun_dir));
    VERIFY2(sun_dir.y < 0, "Invalid sun direction settings while loading");

	lens_flare_id			= parent->eff_LensFlare->AppendDef(pSettings,pSettings->r_string(S,"sun"));
	tb_id					= parent->eff_Thunderbolt->AppendDef(pSettings,pSettings->r_string(S,"thunderbolt_collection"));
	bolt_period				= (tb_id>=0)?pSettings->r_float	(S,"thunderbolt_period"):0.f;
	bolt_duration			= (tb_id>=0)?pSettings->r_float	(S,"thunderbolt_duration"):0.f;
	env_ambient				= pSettings->line_exist(S,"env_ambient")?parent->AppendEnvAmb	(pSettings->r_string(S,"env_ambient")):0;
	
	if (pSettings->line_exist(S,"sun_shafts_intensity"))
		m_fSunShaftsIntensity = pSettings->r_float	(S,"sun_shafts_intensity");

	if (pSettings->line_exist(S,"water_intensity"))
		m_fWaterIntensity = pSettings->r_float	(S,"water_intensity");	
	
	/*if (pSettings->line_exist(S,"color_grading"))
		m_fColorGrading = pSettings->r_fvector3	(S,"color_grading");*/		

	C_CHECK					(clouds_color);
	C_CHECK					(sky_color	);
	C_CHECK					(fog_color	);
	C_CHECK					(rain_color	);
	C_CHECK					(ambient	);
//	C_CHECK					(lmap_color	);
	C_CHECK					(hemi_color	);
	C_CHECK					(sun_color	);
	on_device_create		();
}

void CEnvDescriptor::on_device_create	()
{
	if (sky_texture_name.size())	sky_texture.create		(sky_texture_name.c_str());
	if (sky_texture_env_name.size())sky_texture_env.create	(sky_texture_env_name.c_str());
	if (clouds_texture_name.size())	clouds_texture.create	(clouds_texture_name.c_str());
}

void CEnvDescriptor::on_device_destroy	()
{
	sky_texture.destroy		();
	sky_texture_env.destroy	();
	clouds_texture.destroy	();
}

//-----------------------------------------------------------------------------
// Environment Mixer
//-----------------------------------------------------------------------------
void CEnvDescriptorMixer::destroy()
{
	sky_r_textures.clear		();
	sky_r_textures_env.clear	();
	clouds_r_textures.clear		();

	sky_texture.destroy			();
	sky_texture_env.destroy		();
	clouds_texture.destroy		();
}

void CEnvDescriptorMixer::clear	()
{
	std::pair<u32,ref_texture>	zero = mk_pair(u32(0),ref_texture(0));
	sky_r_textures.clear		();
	sky_r_textures.push_back	(zero);
	sky_r_textures.push_back	(zero);
	sky_r_textures.push_back	(zero);

	sky_r_textures_env.clear	();
	sky_r_textures_env.push_back(zero);
	sky_r_textures_env.push_back(zero);
	sky_r_textures_env.push_back(zero);

	clouds_r_textures.clear		();
	clouds_r_textures.push_back	(zero);
	clouds_r_textures.push_back	(zero);
	clouds_r_textures.push_back	(zero);
}
int get_ref_count(IUnknown* ii);
void CEnvDescriptorMixer::lerp	(CEnvironment* , CEnvDescriptor& A, CEnvDescriptor& B, float f, CEnvModifier& M, float m_power)
{
	float	_power			=	1.f/(m_power+1);	// the environment itself
	float	fi				=	1-f;

	sky_r_textures.clear		();
	sky_r_textures.push_back	(mk_pair(0,A.sky_texture));
	sky_r_textures.push_back	(mk_pair(1,B.sky_texture));

	sky_r_textures_env.clear	();

	sky_r_textures_env.push_back(mk_pair(0,A.sky_texture_env));
	sky_r_textures_env.push_back(mk_pair(1,B.sky_texture_env));

	clouds_r_textures.clear		();
	clouds_r_textures.push_back	(mk_pair(0,A.clouds_texture));
	clouds_r_textures.push_back	(mk_pair(1,B.clouds_texture));

	weight					=	f;

	clouds_color.lerp		(A.clouds_color,B.clouds_color,f);
	sky_rotation			=	(fi*A.sky_rotation + f*B.sky_rotation);
	far_plane				=	(fi*A.far_plane + f*B.far_plane + M.far_plane)*psVisDistance*_power;
	fog_color.lerp			(A.fog_color,B.fog_color,f).add(M.fog_color).mul(_power);
	fog_density				=	(fi*A.fog_density + f*B.fog_density + M.fog_density)*_power;
	fog_distance			=	(fi*A.fog_distance + f*B.fog_distance);
	fog_near				=	(1.0f - fog_density)*0.85f * fog_distance;
	fog_far					=	0.99f * fog_distance;
	rain_density			=	fi*A.rain_density + f*B.rain_density;
	rain_color.lerp			(A.rain_color,B.rain_color,f);
	bolt_period				=	fi*A.bolt_period + f*B.bolt_period;
	bolt_duration			=	fi*A.bolt_duration + f*B.bolt_duration;
	// wind
	wind_velocity			=	fi*A.wind_velocity + f*B.wind_velocity;
	wind_direction			=	fi*A.wind_direction + f*B.wind_direction;
	
	m_fSunShaftsIntensity	=	fi*A.m_fSunShaftsIntensity + f*B.m_fSunShaftsIntensity;
	m_fWaterIntensity		=	fi*A.m_fWaterIntensity + f*B.m_fWaterIntensity;	
	
	//m_fColorGrading.lerp			(A.m_fColorGrading,B.m_fColorGrading,f);

	// colors
	sky_color.lerp			(A.sky_color,B.sky_color,f).add(M.sky_color).mul(_power);
	ambient.lerp			(A.ambient,B.ambient,f).add(M.ambient).mul(_power);
	hemi_color.lerp			(A.hemi_color,B.hemi_color,f);
	hemi_color.x			+= M.hemi_color.x;
	hemi_color.y			+= M.hemi_color.y; 
	hemi_color.z			+= M.hemi_color.z;
	hemi_color.x			*= _power;
	hemi_color.y			*= _power;
	hemi_color.z			*= _power;
	sun_color.lerp			(A.sun_color,B.sun_color,f);
	sun_dir.lerp			(A.sun_dir,B.sun_dir,f).normalize();
	VERIFY2					(sun_dir.y<0,"Invalid sun direction settings while lerp");

}

//-----------------------------------------------------------------------------
// Environment IO
//-----------------------------------------------------------------------------
CEnvAmbient* CEnvironment::AppendEnvAmb		(const shared_str& sect)
{
	for (EnvAmbVecIt it=Ambients.begin(); it!=Ambients.end(); it++)
		if ((*it)->name().equal(sect)) return *it;
	Ambients.push_back		(xr_new<CEnvAmbient>());
	Ambients.back()->load	(sect);
	return Ambients.back();
}

void	CEnvironment::mods_load			()
{
	Modifiers.clear_and_free			();
	string_path							path;
	if (FS.exist(path,"$level$","level.env_mod"))	
	{
		IReader*	fs	= FS.r_open		(path);
		u32			id	= 0;
		while		(fs->find_chunk(id))	
		{
			CEnvModifier		E;
			// Надо обязательно проверять, что файл корректный, даже если чанк был найден. Real Wolf.
			if (!E.load(fs))
				break;
			Modifiers.push_back	(E);
			id					++;
		}
		FS.r_close	(fs);
	}
}
void	CEnvironment::mods_unload		()
{
	Modifiers.clear_and_free			();
}

void CEnvironment::load		()
{
	tonemap					= Device.Resources->_CreateTexture("$user$tonemap");	//. hack
	if (!eff_Rain)    		eff_Rain 		= xr_new<CEffect_Rain>();
	if (!eff_LensFlare)		eff_LensFlare 	= xr_new<CLensFlare>();
	if (!eff_Thunderbolt)	eff_Thunderbolt	= xr_new<CEffect_Thunderbolt>();
	// load weathers
	if (WeatherCycles.empty()){
		LPCSTR first_weather=0;
		int weather_count	= pSettings->line_count("weathers");
		for (int w_idx=0; w_idx<weather_count; w_idx++){
			LPCSTR weather, sect_w;
			if (pSettings->r_line("weathers",w_idx,&weather,&sect_w)){
				if (0==first_weather) first_weather=weather;
				int env_count	= pSettings->line_count(sect_w);
				LPCSTR exec_tm, sect_e;
				for (int env_idx=0; env_idx<env_count; env_idx++){
					if (pSettings->r_line(sect_w,env_idx,&exec_tm,&sect_e)){
						CEnvDescriptor*		D=xr_new<CEnvDescriptor>();
						D->load				(exec_tm,sect_e,this);
						WeatherCycles[weather].push_back	(D);
#ifdef DEBUG
						D->sect_name		= sect_e;
#endif
					}
				}
			}
		}
		// sorting weather envs
		EnvsMapIt _I=WeatherCycles.begin();
		EnvsMapIt _E=WeatherCycles.end();
		for (; _I!=_E; _I++){
			R_ASSERT3	(_I->second.size()>1,"Environment in weather must >=2",*_I->first);
			std::sort(_I->second.begin(),_I->second.end(),sort_env_etl_pred);
		}
		R_ASSERT2	(!WeatherCycles.empty(),"Empty weathers.");
		SetWeather	(first_weather);
	}
	// load weather effects
	if (WeatherFXs.empty()){
		int line_count	= pSettings->line_count("weather_effects");
		for (int w_idx=0; w_idx<line_count; w_idx++){
			LPCSTR weather, sect_w;
			if (pSettings->r_line("weather_effects",w_idx,&weather,&sect_w)){
				EnvVec& env		= WeatherFXs[weather];
				env.push_back	(xr_new<CEnvDescriptor>()); env.back()->exec_time_loaded = 0;
				env.push_back	(xr_new<CEnvDescriptor>()); env.back()->exec_time_loaded = 0;
				int env_count	= pSettings->line_count(sect_w);
				LPCSTR exec_tm, sect_e;
				for (int env_idx=0; env_idx<env_count; env_idx++){
					if (pSettings->r_line(sect_w,env_idx,&exec_tm,&sect_e)){
						CEnvDescriptor*	D=xr_new<CEnvDescriptor>();
						D->load			(exec_tm,sect_e,this);
						env.push_back	(D);
#ifdef DEBUG
						D->sect_name		= sect_e;
#endif
					}
				}
				env.push_back	(xr_new<CEnvDescriptor>()); env.back()->exec_time_loaded = DAY_LENGTH;
			}
		}
		// sorting weather envs
		EnvsMapIt _I=WeatherFXs.begin();
		EnvsMapIt _E=WeatherFXs.end();
		for (; _I!=_E; _I++){
			R_ASSERT3	(_I->second.size()>1,"Environment in weather must >=2",*_I->first);
			std::sort(_I->second.begin(),_I->second.end(),sort_env_etl_pred);
		}
	}
}

void CEnvironment::unload	()
{
	EnvsMapIt _I,_E;
	// clear weathers
	_I		= WeatherCycles.begin();
	_E		= WeatherCycles.end();
	for (; _I!=_E; _I++){
		for (EnvIt it=_I->second.begin(); it!=_I->second.end(); it++)
			xr_delete	(*it);
	}

	WeatherCycles.clear		();
	// clear weather effect
	_I		= WeatherFXs.begin();
	_E		= WeatherFXs.end();
	for (; _I!=_E; _I++){
		for (EnvIt it=_I->second.begin(); it!=_I->second.end(); it++)
			xr_delete	(*it);
	}
	WeatherFXs.clear		();
	// clear ambient
	for (EnvAmbVecIt it=Ambients.begin(); it!=Ambients.end(); it++)
		xr_delete		(*it);
	Ambients.clear		();
	// misc
	xr_delete			(eff_Rain);
	xr_delete			(eff_LensFlare);
	xr_delete			(eff_Thunderbolt);
	CurrentWeather		= 0;
	CurrentWeatherName	= 0;
	CurrentEnv.clear	();
	Invalidate			();
	tonemap				= 0;
}
 

 

 

Maybe Google translation is not entirely correct, I do not have a full port of Call of Pripyat system, but only partially. I stayed on a small part of the Shadow of Chernobyl weather system. (Может быть гугл переводит не совсем корректно, у меня не полный порт системы ЗП, а только частичный. У меня осталась от ТЧ небольшая часть погодной системы.)

Изменено пользователем Kondr48
  • Спасибо 1
Ссылка на комментарий

Что вообще делает функция UpdateXForm() у худовых предметов?

void CArtefact::UpdateXForm()
{
	if (Device.dwFrame!=dwXF_Frame)
	{
		dwXF_Frame			= Device.dwFrame;

		if (0==H_Parent())	return;

		// Get access to entity and its visual
		CEntityAlive*		E		= smart_cast<CEntityAlive*>(H_Parent());
        
		if(!E)				return	;

		const CInventoryOwner	*parent = smart_cast<const CInventoryOwner*>(E);
		if (parent && parent->use_simplified_visual())
			return;

		VERIFY				(E);
		CKinematics*		V		= smart_cast<CKinematics*>	(E->Visual());
		VERIFY				(V);

		// Get matrices
		int					boneL,boneR,boneR2;
		E->g_WeaponBones	(boneL,boneR,boneR2);

		boneL = boneR2;

		V->CalculateBones	();
		Fmatrix& mL			= V->LL_GetTransform(u16(boneL));
		Fmatrix& mR			= V->LL_GetTransform(u16(boneR));

		// Calculate
		Fmatrix				mRes;
		Fvector				R,D,N;
		D.sub				(mL.c,mR.c);	D.normalize_safe();
		R.crossproduct		(mR.j,D);		R.normalize_safe();
		N.crossproduct		(D,R);			N.normalize_safe();
		mRes.set			(R,N,D,mR.c);
		mRes.mulA_43		(E->XFORM());
//		UpdatePosition		(mRes);
		XFORM().mul			(mRes,offset());
	}
}

 

 

Изменено пользователем Kondr48
Ссылка на комментарий

@Kondr48, движковое обновление. Возвращает визуал при смене худа, при повторной загрузке сохранения, при выходе в меню, у нехудовых при отдаление и последующем возврате к объекту. Примерно так, может не прав.


 

 

xr_game по полчаса
у меня час двадцать
  • Спасибо 1

andreyholkin.gif

rod_cccp.gif

 

Ссылка на комментарий

Надоело собирать xr_game по полчаса

у меня час двадцать

От часа до трёх или даже четырёх часов :D

Изменено пользователем User_X.A.R26
  • Нравится 1
Ссылка на комментарий
ДизельUser_X.A.R26 это пересборка прям? Или просто build?

---

Правильно ли я понял, что "конструкции" типа:

void CCustomDetector::OnH_A_Chield() 
{
	inherited::OnH_A_Chield		();
}

По сути служат для того чтобы продублировать в дочернем классе аналогичную функцию родительского и добавить что-то свое? В таком случае есть ли толк от такой "пустой" функции?

Изменено пользователем Kondr48
Ссылка на комментарий

@Kondr48, полная сборка xrGame. Инкрементальная сборка на дебаге может и минут 20 быть, а на релизе - около часа из-за всяких там оптимизаций

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...