Files
Client/GameTools/Effect/CLightning.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

1422 lines
34 KiB
C++
Raw Permalink Blame History

#include "CLightning.h"
#include "SceneStateMgr.h"
CLightning ::CLightning() {
m_EndCount = 0;
m_Alpha = 1.0f;
m_bFadeOut = false;
m_FadeSpeed = 0.001f;
m_PointList = NULL;
m_PointNum = 0;
m_QuadHalfWidth = LIGHTHALFWIDTH;
m_InsertCount = 0;
m_RenderCount = 0;
m_Device = NULL;
m_Vert = NULL;
m_VerticalVert = NULL;
m_VertNum = 0;
m_Texture = NULL;
m_TexNum = 0;
m_ShakeMax = m_QuadHalfWidth;
m_ShakeMin = 0.0f;
srand(time(0));
m_MaxRenderCount = 0;
m_Color = D3DCOLOR_ARGB(255,255,255,255);
m_UvAni = 0.0f;
m_UnitUv = 0.0f;
m_PlaneValue = 0;
m_bSetEndEffect = false;
m_EndUnit = 5;
m_LightningValue = LV_LIGHTNING;
m_bCrash = false;
m_bEndInput = false;
m_iAlpha = 255;
tmp_Vertex = NULL;
tmp_Vertex2 = NULL;
m_VerticalVert2 = NULL;
tmp_Vertex3 = NULL;
m_BezierPointList.clear();
}
CLightning ::CLightning(LPDIRECT3DDEVICE8 device) {
m_EndCount = 0;
m_Alpha = 1.0f;
m_bFadeOut = false;
m_FadeSpeed = 0.001f;
m_PointList = NULL;
m_PointNum = 0;
m_QuadHalfWidth = LIGHTHALFWIDTH;
m_InsertCount = 0;
m_RenderCount = 0;
m_Device = device;
m_Vert = NULL;
m_VerticalVert = NULL;
m_VertNum = 0;
m_Texture = NULL;
m_TexNum = 0;
m_ShakeMax = m_QuadHalfWidth;
m_ShakeMin = 0.0f;
srand(time(0));
m_MaxRenderCount = 0;
m_Color = D3DCOLOR_ARGB(255,255,255,255);
m_UvAni = 0.0f;
m_UnitUv = 0.0f;
m_PlaneValue = 0;
m_bSetEndEffect = false;
m_EndUnit = 5;
m_LightningValue = LV_LIGHTNING;
m_bCrash = false;
m_bEndInput = false;
m_iAlpha = 255;
tmp_Vertex = NULL;
tmp_Vertex2 = NULL;
m_VerticalVert2 = NULL;
tmp_Vertex3 = NULL;
m_BezierPointList.clear();
}
CLightning ::CLightning(int num,LPDIRECT3DDEVICE8 device) {
m_Alpha = 1.0f;
m_bFadeOut = false;
m_FadeSpeed = 0.001f;
m_EndCount = 0;
m_PointList = NULL;
m_PointNum = num;
m_QuadHalfWidth = LIGHTHALFWIDTH;
m_InsertCount = 0;
m_RenderCount = 0;
m_Device = device;
m_Vert = NULL;
CreateList(m_PointNum);
m_VertNum = 0;
m_VerticalVert = NULL;
m_Texture = NULL;
m_TexNum = 0;
m_ShakeMax = m_QuadHalfWidth;
m_ShakeMin = 0.0f;
srand(time(0));
m_MaxRenderCount = 0;
m_Color = D3DCOLOR_ARGB(255,255,255,255);
m_UvAni = 0.0f;
m_UnitUv = 0.0f;
m_PlaneValue = 0;
m_bSetEndEffect = false;
m_EndUnit = 5;
m_LightningValue = LV_LIGHTNING;
m_bCrash = false;
m_bEndInput = false;
m_iAlpha = 255;
tmp_Vertex = NULL;
tmp_Vertex2 = NULL;
m_VerticalVert2 = NULL;
tmp_Vertex3 = NULL;
m_BezierPointList.clear();
}
CLightning::~CLightning() {
int i;
if(m_PointList)
delete[] m_PointList;
if(m_Vert) {
for(i=0;i<m_VertNum;i++) {
m_Vert[i]->Release();
m_VerticalVert[i]->Release();
m_VerticalVert2[i]->Release();
}
delete[] m_Vert;
delete[] m_VerticalVert;
delete[] m_VerticalVert2;
}
if(m_Texture) {
delete[] m_Texture;
}
if(tmp_Vertex)
delete[] tmp_Vertex;
if(tmp_Vertex2)
delete[] tmp_Vertex2;
if(tmp_Vertex3)
delete[] tmp_Vertex3;
if(m_LightningValue == LV_BEZIER) {
m_BezierPointList.clear();
}
}
void CLightning::CreateList(int num) {
if(m_PointList)
delete[] m_PointList;
m_PointList = new D3DXVECTOR3[num];
memset(m_PointList,0,sizeof(D3DXVECTOR3) * num);
m_PointNum = num;
}
void CLightning::DeleteList() {
if(m_PointList)
delete[] m_PointList;
}
void CLightning::InsertPoint(float x,float y,float z) {
m_PointList[m_InsertCount].x = x;
m_PointList[m_InsertCount].y = y;
m_PointList[m_InsertCount++].z = z;
if(m_InsertCount >= m_PointNum)
m_InsertCount = 0;
}
void CLightning::InsertPoint(D3DXVECTOR3 point) {
m_PointList[m_InsertCount++] = point;
}
void CLightning::InsertEmptyPoint(float x,float y,float z) {
int i;
if(m_InsertCount >=m_PointNum) {
memcpy(m_PointList,&m_PointList[1],(m_PointNum -1) * sizeof(D3DXVECTOR3));
m_InsertCount = m_PointNum-1;
}
for(i=m_InsertCount;i<m_PointNum;i++) {
m_PointList[i].x = x;
m_PointList[i].y = y;
m_PointList[i].z = z;
}
m_InsertCount++;
}
void CLightning::SetEnd() {
int i;
for(i=m_PointNum -2; i >=0;i--) {
m_PointList[i] = m_PointList[i+1];
}
}
void CLightning::SetStartPoint(float x,float y,float z) {
m_PointList[0].x = x;
m_PointList[0].y = y;
m_PointList[0].z = z;
}
void CLightning::SetEndPoint(float x,float y,float z) {
m_PointList[m_PointNum - 1].x = x;
m_PointList[m_PointNum - 1].y = y;
m_PointList[m_PointNum - 1].z = z;
}
void CLightning::SetBezierControl(float fControl,float fHeight,float fSpeed,float fAccel,float fLength,float fFade,float fLimit,int axis,int endspeed,int endaccel,int iUv) { // Bezier <20><EFBFBD><EEBCB1> control point setting
m_Bezier.m_fControl = fControl;
m_Bezier.m_fControlHeight = fHeight;
m_Bezier.m_fSpeed = fSpeed;
m_Bezier.m_fAccel = fAccel;
m_Bezier.m_fStartEndLength = fLength;
m_Bezier.m_fFade = fFade;
m_Bezier.m_fLimitLength = fLimit;
m_Bezier.m_iAxis = axis;
m_Bezier.m_iEndSpeed = endspeed;
m_Bezier.m_iEndAccel = endaccel;
m_Bezier.m_iUvMode = iUv;
//m_Bezier.m_ft = 0.05f;
}
bool CLightning::SetBezierPoint() { //Bezier Curve point setting
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׻<EFBFBD> 0.05f <20>̴<EFBFBD>.
bool bReturn = true;
if(m_InsertCount == 0) { // Start Position Setting
m_BezierPointList.push_back(m_PointList[0]);
m_InsertCount++;
return bReturn;
}
//else if(m_InsertCount == 0)
// return;
D3DXVECTOR3 line_vector;
float length;
line_vector = m_PointList[m_PointNum -1] - m_PointList[0];
length = D3DXVec3Length(&line_vector);
D3DXVECTOR3 cross = D3DXVECTOR3(0.0f,0.0f,0.0f);
D3DXVECTOR3 up = D3DXVECTOR3(0.0f,1.0f,0.0f);
D3DXVec3Cross(&cross,&line_vector,&up);
D3DXVec3Normalize(&cross,&cross);
// control setting
D3DXVECTOR3 bezier_control = m_BezierPointList[0] + (line_vector * m_Bezier.m_fControl);
D3DXVECTOR3 axis;
D3DXVECTOR3 axis2;
D3DXVECTOR3 axis3;
switch(m_Bezier.m_iAxis) {
case 0:
bezier_control += cross * m_Bezier.m_fControlHeight;
break;
case 1:
axis = cross;
axis2 = cross;
axis3 = cross + up;
axis2 = axis2 + axis3;
axis +=axis2;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 2:
axis = cross;
axis2 = cross + up;
axis = axis + axis2;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 3:
axis = cross;
axis2 = cross + up;
axis = axis + axis2;
axis3 = cross + up;
axis +=axis3;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 4:
axis = cross + up;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 5:
axis = cross + up;
axis2 = up;
axis3 = cross + up;
axis2 = axis2 + axis3;
axis += axis2;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 6:
axis = up;
axis2 = cross + up;
axis = axis + axis2;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 7:
axis = up;
axis2 = cross + up;
axis = axis + axis2;
axis3 = up;
axis += axis3;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 8:
axis = up;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 9:
axis = up;
axis2 = up;
axis3 = -cross + up;
axis2 = axis2 + axis3;
axis += axis2;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 10:
axis = up;
axis2 = -cross + up;
axis = axis + axis2;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 11:
axis = up;
axis2 = -cross + up;
axis = axis + axis2;
axis3 = -cross + up;
axis += axis3;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 12:
axis = -cross + up;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 13:
axis = -cross + up;
axis2 = -cross;
axis3 = -cross + up;
axis2 = axis2 + axis3;
axis += axis2;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 14:
axis = -cross;
axis2 = -cross + up;
axis = axis + axis2;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
case 15:
axis = -cross;
axis2 = -cross + up;
axis = axis + axis2;
axis3 = -cross;
axis += axis3;
D3DXVec3Normalize(&axis,&axis);
bezier_control += axis * m_Bezier.m_fControlHeight;
break;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
D3DXVECTOR3 vecLastInput = m_BezierPointList[ m_InsertCount - 1 ];
D3DXVECTOR3 vecInput;
D3DXVECTOR3 vecCheck;
while(bReturn && !m_bEndInput) {
float t = m_Bezier.m_ft;
float t2 = t * t;
float fInput = 0.0f;
vecInput = m_PointList[0] * ((1.0f - t) * (1.0f - t)) + (bezier_control * 2 *(1.0f - t) * t ) + (m_PointList[m_PointNum -1] * t2);
vecCheck = vecInput - vecLastInput;
m_BezierPointList.push_back(vecInput);
m_InsertCount++;
fInput = D3DXVec3Length(&vecCheck);
// Speed setting
m_Bezier.m_ft += 0.05f;
if(m_Bezier.m_ft >= 1.0f) {
/////// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> setting
float t = m_Bezier.m_ft;
float t2 = t * t;
float fInput = 0.0f;
vecInput = m_PointList[0] * ((1.0f - t) * (1.0f - t)) + (bezier_control * 2 *(1.0f - t) * t ) + (m_PointList[m_PointNum -1] * t2);
vecCheck = vecInput - vecLastInput;
m_BezierPointList.push_back(vecInput);
m_InsertCount++;
///////
m_bEndInput = true;
m_Bezier.m_ft = 1.0f;
bReturn = true;
}
else if(m_Bezier.m_ft < 0.0f)
m_Bezier.m_ft = 0.0f;
if( fInput > m_Bezier.m_fSpeed ) // <20>̵<EFBFBD><CCB5>Ÿ<EFBFBD><C5B8><EFBFBD> <20>ӵ<EFBFBD> <20><><EFBFBD><EFBFBD> ũ<>ٸ<EFBFBD> <20>̹<EFBFBD> <20>߰<EFBFBD> <20><>
break;
}
int iLastIndex = m_BezierPointList.size();
if(iLastIndex >= 2) { // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
while((iLastIndex = m_BezierPointList.size()) >= 2) {
vecLastInput = m_BezierPointList[iLastIndex - 1];
vecCheck = vecLastInput - m_BezierPointList[0];
float fLength = D3DXVec3Length(&vecCheck);
if(fLength > m_Bezier.m_fLimitLength) { // <20><><EFBFBD>ѱ<EFBFBD><D1B1≯<EFBFBD> <20>Ѿ<D1BE><EEBCB9><EFBFBD><EFBFBD>
if(m_BezierPointList.size() >= 1) {
m_BezierPointList.erase(&m_BezierPointList[0]);
m_InsertCount--;
}
}
else if(m_bEndInput) { // <20><EFBFBD><E6B5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(int cEndSpeed = 0; cEndSpeed < m_Bezier.m_iEndSpeed; cEndSpeed++) {
if(m_BezierPointList.size() >= 1) {
m_BezierPointList.erase(&m_BezierPointList[0]);
m_InsertCount--;
}
else
break;
}
m_Bezier.m_iEndSpeed += m_Bezier.m_iEndAccel;
break;
}
else {
break;
}
}
}
m_Bezier.m_fSpeed += m_Bezier.m_fAccel; // <20>ӵ<EFBFBD><D3B5><EFBFBD> <20><><EFBFBD>ӵ<EFBFBD> <20><><EFBFBD><EFBFBD>
if(m_bCrash) { // <20><EFBFBD><E6B5B9> <20><><EFBFBD><EFBFBD> true
m_iAlpha -= m_Bezier.m_fFade;
if(m_iAlpha < 0)
m_iAlpha = 0;
}
return bReturn;
}
/*
void CLightning::SetBezierPoint() { //Bezier Curve point setting
D3DXVECTOR3 line_vector;
float length;
float unit_length;
int split_num = m_PointNum -1;
line_vector = m_PointList[m_PointNum -1] - m_PointList[0];
length = D3DXVec3Length(&line_vector);
unit_length = length/(float)split_num;
D3DXVECTOR3 cross = D3DXVECTOR3(0.0f,0.0f,0.0f);
D3DXVECTOR3 up = D3DXVECTOR3(0.0f,1.0f,0.0f);
//D3DXVec3Normalize(&line_vector,&line_vector);
D3DXVec3Cross(&cross,&line_vector,&up);
D3DXVec3Normalize(&cross,&cross);
// control setting
D3DXVECTOR3 bezier_control = line_vector * m_Bezier.m_fControl;
bezier_control += cross * m_Bezier.m_fControlHeight;
float t = m_Bezier.m_ft;
float t2 = t * t;
m_PointList[m_InsertCount++] = m_PointList[0] * (1.0f - t2) + (bezier_control * 2 *(1.0f - t) * t ) + (m_PointList[m_PointNum -1] * t2);
// Speed setting
m_Bezier.m_ft += m_Bezier.m_fSpeed;
m_Bezier.m_fSpeed += m_Bezier.m_fAccel;
if(m_Bezier.m_ft > 1.0f)
m_Bezier.m_ft = 1.0f;
else if(m_Bezier.m_ft < 0.0f)
m_Bezier.m_ft = 0.0f;
if(m_InsertCount >= m_PointNum -1) {
D3DXVECTOR3 limit_vec = m_PointList[m_PointNum -2] - m_PointList[0];
float limit_length = D3DXVec3Length(&limit_vec);
if(limit_length > m_Bezier.m_fLimitLength) { //<2F><><EFBFBD>̰<EFBFBD> limit <20><><EFBFBD><EFBFBD> Ŭ<><C5AC>
memcpy(m_PointList,&m_PointList[1],(m_PointNum -2) * sizeof(D3DXVECTOR3));
}
else { // <20><><EFBFBD>̰<EFBFBD> limit <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(&m_PointList[1],&m_PointList[2],(m_PointNum -3) * sizeof(D3DXVECTOR3));
}
m_InsertCount = m_PointNum-2;
}
if(m_bCrash) { // <20><EFBFBD><E6B5B9> <20><><EFBFBD><EFBFBD> true
m_iAlpha -= 10;
if(m_iAlpha < 0)
m_iAlpha = 0;
}
}
*/
void CLightning::SetRandPoint() {
D3DXVECTOR3 line_vector;
float length;
float unit_length;
float unit_shake = m_ShakeMax - m_ShakeMin;
int i;
int split_num = m_PointNum -1;
line_vector = m_PointList[m_PointNum -1] - m_PointList[0];
length = D3DXVec3Length(&line_vector);
unit_length = length/(float)split_num;
D3DXVec3Normalize(&line_vector,&line_vector);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> line <20><><EFBFBD><EFBFBD> setting
// <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=1;i<m_PointNum - 1;i++) {
D3DXVECTOR3 tmp;
m_PointList[i] = m_PointList[0] + ((unit_length * i) * line_vector);
//shaking value range : m_ShakeMin ~ m_ShakeMax
tmp.x = m_ShakeMin + (float)(rand() %(int)((unit_shake) * 1000)) / 1000.0f;
tmp.y = m_ShakeMin + (float)(rand() %(int)((unit_shake) * 1000)) / 1000.0f;
tmp.z = m_ShakeMin + (float)(rand() %(int)((unit_shake) * 1000)) / 1000.0f;
if(rand() % 2)
tmp.x *= -1.0f;
if(rand() % 2)
tmp.y *= -1.0f;
if(rand() % 2)
tmp.z *= -1.0f;
m_PointList[i] +=tmp;
}
}
void CLightning::CreateTexture(int num) {
m_TexNum = num;
m_Texture = new CTexture[m_TexNum];
}
void CLightning::SetTexture(int index,char *filename) {
CTexture::SetPath(EFFECTTEXTUREPATH);
if(strlen(filename) >0) {
m_Texture[index].Load(filename);
}
}
void CLightning::CreateVertexBuffer() {
int i;
m_Vert = new LPDIRECT3DVERTEXBUFFER8[m_VertNum];
m_VerticalVert = new LPDIRECT3DVERTEXBUFFER8[m_VertNum];
m_VerticalVert2 = new LPDIRECT3DVERTEXBUFFER8[m_VertNum];
for(i=0;i<m_VertNum;i++) {
m_Device->CreateVertexBuffer(m_PointNum * 2 * sizeof(CLightVertex),D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC,
D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1,D3DPOOL_DEFAULT,&(m_Vert[i]));
m_Device->CreateVertexBuffer(m_PointNum * 2 * sizeof(CLightVertex),D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC,
D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1,D3DPOOL_DEFAULT,&(m_VerticalVert[i]));
m_Device->CreateVertexBuffer(m_PointNum * 2 * sizeof(CLightVertex),D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC,
D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1,D3DPOOL_DEFAULT,&(m_VerticalVert2[i]));
if(m_LightningValue == LV_LIGHTNING)
SetVertexBuffer(i);
else if(m_LightningValue == LV_BEZIER) {
SetBezierBuffer(i,m_Bezier.m_iUvMode);
}
}
}
void CLightning::SetBezierBuffer(int index,int Wheelvalue) {
int i;
float s = 0.0f;
float t = 0.0f;
D3DXVECTOR3 camera_pos;
D3DXMATRIX view;
D3DXMATRIX invview;
D3DXVECTOR3 up_vec;
D3DXVECTOR3 vector1;
D3DXVECTOR3 vector2;
D3DXVECTOR3 vector3;
D3DXVECTOR3 vector4;
D3DXVECTOR3 vector5;
D3DXVECTOR3 tmp;
D3DXVECTOR3 tmp2;
D3DXVECTOR3 tmp3;
int nBuffer = 30;
int nPoint = m_BezierPointList.size();
// Buffer <20><><EFBFBD><EFBFBD> check
if(nPoint <= 1)
return;
if(nPoint > nBuffer)
return;
//<2F><><EFBFBD><EFBFBD> <20>÷<EFBFBD>
if(tmp_Vertex == NULL) {
tmp_Vertex = new CLightVertex[nBuffer * 2];
}
else
memset(tmp_Vertex,0,sizeof(CLightVertex) * nBuffer * 2);
// <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD>
if(m_PlaneValue > LPLANE_ONE) { // <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD> <20>̻<EFBFBD>
if(tmp_Vertex2 == NULL) {
tmp_Vertex2 = new CLightVertex[nBuffer * 2];
}
else {
memset(tmp_Vertex2,0,sizeof(CLightVertex) * nBuffer * 2);
}
if(tmp_Vertex3 == NULL) {
tmp_Vertex3 = new CLightVertex[nBuffer * 2];
}
else {
memset(tmp_Vertex3,0,sizeof(CLightVertex) * nBuffer * 2);
}
}
m_Device->GetTransform(D3DTS_VIEW,&view);
D3DXMatrixInverse(&invview,NULL,&view);
camera_pos.x = invview._41;
camera_pos.y = invview._42;
camera_pos.z = invview._43;
// up vector
up_vec.x = 0.0f;
up_vec.y = 1.0f;
up_vec.z = 0.0f;
for(i=0;i<nPoint * 2;i++) {
/*if(i >= ((nPoint * 2) -2)) { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD>
vector1 = m_BezierPointList[i / 2] - m_BezierPointList[ (i - 2) / 2 ];
}
else // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
vector1 = m_BezierPointList[(i + 2) / 2] - m_BezierPointList[(i/2)];
*/
vector1 = m_PointList[m_PointNum - 1] - m_PointList[0];
if(m_PlaneValue == LPLANE_ONE)
vector2 = camera_pos - m_BezierPointList[i/2];
else
vector2 = up_vec;// - m_PointList[i/2];
D3DXVec3Normalize(&vector1,&vector1);
D3DXVec3Normalize(&vector2,&vector2);
D3DXVec3Cross(&vector3,&vector1,&vector2);
D3DXVec3Normalize(&vector3,&vector3);
/* if(m_bBeforeBez) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EEBCB1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݴ<EFBFBD><DDB4><EFBFBD> <20>ٲ<EFBFBD><D9B2>鼭 cross vector<6F><72> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
float fBezDot = D3DXVec3Dot(&m_BeforeBezCross,&vector3);
if((fBezDot < -1.0f) && (m_Bezier.m_iAxis == 8))
m_bBezInv = true;
else
m_bBezInv = false;
}
else { // Before Bez Cross Not Setting
m_BeforeBezCross = vector3;
D3DXVec3Normalize(&m_BeforeBezCross,&m_BeforeBezCross);
m_bBeforeBez = true;
m_bBezInv = false;
}
*/
if(m_PlaneValue > LPLANE_ONE) {
vector5 = vector3 + vector2;
D3DXVec3Normalize(&vector5,&vector5);
vector4 = vector5;
vector5 = -vector3 + vector2;
D3DXVec3Normalize(&vector5,&vector5);
}
//vertex <20><><EFBFBD><EFBFBD>
if(!(i % 2)) {
tmp = m_BezierPointList[i/2] + vector3 * m_QuadHalfWidth;
if(m_PlaneValue > LPLANE_ONE) {
tmp2 = m_BezierPointList[i/2] + vector4 * m_QuadHalfWidth;
tmp3 = m_BezierPointList[i/2] + vector5 * m_QuadHalfWidth;
}
}
else {
tmp = m_BezierPointList[(i-1)/2] - vector3 * m_QuadHalfWidth;
if(m_PlaneValue > LPLANE_ONE) {
tmp2 = m_BezierPointList[(i-1)/2] - vector4 * m_QuadHalfWidth;
tmp3 = m_BezierPointList[(i-1)/2] - vector5 * m_QuadHalfWidth;
}
}
if(m_bFadeOut) {
m_Color = D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,m_Alpha);
m_Alpha -= m_FadeSpeed;
if(m_Alpha <=0) {
m_Alpha = 0.0f;
}
}
tmp_Vertex[i].x = tmp.x;
tmp_Vertex[i].y = tmp.y;
tmp_Vertex[i].z = tmp.z;
if(m_bCrash) { // <20><EFBFBD><E6B5B9>
m_Color = D3DCOLOR_ARGB(m_iAlpha,255,255,255);
}
tmp_Vertex[i].color = m_Color;
if(Wheelvalue == 0) { //Lightning Uv
switch(i % 4) { // texcoord <20><><EFBFBD><EFBFBD>
case 0:
tmp_Vertex[i].s = 0.0f;
tmp_Vertex[i].t = (i /2) + m_UvAni;
break;
case 1:
tmp_Vertex[i].s = 1.0f;
tmp_Vertex[i].t = (i /2) + m_UvAni;
break;
case 2:
tmp_Vertex[i].s = 0.0f;
tmp_Vertex[i].t = (i /2) + m_UvAni;
break;
case 3:
tmp_Vertex[i].s = 1.0f;
tmp_Vertex[i].t = (i /2) + m_UvAni;
break;
}
}
else { //wheel Uv
switch(i % 4) { // texcoord <20><><EFBFBD><EFBFBD>
case 0:
tmp_Vertex[i].s = 0.0f;
break;
case 1:
tmp_Vertex[i].s = 1.0f;
break;
case 2:
tmp_Vertex[i].s = 0.0f;
break;
case 3:
tmp_Vertex[i].s = 1.0f;
break;
}
tmp_Vertex[i].t = (1.0f/nPoint) * (int)(i/2);
}
/////
if(m_PlaneValue > LPLANE_ONE) {
tmp_Vertex2[i].x = tmp2.x;
tmp_Vertex2[i].y = tmp2.y;
tmp_Vertex2[i].z = tmp2.z;
tmp_Vertex2[i].color = m_Color;
tmp_Vertex3[i].x = tmp3.x;
tmp_Vertex3[i].y = tmp3.y;
tmp_Vertex3[i].z = tmp3.z;
tmp_Vertex3[i].color = m_Color;
if(Wheelvalue == 0) { //Lightning Uv
switch(i % 4) { // texcoord <20><><EFBFBD><EFBFBD>
case 0:
tmp_Vertex2[i].s = 0.0f;
tmp_Vertex2[i].t = (i /2) + m_UvAni;
tmp_Vertex3[i].s = 0.0f;
tmp_Vertex3[i].t = (i /2) + m_UvAni;
break;
case 1:
tmp_Vertex2[i].s = 1.0f;
tmp_Vertex2[i].t = (i /2) + m_UvAni;
tmp_Vertex3[i].s = 1.0f;
tmp_Vertex3[i].t = (i /2) + m_UvAni;
break;
case 2:
tmp_Vertex2[i].s = 0.0f;
tmp_Vertex2[i].t = (i /2) + m_UvAni;
tmp_Vertex3[i].s = 0.0f;
tmp_Vertex3[i].t = (i /2) + m_UvAni;
break;
case 3:
tmp_Vertex2[i].s = 1.0f;
tmp_Vertex2[i].t = (i /2) + m_UvAni;
tmp_Vertex3[i].s = 1.0f;
tmp_Vertex3[i].t = (i /2) + m_UvAni;
break;
}
}
else { //wheel Uv
switch(i % 4) { // texcoord <20><><EFBFBD><EFBFBD>
case 0:
tmp_Vertex2[i].s = 0.0f;
tmp_Vertex3[i].s = 0.0f;
break;
case 1:
tmp_Vertex2[i].s = 1.0f;
tmp_Vertex3[i].s = 1.0f;
break;
case 2:
tmp_Vertex2[i].s = 0.0f;
tmp_Vertex3[i].s = 0.0f;
break;
case 3:
tmp_Vertex2[i].s = 1.0f;
tmp_Vertex3[i].s = 1.0f;
break;
}
tmp_Vertex2[i].t = (1.0f/nPoint) * (int)(i/2);
tmp_Vertex3[i].t = (1.0f/nPoint) * (int)(i/2);
}
///////
}
}
//set buffer
VOID *tmp_buffer;
if(nPoint >= m_PointNum)
nPoint = m_PointNum;
m_Vert[index]->Lock(0,m_PointNum* sizeof(CLightVertex) * 2,(BYTE **)&tmp_buffer,D3DLOCK_DISCARD);
memcpy(tmp_buffer,tmp_Vertex,2 * nPoint * sizeof(CLightVertex));
m_Vert[index]->Unlock();
// delete[] tmp_Vertex;
// tmp_Vertex = NULL;
if(m_PlaneValue > LPLANE_ONE) {
VOID *tmp_buffer2;
m_VerticalVert[index]->Lock(0,m_PointNum * sizeof(CLightVertex) * 2,(BYTE **)&tmp_buffer2,D3DLOCK_DISCARD);
memcpy(tmp_buffer2,tmp_Vertex2,2 * nPoint * sizeof(CLightVertex));
m_VerticalVert[index]->Unlock();
// delete[] tmp_Vertex2;
// tmp_Vertex2 = NULL;
VOID *tmp_buffer3;
m_VerticalVert2[index]->Lock(0,m_PointNum * sizeof(CLightVertex) * 2,(BYTE **)&tmp_buffer3,D3DLOCK_DISCARD);
memcpy(tmp_buffer3,tmp_Vertex3,2 * nPoint * sizeof(CLightVertex));
m_VerticalVert2[index]->Unlock();
// delete[] tmp_Vertex3;
// tmp_Vertex3 = NULL;
}
m_MaxRenderCount = ((nPoint * 2)-3) + 1;
}
void CLightning::SetVertexBuffer(int index,int Wheelvalue) {
int i;
float s = 0.0f;
float t = 0.0f;
D3DXVECTOR3 camera_pos;
D3DXMATRIX view;
D3DXMATRIX invview;
D3DXVECTOR3 up_vec;
D3DXVECTOR3 vector1;
D3DXVECTOR3 vector2;
D3DXVECTOR3 vector3;
D3DXVECTOR3 vector4;
D3DXVECTOR3 tmp;
D3DXVECTOR3 tmp2;
//<2F><><EFBFBD><EFBFBD> <20>÷<EFBFBD>
if(tmp_Vertex == NULL)
tmp_Vertex = new CLightVertex[m_PointNum * 2];
// <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD>
if(m_PlaneValue > LPLANE_ONE) { // <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD> <20>̻<EFBFBD>
if(tmp_Vertex2 == NULL)
tmp_Vertex2 = new CLightVertex[m_PointNum * 2];
}
m_Device->GetTransform(D3DTS_VIEW,&view);
D3DXMatrixInverse(&invview,NULL,&view);
camera_pos.x = invview._41;
camera_pos.y = invview._42;
camera_pos.z = invview._43;
// up vector
up_vec.x = 0.0f;
up_vec.y = 1.0f;
up_vec.z = 0.0f;
for(i=0;i<m_PointNum * 2;i++) {
if(i >= ((m_PointNum *2) -2)) { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD>
/*D3DXVECTOR3 tmp_v = m_PointList[i/2] - m_PointList[(i-2)/2];
vector1 = (m_PointList[i/2] * 1.1f) - m_PointList[i/2];*/
vector1 = m_PointList[i/2] - m_PointList[(i-2)/2];
}
else // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
vector1 = m_PointList[(i + 2)/2] - m_PointList[i/2];
if(m_PlaneValue == LPLANE_ONE)
vector2 = camera_pos - m_PointList[i/2];
else
vector2 = up_vec;// - m_PointList[i/2];
D3DXVec3Normalize(&vector1,&vector1);
D3DXVec3Normalize(&vector2,&vector2);
D3DXVec3Cross(&vector3,&vector1,&vector2);
D3DXVec3Normalize(&vector3,&vector3);
if(m_PlaneValue > LPLANE_ONE) {
D3DXVec3Cross(&vector4,&vector1,&vector3);
D3DXVec3Normalize(&vector4,&vector4);
}
//vertex <20><><EFBFBD><EFBFBD>
if(!(i % 2)) {
tmp = m_PointList[i/2] + vector3 * m_QuadHalfWidth;
if(m_PlaneValue > LPLANE_ONE)
tmp2 = m_PointList[i/2] + vector4 * m_QuadHalfWidth;
}
else {
tmp = m_PointList[(i-1)/2] - vector3 * m_QuadHalfWidth;
if(m_PlaneValue > LPLANE_ONE)
tmp2 = m_PointList[(i-1)/2] - vector4 * m_QuadHalfWidth;
}
if(m_bFadeOut) {
m_Color = D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,m_Alpha);
m_Alpha -= m_FadeSpeed;
if(m_Alpha <=0) {
m_Alpha = 0.0f;
}
}
tmp_Vertex[i].x = tmp.x;
tmp_Vertex[i].y = tmp.y;
tmp_Vertex[i].z = tmp.z;
if(m_bCrash) { // <20><EFBFBD><E6B5B9>
m_Color = D3DCOLOR_ARGB(m_iAlpha,255,255,255);
}
tmp_Vertex[i].color = m_Color;
if(Wheelvalue == 0) { //Lightning Uv
switch(i % 4) { // texcoord <20><><EFBFBD><EFBFBD>
case 0:
tmp_Vertex[i].s = 0.0f;
tmp_Vertex[i].t = (i /2) + m_UvAni;
break;
case 1:
tmp_Vertex[i].s = 1.0f;
tmp_Vertex[i].t = (i /2) + m_UvAni;
break;
case 2:
tmp_Vertex[i].s = 0.0f;
tmp_Vertex[i].t = (i /2) + m_UvAni;
break;
case 3:
tmp_Vertex[i].s = 1.0f;
tmp_Vertex[i].t = (i /2) + m_UvAni;
break;
}
}
else { //wheel Uv
switch(i % 4) { // texcoord <20><><EFBFBD><EFBFBD>
case 0:
tmp_Vertex[i].s = 0.0f;
break;
case 1:
tmp_Vertex[i].s = 1.0f;
break;
case 2:
tmp_Vertex[i].s = 0.0f;
break;
case 3:
tmp_Vertex[i].s = 1.0f;
break;
}
tmp_Vertex[i].t = (1.0f/m_PointNum) * (int)(i/2);
}
/////
if(m_PlaneValue > LPLANE_ONE) {
tmp_Vertex2[i].x = tmp2.x;
tmp_Vertex2[i].y = tmp2.y;
tmp_Vertex2[i].z = tmp2.z;
tmp_Vertex2[i].color = m_Color;
if(Wheelvalue == 0) { //Lightning Uv
switch(i % 4) { // texcoord <20><><EFBFBD><EFBFBD>
case 0:
tmp_Vertex2[i].s = 0.0f;
tmp_Vertex2[i].t = (i /2) + m_UvAni;
break;
case 1:
tmp_Vertex2[i].s = 1.0f;
tmp_Vertex2[i].t = (i /2) + m_UvAni;
break;
case 2:
tmp_Vertex2[i].s = 0.0f;
tmp_Vertex2[i].t = (i /2) + m_UvAni;
break;
case 3:
tmp_Vertex2[i].s = 1.0f;
tmp_Vertex2[i].t = (i /2) + m_UvAni;
break;
}
}
else { //wheel Uv
switch(i % 4) { // texcoord <20><><EFBFBD><EFBFBD>
case 0:
tmp_Vertex2[i].s = 0.0f;
break;
case 1:
tmp_Vertex2[i].s = 1.0f;
break;
case 2:
tmp_Vertex2[i].s = 0.0f;
break;
case 3:
tmp_Vertex2[i].s = 1.0f;
break;
}
tmp_Vertex2[i].t = (1.0f/m_PointNum) * (int)(i/2);
}
///////
}
}
//set buffer
VOID *tmp_buffer;
m_Vert[index]->Lock(0,m_PointNum * sizeof(CLightVertex) * 2,(BYTE **)&tmp_buffer,0);
memcpy(tmp_buffer,tmp_Vertex,2 * m_PointNum * sizeof(CLightVertex));
m_Vert[index]->Unlock();
//delete[] tmp_Vertex;
if(m_PlaneValue > LPLANE_ONE) {
VOID *tmp_buffer2;
m_VerticalVert[index]->Lock(0,m_PointNum * sizeof(CLightVertex) * 2,(BYTE **)&tmp_buffer2,0);
memcpy(tmp_buffer2,tmp_Vertex2,2 * m_PointNum * sizeof(CLightVertex));
m_VerticalVert[index]->Unlock();
//delete[] tmp_Vertex2;
}
m_MaxRenderCount = ((m_PointNum * 2)-3) + 1;
}
// fade out <20>Ϸ<EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> true return
bool CLightning::GetEnd() {
if(m_Alpha <= 0.0f)
return true;
return false;
}
void CLightning::Render2(int blendmode) {
int k;
if( m_bSetEndEffect == true) { // wheel<65><6C> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> esf<73><66> middle effect<63><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(m_InsertCount >= 1) {
for(k = 0;k<m_PointNum / m_EndUnit;k++) // <20><><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> setting
InsertEmptyPoint(m_PointList[m_InsertCount - 1].x,m_PointList[m_InsertCount - 1].y,m_PointList[m_InsertCount - 1].z);
}
SetVertexBuffer(0,1);
}
D3DXMATRIX beforeworld;
DWORD zwrite,alphablend;
DWORD cullmode;
m_Device->GetTransform(D3DTS_WORLD,&beforeworld);
m_Device->GetRenderState(D3DRS_ZWRITEENABLE,&zwrite);
m_Device->GetRenderState(D3DRS_ALPHABLENDENABLE,&alphablend);
m_Device->GetRenderState(D3DRS_CULLMODE,&cullmode);
D3DXMATRIX world;
D3DXMatrixIdentity(&world);
m_Device->SetTransform(D3DTS_WORLD,&world);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
if(blendmode ==0) { // src alpha, dst one
CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
}
else if(blendmode == 1){ // src alpha,dst invsrc_alpha
CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
}
m_Device->SetTexture(0,m_Texture[0].GetTexture());
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_MAGFILTER,D3DTEXF_LINEAR);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_MINFILTER,D3DTEXF_LINEAR);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_COLOROP,D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_TEXTURE);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
//CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
for(int i=0;i<m_VertNum;i++) {
m_Device->SetStreamSource(0,m_Vert[i],sizeof(CLightVertex));
m_Device->SetVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
//m_Device->DrawPrimitive(D3DPT_LINESTRIP,0,(m_PointNum * 2) - 1);
if((m_InsertCount -1)>0)
m_Device->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,(m_InsertCount-1) * 2);
if(m_PlaneValue > LPLANE_ONE) { // <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD> <20>̻<EFBFBD><CCBB>϶<EFBFBD> (<28><><EFBFBD><EFBFBD>, X...)
m_Device->SetStreamSource(0,m_VerticalVert[i],sizeof(CLightVertex));
//m_Device->DrawPrimitive(D3DPT_LINESTRIP,0,(m_PointNum * 2) - 1);
if((m_InsertCount -1)>0)
m_Device->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,(m_InsertCount-1) * 2);
}
}
m_Device->SetTransform(D3DTS_WORLD,&beforeworld);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,zwrite);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,alphablend);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,cullmode);
}
void CLightning::Render(int blendmode) {
D3DXMATRIX world;
D3DXMATRIX src_world;
DWORD zwrite,alphablend;
D3DXMatrixIdentity(&world);
m_Device->GetTransform(D3DTS_WORLD,&src_world);
m_Device->GetRenderState(D3DRS_ZWRITEENABLE,&zwrite);
m_Device->GetRenderState(D3DRS_ALPHABLENDENABLE,&alphablend);
m_Device->SetTransform(D3DTS_WORLD,&world);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
if(blendmode ==0) { // src alpha, dst one
CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
}
else if(blendmode == 1){ // src alpha,dst invsrc_alpha
CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
}
//CSceneStateMgr::_SetD3DRenderState(D3DRS_DIFFUSEMATERIALSOURCE,D3DMCS_COLOR1);
m_Device->SetTexture(0,m_Texture[0].GetTexture());
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_MAGFILTER,D3DTEXF_LINEAR);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_MINFILTER,D3DTEXF_LINEAR);
//CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_MAGFILTER,D3DTEXF_ANISOTROPIC);
//CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_MINFILTER,D3DTEXF_ANISOTROPIC);
//CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_MAXANISOTROPY,16);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_COLOROP,D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_TEXTURE);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
for(int i=0;i<m_VertNum;i++) {
m_Device->SetStreamSource(0,m_Vert[i],sizeof(CLightVertex));
m_Device->SetVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
//m_Device->DrawPrimitive(D3DPT_LINESTRIP,0,(m_PointNum * 2) - 1);
if(m_LightningValue == LV_BEZIER) {
if((m_InsertCount -1)>0)
m_Device->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,(m_InsertCount-1) * 2);
}
else
if(m_RenderCount > 0)
m_Device->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,m_RenderCount);
if(m_PlaneValue > LPLANE_ONE) { // <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD> <20>̻<EFBFBD><CCBB>϶<EFBFBD> (<28><><EFBFBD><EFBFBD>, X...)
m_Device->SetStreamSource(0,m_VerticalVert[i],sizeof(CLightVertex));
if(m_LightningValue == LV_BEZIER) {
if((m_InsertCount -1)>0) {
m_Device->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,(m_InsertCount-1) * 2);
m_Device->SetStreamSource(0,m_VerticalVert2[i],sizeof(CLightVertex));
m_Device->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,(m_InsertCount-1) * 2);
}
}
else
if(m_RenderCount > 0)
//m_Device->DrawPrimitive(D3DPT_LINESTRIP,0,(m_PointNum * 2) - 1);
m_Device->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,m_RenderCount);
}
}
m_Device->SetTransform(D3DTS_WORLD,&src_world);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,zwrite);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,alphablend);
}
D3DXVECTOR3 CLightning::GetBezierLastPos() {
int iSize = m_BezierPointList.size();
if(iSize > 0)
return m_BezierPointList[iSize - 1];
else
return D3DXVECTOR3(0.0f,0.0f,0.0f);
}
bool CLightning::UpdateLightning(D3DXVECTOR3 &pos,bool bCrash) {
int i;
bool bBezierReturn = false;
m_RenderCount++;
m_UvAni += m_UnitUv;
m_bCrash = bCrash; // <20><20><><EFBFBD><EFBFBD>
for(i=0;i<m_VertNum;i++) {
if(m_LightningValue == LV_LIGHTNING) {
SetRandPoint();
SetVertexBuffer(i);
}
else if(m_LightningValue == LV_BEZIER) {
bBezierReturn = SetBezierPoint();
SetBezierBuffer(i,m_Bezier.m_iUvMode);
int nPoint = m_BezierPointList.size();
if(nPoint > 1) {
pos.x = m_BezierPointList[nPoint - 1].x;
pos.y = m_BezierPointList[nPoint - 1].y;
pos.z = m_BezierPointList[nPoint - 1].z;
}
else {
pos.x = m_PointList[0].x;
pos.y = m_PointList[0].y;
pos.z = m_PointList[0].z;
}
}
}
if(m_LightningValue == LV_LIGHTNING) {
if(m_RenderCount > m_MaxRenderCount) {
m_RenderCount--;
return true;
}
return false;
}
else if(m_LightningValue == LV_BEZIER){
return bBezierReturn;
}
return false;
}
void CLightning::SetColor() {
m_Color = D3DCOLOR_ARGB(255,
rand() % 256,
rand() % 256,
rand() % 256);
}