HLFX.Ru Forum
Показать все 46 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Брызги воды как в Соусе (https://hlfx.ru/forum/showthread.php?threadid=1968)


Отправлено MadKing 26-09-2009 в 15:21:

Question Брызги воды как в Соусе

Люди. У меня такая бредовая мысля пришла - присобачить к своему моду эффект водяных брызг, как в HL2 например.
Как это сделать?
Это вопрос и вам и мне. Я тоже буду щас на эту тему соображать, но всё-таки очень буду рад любой помощи.


Первый подвопрос, так сказать, - чем будут брызги?
Партиклами? Моделью? Спрайтом? Или комбинираванно всё это юзать?
Как вы думаете, что лучше?


Отправлено XaeroX 26-09-2009 в 15:35:

Лучше всего - через TriAPI. Выдираешь текстуру брызг из хл2 и рисуешь квад. Сначала растущий вверх, потом опять падающий вниз (типа, всплеск).

Добавлено 26-09-2009 в 22:35:

Ну и круг на воде - можно просто ориентированным крутящимся спрайтом. Текстура также есть в хл2.

__________________

xaerox on Vivino


Отправлено MadKing 27-09-2009 в 03:30:

XaeroX Извини, я немного чайникою ещё...
Для меня слова

Цитата:
XaeroX писал:
квад, TriAPI

ничего не значат....
Можежь как нибудь по подробней объяснить??


Отправлено XaeroX 27-09-2009 в 07:27:

MadKing Делай ориентированными спрайтами на сервере. Всплеск - upright-спрайтом, круг на воде - oriented-спрайтом. И плавно уменьшай их прозрачность со временем, а потом удаляй. Круг на воде еще можно крутить через pev->angles.y.
Но вообще эти эффекты надо делать на клиенте. Разбирайся с Triangle API или, на худой конец, с TempEntity.

__________________

xaerox on Vivino


Отправлено Дядя Миша 27-09-2009 в 08:48:

Цитата:
Можежь как нибудь по подробней объяснить??

Поподробнее - это написать за тебя код и показать куда его пихать?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено MadKing 27-09-2009 в 10:48:

Цитата:
Дядя Миша писал:
Поподробнее - это написать за тебя код и показать куда его пихать?


Нет, конечно, хотя это не плохой вариант...
Я просто про то, что никогда не имел дела
Цитата:
XaeroX писал:
ориентированными спрайтами

и
Цитата:
XaeroX писал:
Triangle API

В этом то и загвоздка...
Чисто изначально у меня была идея сделать анимированную модельгу брызг(правда, я сразу сообразил что там ведь не только размеры менять надо, следовательно это сложновато, и ещё если учесть что моделер из меня не очень хороший) и партиклы, а круги - не угадаете - декалем - чисто к поверхности воды попробовать присобачить...
А в ответ услышал весьма интересные и неизвесные мне шняги.
Именно их я попросил тогда мне разъяснить, хотя это немного не по теме уже...


Отправлено XaeroX 27-09-2009 в 11:17:

Цитата:
MadKing писал:
а круги - не угадаете - декалем

Декаль не удастся поставить на поверхность воды.
Цитата:
MadKing писал:
Я просто про то, что никогда не имел дела

Нуу, про ориентированные спрайты тебе гугл точно подскажет.
Да и про триапи, в общем-то, тоже, если хорошенько его расспросить

__________________

xaerox on Vivino


Отправлено Дядя Миша 27-09-2009 в 15:20:

MadKing настоящему программисту проще написать процедурный эффект, чем нарисовать модельку.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено MadKing 28-09-2009 в 02:02:

Дядя Миша ты прав....
Но в идеале лучше знать и уметь это всё.
Ладно поищем ваши ориент-спрайты, но проще и быстрее вы смогли бы это просто тут написать - ка и где это юзать...

Добавлено 28-09-2009 в 05:54:

А... я вспомнил про что вы говорили спрайты, всё с пониманием этого проблем нет....

Добавлено 28-09-2009 в 06:01:

Слушайте, а что если начать с определения утил-функции - сами брызги?

C++ Source Code:
1
void UTIL_WaterSplash( const Vector &position )//CA
2
{
3
  MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, position );//Starting message
4
  WRITE_BYTE( TE_SPRITE );//Type
5
  WRITE_COORD( position.x );//X
6
  WRITE_COORD( position.y );//Y
7
  WRITE_COORD( position.z );//Z
8
  WRITE_SHORT( g_sModelIndexWaterSplash );//New water splash psevdo_particle
9
  WRITE_BYTE( 1 ); // scale * 10
10
  WRITE_BYTE( 175 ); // brightness
11
  MESSAGE_END();//That's all. Message end.
12
}


