HLFX.Ru Forum Страницы (266): « Первая ... « 102 103 104 105 [106] 107 108 109 110 » ... Последняя »
Показать все 3977 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Нубские вопросы от <censored> и других нубов (https://hlfx.ru/forum/showthread.php?threadid=4535)


Отправлено Chyvachok 29-03-2018 в 11:56:

Вопрос насчет TriApi, допустим у меня есть эффект дымка от стен CSmokePuff из паранои, я хочу как-то переделать его чтобы он рисовал круги при попадании на стены, я пытаюсь в общем повторить эффект бластера из GunMan Chronicles, там при попадании в стену помимо спрайта попадания еще рисуются "кольца" на стене, я вот пытаюсь эти кольца как-то воссоздать. В общем как мне сделать чтобы спрайт не "смотрел" на игрока, а от стены? Я не нашел как это сделать. И как можно сделать чтобы можно было указать свой спрайт? А то у меня с этим тоже проблемы возникли. Вот код этого эффекта:

code:
//test blaster_effect CBlasterHit::CBlasterHit( vec3_t origin, vec3_t normal, float life, float alpha, float puffspeed, float puffsize, float maxofs, float r, float g, float b) { vec3_t up, right; VectorClear(right); VectorClear(up); MakeUpRight(normal, up, right); m_fAlpha = alpha; m_fLife = life; m_fr = r; m_fg = g; m_fb = b; spr = SPR_Load("sprites/blaster_puff.spr"); // gEngfuncs.Con_Printf("normal: %f, %f, %f\n", normal[0], normal[1], normal[2]); // gEngfuncs.Con_Printf("up vec: %f, %f, %f\n", up[0], up[1], up[2]); // gEngfuncs.Con_Printf("right vec: %f, %f, %f\n", right[0], right[1], right[2]); VectorCopy(origin, puff_origin); puff_size = puffsize; VectorClear(puff_velocity); VectorMA(puff_velocity, puffspeed, normal, puff_velocity); VectorMA(puff_velocity, gEngfuncs.pfnRandomFloat(-maxofs, maxofs), right, puff_velocity); VectorMA(puff_velocity, gEngfuncs.pfnRandomFloat(-maxofs, maxofs), up, puff_velocity); // gEngfuncs.Con_Printf("creating puff\n"); } int CBlasterHit::Draw(float time, float frametime) { float frac = (time - birthTime) / m_fLife; if (frac > 1) return 1; // delete object // HL_HSPRITE spr = SPR_Load("sprites/blasterpuff.spr"); // HL_HSPRITE spr2 = SPR_Load("sprites/blasterpoof.spr"); if (!spr) { gEngfuncs.Con_Printf("error: cant load sprite sprites/blasterpuff.spr\n"); return 1; } CalcViewMatrix(); struct model_s *pModel = (struct model_s *)gEngfuncs.GetSpritePointer( spr ); int frame = (int)(pModel->numframes * frac); gEngfuncs.pTriAPI->RenderMode(kRenderTransAdd); gEngfuncs.pTriAPI->SpriteTexture( pModel, frame ); gEngfuncs.pTriAPI->Color4f( m_fr, m_fg, m_fb, m_fAlpha ); gEngfuncs.pTriAPI->CullFace( TRI_NONE ); gEngfuncs.pTriAPI->Begin( TRI_QUADS ); float size = puff_size * frac; VectorMA(puff_origin, frametime, puff_velocity, puff_origin); g_viewMatrix[0][3] = puff_origin[0]; // write origin to matrix g_viewMatrix[1][3] = puff_origin[1]; g_viewMatrix[2][3] = puff_origin[2]; gEngfuncs.pTriAPI->TexCoord2f( 0, 0 ); SetPoint(0, size ,size, g_viewMatrix); gEngfuncs.pTriAPI->TexCoord2f( 0, 1 ); SetPoint(0, size ,-size, g_viewMatrix); gEngfuncs.pTriAPI->TexCoord2f( 1, 1 ); SetPoint(0, -size ,-size, g_viewMatrix); gEngfuncs.pTriAPI->TexCoord2f( 1, 0 ); SetPoint(0, -size ,size, g_viewMatrix); gEngfuncs.pTriAPI->End(); gEngfuncs.pTriAPI->RenderMode(kRenderNormal); return 0; } //.h файл: class CBlasterHit : public CObject { public: // construction CBlasterHit( vec3_t origin, vec3_t normal, float life, float alpha, float puffspeed, float puffsize, float maxofs, float r=1.0, float g=1.0, float b=1.0 ); ~CBlasterHit() {gEngfuncs.Con_Printf("deleting puff\n");}; int Draw( float time, float frametime ); HL_HSPRITE spr; vec3_t puff_origin; vec3_t puff_velocity; float puff_size; float m_fAlpha; float m_fLife; float m_fr, m_fg, m_fb; };


И вот что я пытаюсь сделать: https://imgur.com/a/DkmCW


Отправлено FiEctro 29-03-2018 в 12:22:

>> как мне сделать чтобы спрайт не "смотрел" на игрока, а от стены?

Насколько я помню в БСП для каждой поверхности записана нормаль, собственно по ней и надо ориентировать твой спрайт

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!


Отправлено Chyvachok 29-03-2018 в 12:33:

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


Отправлено a1batross 29-03-2018 в 13:16:

Chyvachok перекомпилять сам спрайт. Там есть опция ориентации.


Отправлено Дядя Миша 29-03-2018 в 13:58:

Если спрайт рисуется через триапи эти настройки не учитываются

__________________
My Projects: download page

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

Цитата:

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


Отправлено Chyvachok 29-03-2018 в 15:14:

Дядя Миша а как тогда убрать это чтобы он не смотрел на игрока всегда?


Отправлено Ku2zoff 29-03-2018 в 15:19:

Chyvachok есть 2D триапи (рисуется всегда повёрнутым к игроку, например спрайты над бошками тиммейтов в DoD) и есть 3D триапи (огонёк зажигалки в Инвазионе). Вот, используй 3D-вариант. Он, кстати, и в софтваре тоже работает.
gEngfuncs.pTriAPI->TexCoord2f это для 2D, используй gEngfuncs.pTriAPI->Vertex3f для 3D координат.


Отправлено Chyvachok 29-03-2018 в 16:56:

Ku2zoff спасибо за подсказку, посмотрел в коде инвазиона, что-то там скопировал, и каким-то чудом вроде стало работать как надо, хотя код с этими gEngfuncs.pTriAPI там был очень похож, что вышло: https://imgur.com/a/ICAiS

Вот кстати код, интересно, насколько он нормальный? Может какие моменты можно улучшить?

C++ Source Code:
1
class CBlasterRing : public CObject
2
{
3
public:
4
  // construction
5
  CBlasterRing( vec3_t origin, vec3_t normal, float life, float alpha, float size, char model [64], float r=1.0, float g=1.0, float b=1.0 );
6
  ~CBlasterRing() {gEngfuncs.Con_Printf("deleting puff\n");};
7
  int Draw( float time, float frametime );
8
 
9
  HL_HSPRITE spr;
10
 
11
  vec3_t	RingOrigin;
12
  vec3_t	RingNormal;
13
  float	RingSize;
14
 
15
  float m_fAlpha;
16
  float m_fLife;
17
 
18
  float m_fr, m_fg, m_fb;
19
};
20
 
21
CBlasterRing::CBlasterRing( vec3_t origin, vec3_t normal, float life, float alpha, float size, char model [64], float r, float g, float b)
22
{
23
  vec3_t up, right;
24
  VectorClear(right);
25
  VectorClear(up);
26
  MakeUpRight(normal, up, right);
27
  m_fAlpha = alpha;
28
  m_fLife = life;
29
  m_fr = r; m_fg = g; m_fb = b;
30
 
31
  spr = SPR_Load(model);
32
 
33
  VectorCopy((origin + normal * 1), RingOrigin);
34
  VectorCopy(normal, RingNormal);
35
  RingSize = size;
36
}
37
 
38
int CBlasterRing::Draw(float time, float frametime)
39
{
40
  float frac = (time - birthTime) / m_fLife;
41
  if (frac > 1)
42
    return 1; // delete object
43
 
44
  if (!spr)
45
  {
46
    gEngfuncs.Con_Printf("error: cant load sprite \n");
47
    return 1;
48
  }
49
 
50
  CalcViewMatrix();
51
 
52
  float size = RingSize * frac;
53
 
54
  vec3_t forward, right, up, vertex;
55
  MakeUpRight(RingNormal, up, right);
56
 
57
  struct model_s *pModel = (struct model_s *)gEngfuncs.GetSpritePointer( spr );
58
  gEngfuncs.pTriAPI->RenderMode(kRenderTransAdd);
59
  gEngfuncs.pTriAPI->SpriteTexture( pModel, 0 );
60
  float alpha = m_fAlpha - frac;
61
  gEngfuncs.pTriAPI->Color4f( m_fr, m_fg, m_fb, alpha );
62
  gEngfuncs.pTriAPI->CullFace( TRI_NONE );
63
 
64
  gEngfuncs.pTriAPI->Begin( TRI_QUADS );
65
 
66
  gEngfuncs.pTriAPI->TexCoord2f( 0, 0 );
67
  vertex = RingOrigin - ( up + right ) * size;
68
  gEngfuncs.pTriAPI->Vertex3f( vertex.x, vertex.y, vertex.z );
69
 
70
  gEngfuncs.pTriAPI->TexCoord2f( 1, 0 );
71
  vertex = RingOrigin + ( right - up ) * size;
72
  gEngfuncs.pTriAPI->Vertex3f( vertex.x, vertex.y, vertex.z );
73
 
74
  gEngfuncs.pTriAPI->TexCoord2f( 1, 1 );
75
  vertex = RingOrigin + ( right + up ) * size;
76
  gEngfuncs.pTriAPI->Vertex3f( vertex.x, vertex.y, vertex.z );
77
 
78
  gEngfuncs.pTriAPI->TexCoord2f( 0, 1 );
79
  vertex = RingOrigin + ( up - right ) * size;
80
  gEngfuncs.pTriAPI->Vertex3f( vertex.x, vertex.y, vertex.z );
81
 
82
 
83
  gEngfuncs.pTriAPI->End();
84
  gEngfuncs.pTriAPI->RenderMode(kRenderNormal);
85
 
86
  return 0;
87
}


Отправлено Дядя Миша 29-03-2018 в 17:53:

Цитата:
Chyvachok писал:
как тогда убрать это чтобы он не смотрел на игрока всегда?

ДА НЕ КАК!!!!!111

__________________
My Projects: download page

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

Цитата:

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


Отправлено Chyvachok 30-03-2018 в 16:18:

Вопрос по векторам и углам, а как развернуть объект по tr.vecPlaneNormal?
Допустим я хочу чтобы обьект который липнет к стене еще рандомно разворачивался относительно этой стены, я то я заюзал StickyGibсы, и в глаза бросается что они одинаково к поверхности клеються.


Отправлено ~ X ~ 30-03-2018 в 17:57:

Chyvachok CTripmineGrenade...
Хотя, если честно, AlignToFloor() у меня до сих пор в TODO.

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: half-life@conference.jabber.ru


Отправлено Chyvachok 30-03-2018 в 18:14:

~ X ~ ну они и так к стене разворачиваются на подобии трипмины, мина она всегда прямо лепиться, не боком там или еще как-то, я имел ввиду их еще для рандома покрутить относительно стены, чтобы одинаковость формы моделей не так в глаза бросалась, но я вот не знаю как бы именно покрутить относительно этой tr.vecPlaneNormal, а не мира.


Отправлено Дядя Миша 30-03-2018 в 18:48:

Цитата:
Chyvachok писал:
но я вот не знаю как бы именно покрутить относительно этой tr.vecPlaneNormal, а не мира.

UTIL_VecToAngles

__________________
My Projects: download page

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

Цитата:

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


Отправлено Chyvachok 30-03-2018 в 20:02:

Посмотрел у стрелы арбалета, оказываеться добавить pev->angles.z = RANDOM_LONG(0,360); было достаточно, я думал что оно крутить будет относительно мира, а стены. Заодно попробовал ретекстурить эти stickygib-ы: https://imgur.com/a/PXTCT


Отправлено Garux 31-03-2018 в 19:46:

Chyvachok, крутота! кишки можно по стенам размазывать


Временная зона GMT. Текущее время 22:19. Страницы (266): « Первая ... « 102 103 104 105 [106] 107 108 109 110 » ... Последняя »
Показать все 3977 сообщений этой темы на одной странице

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