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 |
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 ); |
18 | float m_fr, m_fg, m_fb; |
21 | CBlasterRing::CBlasterRing( vec3_t origin, vec3_t normal, float life, float alpha, float size, char model [64], float r, float g, float b) |
26 | MakeUpRight(normal, up, right); |
29 | m_fr = r; m_fg = g; m_fb = b; |
31 | spr = SPR_Load(model); |
33 | VectorCopy((origin + normal * 1), RingOrigin); |
34 | VectorCopy(normal, RingNormal); |
38 | int CBlasterRing::Draw(float time, float frametime) |
40 | float frac = (time - birthTime) / m_fLife; |
42 | return 1; // delete object |
46 | gEngfuncs.Con_Printf("error: cant load sprite \n"); |
52 | float size = RingSize * frac; |
54 | vec3_t forward, right, up, vertex; |
55 | MakeUpRight(RingNormal, up, right); |
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 ); |
64 | gEngfuncs.pTriAPI->Begin( TRI_QUADS ); |
66 | gEngfuncs.pTriAPI->TexCoord2f( 0, 0 ); |
67 | vertex = RingOrigin - ( up + right ) * size; |
68 | gEngfuncs.pTriAPI->Vertex3f( vertex.x, vertex.y, vertex.z ); |
70 | gEngfuncs.pTriAPI->TexCoord2f( 1, 0 ); |
71 | vertex = RingOrigin + ( right - up ) * size; |
72 | gEngfuncs.pTriAPI->Vertex3f( vertex.x, vertex.y, vertex.z ); |
74 | gEngfuncs.pTriAPI->TexCoord2f( 1, 1 ); |
75 | vertex = RingOrigin + ( right + up ) * size; |
76 | gEngfuncs.pTriAPI->Vertex3f( vertex.x, vertex.y, vertex.z ); |
78 | gEngfuncs.pTriAPI->TexCoord2f( 0, 1 ); |
79 | vertex = RingOrigin + ( up - right ) * size; |
80 | gEngfuncs.pTriAPI->Vertex3f( vertex.x, vertex.y, vertex.z ); |
83 | gEngfuncs.pTriAPI->End(); |
84 | gEngfuncs.pTriAPI->RenderMode(kRenderNormal); |
Отправлено Дядя Миша 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, крутота! кишки можно по стенам размазывать