Динамическое освещение 2
AlexGordon Дата: Понедельник, 02.08.2010, 16:26 | Сообщение # 1
Soldier
Группа: Проверенные
Сообщений: 487
Репутация:
23
Статус: Offline
Недавно я наткнулся на такой туториал:
Динамическое освещение моделей
В этой статье я расскажу, как добавить в Half-Life новую Entity – env_light. Это ни что иное как источник света, вот только освещать он будет исключительно модели. Итак, начнем.
Открываем hl.dsp и идем к файлу effects.cpp. В конец файла добавляем:
Code
//=============================================== // Entity light //=============================================== extern int gmsgAddELight; #define SF_LIGHT_STARTON 1 class CElightEntity : public CPointEntity { public: void Spawn( void ); void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void EXPORT LightThink( void ); void EXPORT LightTurnOn( void ); void EXPORT LightThinkContinous( void ); virtual int Save( CSave &save ); virtual int Restore( CRestore &restore ); static TYPEDESCRIPTION m_SaveData[]; Vector m_vecPos; int m_fLightActive; int m_iAttachment; }; LINK_ENTITY_TO_CLASS( env_light, CElightEntity ); TYPEDESCRIPTION CElightEntity::m_SaveData[] = { DEFINE_FIELD( CElightEntity, m_vecPos, FIELD_VECTOR ), DEFINE_FIELD( CElightEntity, m_iAttachment, FIELD_INTEGER ), DEFINE_FIELD( CElightEntity, m_fLightActive, FIELD_INTEGER ), }; IMPLEMENT_SAVERESTORE( CElightEntity, CPointEntity ); void CElightEntity::Spawn( void ) { if (FStringNull(pev->targetname)) pev->spawnflags |= 1; m_vecPos = pev->origin; pev->solid = SOLID_NOT; pev->nextthink = gpGlobals->time + 0.1; SetThink( LightThink ); } void CElightEntity::LightThink( void ) { if ( !(pev->spawnflags & SF_LIGHT_STARTON) ) { m_fLightActive = FALSE; } else { m_fLightActive = TRUE; SetThink( LightTurnOn ); pev->nextthink = gpGlobals->time + 0.1; } }; void CElightEntity::LightTurnOn( void ) { m_iAttachment = this->entindex( ) + 0x1000 * pev->impulse;// Yeah, it was an attachment problem after all. MESSAGE_BEGIN( MSG_ALL, gmsgAddELight, NULL); WRITE_BYTE ( m_iAttachment ); WRITE_BYTE( m_fLightActive ); if ( m_fLightActive ) { WRITE_COORD( m_vecPos.x ); // X WRITE_COORD( m_vecPos.y ); // Y WRITE_COORD( m_vecPos.z ); // Z WRITE_BYTE ( pev->rendercolor.x ); WRITE_BYTE ( pev->rendercolor.y ); WRITE_BYTE ( pev->rendercolor.z ); WRITE_BYTE ( pev->renderamt ); } MESSAGE_END(); SetThink( LightThinkContinous ); pev->nextthink = gpGlobals->time + 0.5; } void CElightEntity::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { if ( !m_fLightActive ) { m_fLightActive = TRUE; SetThink( LightTurnOn ); pev->nextthink = gpGlobals->time + 0.1; return; } else { m_fLightActive = FALSE; SetThink( LightTurnOn ); pev->nextthink = gpGlobals->time + 0.1; return; } }; void CElightEntity::LightThinkContinous( void ) { if ( gLightUpdate = TRUE && m_fLightActive ) { gLightUpdate = FALSE; SetThink( LightTurnOn ); pev->nextthink = gpGlobals->time + 0.1; } else { SetThink( LightThinkContinous ); pev->nextthink = gpGlobals->time + 0.1; } } Теперь идем к файлу globals.cpp, и в самый низ добавляем: DLL_GLOBAL int gLightUpdate; Далее в файле world.cpp добавляем после всех #include extern DLL_GLOBAL int gLightUpdate; Теперь нам нужна функция CWorld :: Precache(void) . В самом низу этой функции добавляем: gLightUpdate = TRUE; Хорошо, дальше идем к player.cpp и после строки int gmsgTeamNames = 0; добавим: int gmsgAddELight = 0; Теперь внутри функции void LinkUserMessages(void) добавим: gmsgAddELight = REG_USER_MSG("AddELight", -1); С серверной частью закончили, идём в client.dsp в файл hud.cpp. После функции int __MsgFunc_GameMode(const char *pszName, int iSize, void *pbuf ) { return gHUD.MsgFunc_GameMode( pszName, iSize, pbuf ); } Вставляем: int __MsgFunc_AddELight(const char *pszName, int iSize, void *pbuf) { return gHUD.MsgFunc_AddELight( pszName, iSize, pbuf ); } Теперь после HOOK_MESSAGE( TeamInfo ); Добавим это: HOOK_MESSAGE( AddELight ); Идем к hud.h и после строки int _cdecl MsgFunc_Concuss( const char *pszName, int iSize, void *pbuf ); добавляем: int _cdecl MsgFunc_AddELight( const char *pszName, int iSize, void *pbuf ); Открываем hud_msg.cpp и в самом низу добавляем: int CHud :: MsgFunc_AddELight( const char *pszName, int iSize, void *pbuf ) { BEGIN_READ( pbuf, iSize ); int iAttachment = READ_BYTE(); dlight_t *dl = gEngfuncs.pEfxAPI->CL_AllocElight( iAttachment ); int bLightActive = READ_BYTE(); if (!bLightActive) { dl->die = gEngfuncs.GetClientTime(); } else { dl->die = gEngfuncs.GetClientTime() + 1E6; dl->origin[0] = READ_COORD(); dl->origin[1] = READ_COORD(); dl->origin[2] = READ_COORD(); dl->color.r = READ_BYTE(); dl->color.g = READ_BYTE(); dl->color.b = READ_BYTE(); dl->radius = READ_BYTE(); } return 1; } С кодингом покончено <img src="http://s6.ucoz.net/sm/23/smile.gif" border="0" align="absmiddle" alt="smile"> Компилим… Готово. Далее нужно добавить env_light в FGD. В самый конец FGD добавляем: @PointClass base(Targetname) iconsprite("sprites/lightbulb.spr") size(-16 -16 -16, 16 16 16) = env_light : "Model light" [ renderamt(integer) : "Radius" : 64 rendercolor(color255) : "Render Color" : "255 255 255" spawnflags(flags) = [ 1 : "Start On" : 1 ] ]
Всё!
Тут говорится о реализации динамического освещения моделей, но так как это отдельная entity, а я работаю со стандартными картами от valve, то меня интересует: возможно ли это как-нибудь объединить со стандартной функцией освещения, не добавляя никаких энтити и не декомпилируя карты?
My Energy - 18000000000 g Моя визитка
Andreazzz Дата: Понедельник, 02.08.2010, 17:21 | Сообщение # 2
Spy
Группа: Проверенные
Сообщений: 996
Репутация:
55
Статус: Offline
AlexGordon , а сы думал как всё реализованно в Спирите, параное и т.д. ??? А вот очень просто, заниеш про модификацию opengl32 библиотек? Добавлено (02.08.2010, 17:19) --------------------------------------------- Кароче вот качаем ето: http://www.half-life.ru/forum/showthread.php?s=&threadid=13398 И фиксим по етому тутору: http://www.hlfx.ru/forum....5%ED%E8
Добавлено (02.08.2010, 17:21) --------------------------------------------- самое главное если те понадобятся инклюды gl* то прочитай всю тему тутора по фиксингу
Было отредактированно - Andreazzz - Понедельник, 02.08.2010, 17:22
AlexGordon Дата: Понедельник, 02.08.2010, 18:59 | Сообщение # 3
Soldier
Группа: Проверенные
Сообщений: 487
Репутация:
23
Статус: Offline
Andreazzz , спасибо, + тебе) Дам еще пять ,нет, десять, если скажешь как реализовать шейдер воды в hl1
My Energy - 18000000000 g Моя визитка
Andreazzz Дата: Понедельник, 02.08.2010, 21:17 | Сообщение # 4
Spy
Группа: Проверенные
Сообщений: 996
Репутация:
55
Статус: Offline
AlexGordon , скоро посмотрю гдето видел)
DetLeR Дата: Вторник, 03.08.2010, 00:36 | Сообщение # 5
Engineer
Группа: Администраторы
Сообщений: 1731
Статус: Offline
Код, лучше всего помещать в тег [code]
AlexGordon Дата: Вторник, 03.08.2010, 08:45 | Сообщение # 6
Soldier
Группа: Проверенные
Сообщений: 487
Репутация:
23
Статус: Offline
DetLeR , учту) Andreazzz , Мне надо только искажение, а отражение уж по возможности. И еще, объясните плиз как новичку, если есть шейдерные файл на cg, куда их пихать чтобы они отоброжались?
My Energy - 18000000000 g Моя визитка
Andreazzz Дата: Вторник, 03.08.2010, 13:59 | Сообщение # 7
Spy
Группа: Проверенные
Сообщений: 996
Репутация:
55
Статус: Offline
AlexGordon , hlfx.ru/forum и half-life.ru/forum на одной из них теме видел что-то подобное про cg
AlexGordon Дата: Вторник, 03.08.2010, 15:35 | Сообщение # 8
Soldier
Группа: Проверенные
Сообщений: 487
Репутация:
23
Статус: Offline
Нет, там нет...
My Energy - 18000000000 g Моя визитка
Andreazzz Дата: Вторник, 03.08.2010, 18:26 | Сообщение # 9
Spy
Группа: Проверенные
Сообщений: 996
Репутация:
55
Статус: Offline
AlexGordon , мне вот интересно а в параное или спирите они есть? а то они опенсурс
AlexGordon Дата: Вторник, 03.08.2010, 18:35 | Сообщение # 10
Soldier
Группа: Проверенные
Сообщений: 487
Репутация:
23
Статус: Offline
Нет, они там собсно есть, но знал бы я как их оттуда вытащить... А мне очень надо...
My Energy - 18000000000 g Моя визитка
Помощь в разработке форума: HOMiE7