Добавлено 28-09-2009 в 06:02:

Только меня не много параметр смущает.... Ну не знаю, может так оно и надо...


Отправлено Дядя Миша 28-09-2009 в 06:56:

MadKing брызги на сервере траффик жрут.
Но для начала сгодится. Меня смущает что там нету параметров анимации.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено MadKing 28-09-2009 в 07:47:

Анимация будет, это только пробная версия - её доделаю, протестю, и потом уже анимацию


Отправлено GSen 28-09-2009 в 10:03:

Что за мод, всё тот же?


Отправлено (_-=ZhekA=-_) 28-09-2009 в 10:53:

MadKing
Да, что это за мод то ? И какие у тебя в моде есть еще фичи ? Посто интресно ?

__________________
Kiss my ass if you don't like my Ford!
------------------------------------------
Game Area51 Update 1
First Person Shooter Released Jul 24, 2017
The game is a 3d shooter with the elements of the quest.

http://button.moddb.com/download/medium/125531.png


Отправлено XaeroX 28-09-2009 в 13:30:

(_-=ZhekA=-_) А ну-ка прекращаем оффтоп и личную переписку. Интересно - пиши в ЛС.

__________________

xaerox on Vivino


Отправлено MadKing 29-09-2009 в 02:09:

У меня тут вопрос к умным и мудрым:
Как конкретно написать код проверки на столкновение объектов и пуль с водой и где???
Или что нибудь подобное там уже где то есть?

Добавлено 29-09-2009 в 06:00:

Вот скомпилил - без ошибок вроде..
(Ещё бы!! я пока просто объявил и определил 2 основные функции, их ещё не использовал ни где)

Добавлено 29-09-2009 в 06:09:

Пытаюсь в сабачить их юз в CBasePlayer::WaterMove
Мне нужен position типа Vector. У игрока это кто?


Отправлено Ku2zoff 29-09-2009 в 05:40:

MadKing посмотри исходники дождя by BUzer. Там коментарии на русском. Дождь рисуется с помощью ТРИАпи, там есть круги на воде, посмотри как они сделаны, сделай свои, а потом присобачь к ним R_TempSprite, который будет всплеском.

Добавлено 29-09-2009 в 12:40:

Я конечно, сам мог бы это написать, но в последнее время занят маппингом под Sauerbraten, да и до компа мне добираться сейчас долго. На досуге попробую сделать, а то звуки всплесков при попадании в воду есть, а самих всплесков нету =)


Отправлено Дядя Миша 29-09-2009 в 06:59:

Цитата:
Пытаюсь в сабачить их юз в CBasePlayer::WaterMove

pev->origin видимо

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено MadKing 29-09-2009 в 15:09:

Ku2zoff Дядя Миша подумаю - ща сделаю....
Ku2zoff , Это они где? В исходниках Paranoia? Да?

Добавлено 29-09-2009 в 19:09:

Немножко не понял, кто из них (файл rain.cpp) отвечает за реализацию кругов на воде....

C++ Source Code:
1
// falling to water?
2
int contents = gEngfuncs.PM_PointContents( pmtrace.endpos, NULL );
3
if (contents == CONTENTS_WATER)
4
{
5
  int waterEntity = gEngfuncs.PM_WaterEntity( pmtrace.endpos );
6
  if ( waterEntity > 0 )
7
  {
8
    cl_entity_t *pwater = gEngfuncs.GetEntityByIndex( waterEntity );
9
    if ( pwater && ( pwater->model != NULL ) )
10
    {
11
      deathHeight = pwater->curstate.maxs[2];
12
    }
13
    else
14
    {
15
      gEngfuncs.Con_Printf("Rain error: can't get water entity\n");
16
      continue;
17
    }
18
  }
19
  else
20
  {
21
    gEngfuncs.Con_Printf("Rain error: water is not func_water entity\n");
22
    continue;
23
  }
24
}
25
else
26
{
27
  deathHeight = pmtrace.endpos[2];
28
}
- это вааще здесь?


Отправлено Дядя Миша 29-09-2009 в 18:00:

MadKing зачем писать что ты опытный кодер, если не понимаешь элементарных вещей?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено MadKing 30-09-2009 в 01:32:

Дядя Миша я уже говорил, что ТриАПИ я раньше не занимался.
Оружие, монстры, impulse коды - это да, на это у меня опыт есть, а вот на модинг движка - только чайник я..
Ты мне скажи это здесь или не здесь?

Добавлено 30-09-2009 в 05:16:

Не, я просто хочу понять....

C++ Source Code:
1
void WaterLandingEffect(cl_drip *drip)
2
{
3
  if (fxcounter >= MAXFX)
4
  {
5
    gEngfuncs.Con_Printf( "Rain error: FX limit overflow!\n" );
6
    return;
7
  }
8
  cl_rainfx *newFX = g_fxArray.Allocate();
9
  if (!newFX)
10
  {
11
    gEngfuncs.Con_Printf( "Rain error: failed to allocate FX object!\n");
12
    return;
13
  }
14
  newFX->alpha = gEngfuncs.pfnRandomFloat(0.6, 0.9);
15
  VectorCopy(drip->origin, newFX->origin);
16
  newFX->origin[2] = drip->minHeight; // correct position
17
 
18
  newFX->birthTime = gEngfuncs.GetClientTime();
19
  newFX->life = gEngfuncs.pfnRandomFloat(0.7, 1);
20
  fxcounter++;
21
}

Вот это -
C++ Source Code:
if (fxcounter >= MAXFX)
{
  gEngfuncs.Con_Printf( "Rain error: FX limit overflow!\n" );
  return;
}
- понятно, проверка на превышение лимита эффектов.
C++ Source Code:
1
cl_rainfx *newFX = g_fxArray.Allocate();
2
if (!newFX)
3
{
4
  gEngfuncs.Con_Printf( "Rain error: failed to allocate FX object!\n");
5
  return;
6
}
- Эт я понял - выделение памяти под ФиКс и проверка.

C++ Source Code:
newFX->alpha = gEngfuncs.pfnRandomFloat(0.6, 0.9);
- прозрачность
C++ Source Code:
VectorCopy(drip->origin, newFX->origin);
newFX->origin[2] = drip->minHeight; // correct position
- определяем координаты, скопировав векторы.
C++ Source Code:
newFX->birthTime = gEngfuncs.GetClientTime();
newFX->life = gEngfuncs.pfnRandomFloat(0.7, 1);
fxcounter++;

_ Это я тоже понял.
Но мне нужен сам по себе newFX, наверное.
Поищу ещё в tri.cpp...

Добавлено 30-09-2009 в 05:22:

О! Функцию нашёл.
DrawFXObjects
Осталось добавить всё сопутствующее этой функции и куда нить присобачить.

Добавлено 30-09-2009 в 05:28:

Надоже, скомпилил!!!!
Осталось гденить это юзнуть ну а потом и дополнить эффектом брызг

Добавлено 30-09-2009 в 05:32:

Ан нет, главную то функцию забыл. 14 штук.


Отправлено SiPlus 30-09-2009 в 04:19:

Брызги можно и маппингом сделать, поставить над водой кучу триггеров (чтобы брызги были не в одном месте, а по всей воде), прикосновение к одному из них приводит к появлению 2-х спрайтов, один - круг, другой - всплеск.

А FX означает effects.


Отправлено MadKing 30-09-2009 в 08:34:

SiPlus , лучше кодом сделать тоже самое.

Добавлено 30-09-2009 в 12:34:

Всё скомпили, всё без ошибок, но, опять же, ни где не мелькают нужные функции. Куда надо вставить функции?


Отправлено MadKing 01-10-2009 в 01:38:

ЗЫ:Может Бузер не будет против и я просто перейду на паранойу???


Отправлено Ku2zoff 01-10-2009 в 02:46:

Цитата:
SiPlus писал:
Брызги можно и маппингом сделать, поставить над водой кучу триггеров (чтобы брызги были не в одном месте, а по всей воде), прикосновение к одному из них приводит к появлению 2-х спрайтов, один - круг, другой - всплеск.

Ндасс... А не проще ли заюзать спирит, там на карте locusdemo есть пример эффекта лучей света, проникающих через "дырки" в стене. Просто вместо лучей сделать всплески и звук добавить. Локус это конечно очень замудренная и непонятная система, но позволяет делать хорошие эффекты, без приложения больших усилий.


Отправлено MadKing 01-10-2009 в 04:43:

Цитата:
Ku2zoff писал:
А не проще ли заюзать спирит

Не проще - ты сам сказал что она не понятная, а я параною едва понимаю.
И всё таки, где применить эти функции, куды их записать или что то новое надо изобретать?(я про функи дождя из Параноии)


Отправлено Дядя Миша 01-10-2009 в 18:40:

Бузер против не будет я думаю. Остальные вообще никакого разрешения не спрашивали.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено MadKing 03-10-2009 в 03:45:

Хорошо, попробую, перейду...
Тока у меня вроде с первого же раза, как я его скачал, потекли какие то ошибки. Не знаю, может я и со спиритом спутал...
Ну вообщем Try'ну.


Отправлено PomanoB 08-02-2011 в 19:10:

Извиняюсь за подъём темы, но у меня похожий вопрос.

Как определить момент, когда любая энтити ударяется о воду?
У воды SOLID_NOT стоит и Touch не срабатывает(

Единственно что приходит мне в голову - в StartFrame перебирать все энтити и проверять вода или нет, но это как-то фигово(

Может можно как-то похимичить с solid'ами ?


Отправлено fire64 08-02-2011 в 19:28:

PomanoB, а если каждый кадр проверять pev->waterlevel ?

Или же через

UTIL_PointContents( Vector origin ) == CONTENTS_WATER

Правда если объект не точечный, то лучше использовать UTIL_WaterLevel

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено PomanoB 08-02-2011 в 20:03:

Я и говорю, что придумал только каждый кадр проверять, но нагрузка ведь будет сильная перебрать все энтити

И разве pev->waterlevel работает для не игроков?


Отправлено PLut 08-02-2011 в 20:14:

PomanoB Проверь, ведь лучше чем спрашивать и ждать ответа.

__________________
Base Defense on Steam, ModDB


Отправлено PomanoB 08-02-2011 в 20:45:

Проверил, pev->waterlevel для не игроков работает)
На глаз вроде не особо сильная нагрузка, но хотелось бы способ лучше(


Отправлено fire64 08-02-2011 в 21:23:

По поводу кода

PomanoB, объясни что ты хочешь сделать и как. потому что что бы дать тебе совет нужно хотя бы представлять, что ты в конечном счете хочешь получить.

Нагрузки никакой не будет, так как там и так каждый кадр вызывается тчинк функция у каждой энтити и еще пара сотен разных функций и параметров.

Как вариант можешь использовать для проверки столкновений не внешние энтити, а саму воду.

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено PomanoB 09-02-2011 в 05:39:

Я хочу сделать брызги при падении любого объекта в воду)
И think-то вызывается не каждый кадр а после pev->nextthink

[qoute]Как вариант можешь использовать для проверки столкновений не внешние энтити, а саму воду.[/quote]
Это как ?
В think'е воды искать ентити в радиусе?


Отправлено SiPlus 09-02-2011 в 07:51:

Примерно так:

function Water:Touch(ent) --прикосновение, ent - прикоснувшаяся энтитя
local Splash = ents.Create("env_sprite") --создает всплеск
Splash:SetKeyValue("sprite","спрайт всплеска") --задает параметр энтити, точно не знаю, как называется параметр, отвечающий за файл спрайта
Splash:SetPos(Vector(ent:GetPos().x,ent:GetPos().y,self:GetPos().z + self:Height())) --устанавливает местоположение спрайта, X и Y это позиция прикоснувшейся энтити, Z это местоположение воды + ее уровень
Splash:Spawn() --создает всплеск
Splash:Activate() --активирует его
timer.Simple(0.5,function() Splash:Remove() end) --удаляет всплеск через 0.5с
end


Отправлено Дядя Миша 09-02-2011 в 11:29:

Цитата:
PomanoB писал:
Единственно что приходит мне в голову - в StartFrame перебирать все энтити и проверять вода или нет, но это как-то фигово(

на уровне движка есть areanodes - бинарное дерево, в котором находятся все физобъекты и при помощи которого можно быстро найти энтитю в заданной точке. Проблема лишь в том, что в игровой дллке этого метода нету, поэтому остается ровно один способ - перебор энтить.
И ничего фигового тут нету. Сервер каждый кадр по нескольку раз перебирает физ. энтити и никого это не колышет.
Причем перебрать достаточно всего один раз - далее-то у нас уже есть энтить, сквозь которую прошла трасса.
Можно и по другому сделать: сделать трейс, проверить контентс на конце, разделить длинну трассы пополам, проверить контентс на середине, потом еще раз пополам. Но лучше всего этим заниматься на клиенте, поскольку там есть GetWaterEntity.

Добавлено 09-02-2011 в 14:29:

SiPlus ты читаешь вообще что пишут? Вода несолидная, трасса проходит сквозь нее не задевая. Причем тут WaterTouch ?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено SiPlus 09-02-2011 в 13:22:

Дядя Миша, ну если SOLID_NONE и карта своя, то можно попробовать какой-нибудь trigger_water создать, который делает всплески, и разместить его по всей поверхности воды. Там, где в воду ничего не падает, можно этот триггер и не делать.


Отправлено Дядя Миша 09-02-2011 в 13:54:

SiPlus ну ты представь себе что SOLID_TRIGGER трасса игнорирует точно также как и SOLID_NOT. Хоть на своей карте, хоть на чужой.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено PLut 09-02-2011 в 14:26:

Некий Festern писал на half-life.ru

Цитата:
Вставляется в код UTIL_BubbleTrail:

Vector SplashOrigin = to;

CBaseEntity *pW = NULL;

for (int i=1;i<=10;i++)
{
pW = UTIL_FindEntityByClassname(pW,"func_water" );
if ( !FNullEnt(pW->pev) )
{
if(((pW->pev->mins.x<to.x)&&(pW->pev->maxs.x>to.x))&&((pW->pev->mins.y<to.y)&&(pW->pev->maxs.y>to.y))&&((pW->pev->mins.z<to.z)&&(pW->pev->maxs.z>to.z)))
{
SplashOrigin.z=pW->pev->maxs.z;
break;
}
}
}

SplashOrigin.x=to.x-((to.x-from.x)*(SplashOrigin.z-to.z)/(from.z-to.z));
SplashOrigin.y=to.y-((to.y-from.y)*(SplashOrigin.z-to.z)/(from.z-to.z));

В итоге SplashOrigin - нужный вектор.


Я этот код использую, при попадании пуль в воду рисую партиклю в точке SplashOrigin.

__________________
Base Defense on Steam, ModDB


Отправлено Дядя Миша 09-02-2011 в 16:18:

Цитата:
PLut писал:
Некий Festern писал на half-life.ru

ну и? С мировой водой это работать не будет.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено PLut 09-02-2011 в 16:33:

Дядя Миша Да, зато будет работать с энтити. Лучше чем возня с триггерами ИМХО.

__________________
Base Defense on Steam, ModDB


Отправлено SiPlus 09-02-2011 в 16:48:

Цитата:
Дядя Миша писал:
трасса игнорирует точно

Какая трасса? К триггеру можно прикоснуться, зачем трасса, местоположение всплеска можно узнать по местоположению вещи, которая в него вошла.


Отправлено Дядя Миша 09-02-2011 в 17:09:

Цитата:
SiPlus писал:
К триггеру можно прикоснуться, зачем трасса, местоположение всплеска можно узнать по местоположению вещи, которая в него вошла.

вещь, которая "входит" в триггер - это пуля. Стрельба пулями традиционно сделана трейслайном, который проходит сквозь триггеры не задевая их. Или тебе нравится блистать идиотизмом?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено PomanoB 09-02-2011 в 18:53:

Всем спасибо за ответы, сделал перебором и проверкой waterlevel


Отправлено Дядя Миша 09-02-2011 в 20:31:

PomanoB еще рекомендую код XDM к изучению на предмет ватер-сплешей на мировой воде.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено PomanoB 09-02-2011 в 20:39:

Спасибо! Посмотрю


Временная зона GMT. Текущее время 15:34.
Показать все 46 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024