//------------------------------------------------------------------------------------------------------ RotatingRing::RotatingRing() :LocatableObject( this ), m_isMaked(false), m_pRingBuffer(NULL), m_fRadius(0) { float bs = 1.5 * 1; m_BindBox = aabbox3df( vector3f( -bs, -bs, -bs ), vector3f( bs, bs, bs ) ); m_isMaked = true; m_fRadius = 1; ASSERT( 3 == RC_AXIS ); VertexColor LineVertex[ RC_AXIS * RC_POINT ]; static ushort Indies[RC_AXIS*RC_POINT*2]; for ( int i = 0 ; i < RC_AXIS*RC_POINT*2; i += 2 ) { Indies[i] = i/2; //Indies[i+1] = (i/2)%RC_POINT==0&&0!=i ? i-RC_POINT*2 : i/2+1 ; if ( i/2 == RC_POINT-1 || i/2 == RC_POINT*2-1 || i/2 == RC_POINT*3-1 ) { Indies[i+1] = i/2-RC_POINT+1; } else { Indies[i+1] = i/2+1; } } m_pRingBuffer = NEW RendBuffer( Device::RM_LINES ); m_pVertexBuffer = NEW VertexBuffer( Device::MU_DYNAMIC ); m_pIndicesBuffer = NEW IndicesBuffer( Device::MU_STATIC ); m_pRingBuffer->SetVertexBuffer( m_pVertexBuffer ); m_pRingBuffer->SetIndicesBuffer( m_pIndicesBuffer ); m_pIndicesBuffer->FlushIndiesBuffer( RC_AXIS*RC_POINT*2, Indies ); }
//------------------------------------------------------------------------------------------------------ GridNode::GridNode(void) :m_pRendBuffer(NULL) { m_pRendBuffer = NEW RendBuffer( Device::RM_LINES ); m_pVertexBuffer = NEW VertexBuffer( Device::MU_DYNAMIC ); m_pIndicesBuffer = NEW IndicesBuffer( Device::MU_DYNAMIC ); m_pRendBuffer->SetVertexBuffer( m_pVertexBuffer ); m_pRendBuffer->SetIndicesBuffer( m_pIndicesBuffer ); }
////////////////////////////// // BillboardNode // ///////////////////////////// //------------------------------------------------------------------------------------- BillboardNode::BillboardNode() :m_pTexture(NULL) { ushort Indies[Billboard::COUNT_OF_INDIES]={0,1,2, 2,1,3}; m_pRendBuffer = NEW RendBuffer( Billboard::GetRenderMode() ); m_pVertexBuffer = NEW VertexBuffer( Device::MU_DYNAMIC ); m_pIndicesBuffer = NEW IndicesBuffer( Device::MU_STATIC ); m_pRendBuffer->SetVertexBuffer( m_pVertexBuffer ); m_pRendBuffer->SetIndicesBuffer( m_pIndicesBuffer ); m_pIndicesBuffer->FlushIndiesBuffer( Billboard::COUNT_OF_INDIES, &Indies[0] ); }
//------------------------------------------------------------------------------------------------------ void Rect2D::NewRect2D() { m_pVertexArray = NEW VertexColor[COUNT_OF_VERTEX]; static ushort Indies[COUNT_OF_INDIES]={0,1, 1,2, 2,3, 3,0}; m_pRendBuffer = NEW RendBuffer( Device::RM_LINES ); m_pVertexBuffer = NEW VertexBuffer( Device::MU_DYNAMIC ); m_pIndicesBuffer = NEW IndicesBuffer( Device::MU_STATIC ); m_pRendBuffer->SetVertexBuffer( m_pVertexBuffer ); m_pRendBuffer->SetIndicesBuffer( m_pIndicesBuffer ); m_pIndicesBuffer->FlushIndiesBuffer( COUNT_OF_INDIES, &Indies[0] ); }
//------------------------------------------------------------------------------------------------------ LineNode::LineNode( const vector4f& b, const vector4f& e, const Color& c ) { m_BindBox.Contains( vector3f(b) ); m_BindBox.Contains( vector3f(e) ); m_pVertexArray = NEW VertexColor[COUNT_OF_VERTEX]; m_pVertexArray[0].SetVertex( b ); m_pVertexArray[0].SetColor( c ); m_pVertexArray[1].SetVertex( e ); m_pVertexArray[1].SetColor( c ); static ushort Indies[COUNT_OF_INDIES]={0,1}; m_pRendBuffer = NEW RendBuffer( Device::RM_LINE_STRIP ); m_pVertexBuffer = NEW VertexBuffer( Device::MU_DYNAMIC ); m_pIndicesBuffer = NEW IndicesBuffer( Device::MU_STATIC ); m_pRendBuffer->SetVertexBuffer( m_pVertexBuffer ); m_pRendBuffer->SetIndicesBuffer( m_pIndicesBuffer ); m_pVertexBuffer->FlushVertexBuffer( COUNT_OF_VERTEX, m_pVertexArray ); m_pIndicesBuffer->FlushIndiesBuffer( COUNT_OF_INDIES, &Indies[0] ); }
//------------------------------------------------------------------------------------------------------- RendBuffer* StringManager::_AllocBuffer() { if( 0 != m_FreeBufferList.size() ) { RendBufferList::iterator it = m_FreeBufferList.begin(); RendBuffer* reslut = (*it); m_FreeBufferList.erase( it ); return reslut; } static ushort Indies[BString::COUNT_OF_INDIES]= {0,1,2,3}; RendBuffer* rb; VertexBuffer* vb; IndicesBuffer* ib; rb = NEW RendBuffer(Device::RM_TRIANGLE_STRIP); vb = NEW VertexBuffer( Device::MU_DYNAMIC ); ib = NEW IndicesBuffer( Device::MU_STATIC ); rb->SetVertexBuffer( vb ); rb->SetIndicesBuffer( ib ); ib->FlushIndiesBuffer( BString::COUNT_OF_INDIES, &Indies[0] ); return rb; }
//------------------------------------------------------------------------------------------------------ Rect3D::Rect3D(const vector3f& ulb, const vector3f& drf, const Color& color) { m_pVertexArray = NEW VertexColor[COUNT_OF_VERTEX]; m_pVertexArray[0] = VertexColor( vector4f(ulb.m_x, ulb.m_y, drf.m_z), color ) ; m_pVertexArray[1] = VertexColor( vector4f(drf.m_x, ulb.m_y, drf.m_z), color ) ; m_pVertexArray[2] = VertexColor( vector4f(drf.m_x, drf.m_y, drf.m_z), color ) ; m_pVertexArray[3] = VertexColor( vector4f(ulb.m_x, drf.m_y, drf.m_z), color ) ; m_pVertexArray[4] = VertexColor( vector4f(ulb.m_x, ulb.m_y, ulb.m_z), color ) ; m_pVertexArray[5] = VertexColor( vector4f(drf.m_x, ulb.m_y, ulb.m_z), color ) ; m_pVertexArray[6] = VertexColor( vector4f(drf.m_x, drf.m_y, ulb.m_z), color ) ; m_pVertexArray[7] = VertexColor( vector4f(ulb.m_x, drf.m_y, ulb.m_z), color ) ; static ushort Indies[COUNT_OF_INDIES]={ 0,1, 1,2, 2,3, 3,0, 0,4, 1,5, 2,6, 3,7, 4,5, 5,6, 6,7, 7,4}; m_pRendBuffer = NEW RendBuffer( Device::RM_LINES ); m_pVertexBuffer = NEW VertexBuffer( Device::MU_DYNAMIC ); m_pIndicesBuffer = NEW IndicesBuffer( Device::MU_STATIC ); m_pRendBuffer->SetVertexBuffer( m_pVertexBuffer ); m_pRendBuffer->SetIndicesBuffer( m_pIndicesBuffer ); m_pVertexBuffer->FlushVertexBuffer( COUNT_OF_VERTEX, m_pVertexArray ); m_pIndicesBuffer->FlushIndiesBuffer( COUNT_OF_INDIES, &Indies[0] ); }
//-------------------------------------------------------------------------------------------------------------------------------------- Emitter::Emitter(const vector3f& pos, const vector3f& posNoise, const vector3f& dir, const vector3f& acce, const vector2f& speedPmill, float endspeed, const vector3f& angle, const Color& begin1, const Color& begin2, const Color& end1, const Color& end2, const vector2f& clrpow, const vector2d& life, const vector2f& alphaPow, const vector2f& sizebegin, const vector2f& sizeend, const vector2f& sizepow, const vector2d& countSec, const int emitterlife, std::string texName) :ISceneNode( ISceneNode::RS_TRANSPARENT ), LocatableObject( this ), m_PositionNoise(posNoise), m_Speed(speedPmill), m_Direction(dir), m_Acceleration(acce), m_Angle(angle), m_BeginColorA(begin1), m_BeginColorB(begin2), m_EndColorA(end1), m_EndColorB(end2), m_LifeSpan(life), m_BeginSize(sizebegin), m_EndSize(sizeend), m_CountSec(countSec), m_uTimeSpan(0), m_uLifedTime(0), m_ActiveTime(0), m_EmitterLife(emitterlife), m_isEmit(true), m_isForceStop(false), m_isInview(false), m_ColorPow(clrpow), m_AlphaPow(alphaPow), m_SizePow(sizepow), m_EndSpeed(endspeed), m_fResistance(((endspeed / speedPmill.m_y) - 1.0f )/static_cast<float>(life.m_y)) { SetLocalPosition( pos ); m_Direction.NormalizeSelf(); float maxlife = Math::GetMax(life.m_x, life.m_y); float maxcount = Math::GetMax(countSec.m_x, countSec.m_y); //int maxParticle = static_cast<int>( ( ceil(TO_SEC( maxlife )) ) * maxcount ); int maxParticle = 0; if ( -1 != emitterlife ) { maxParticle = static_cast<int>( ( TO_SEC( emitterlife ) ) * ( TO_SEC( maxlife ) ) * maxcount ); } else { maxParticle = static_cast<int>( ( TO_SEC( maxlife ) ) * maxcount ); } m_ArraySize = maxParticle; m_Index.SetMax(maxParticle); m_pParticle = NEW Particle_ColorSizeForce[maxParticle+1];//此处分配的时候一定要多分配一个,防止glEnableVertexAttribArray越界访问,造成堆栈损坏 m_pRendBuffer = NEW RendBuffer( Device::RM_POINTS ); m_pVertexBuffer = NEW VertexBuffer( Device::MU_DYNAMIC ); m_pRendBuffer->SetVertexBuffer( m_pVertexBuffer ); m_pVertexBuffer->FlushVertexBuffer( m_ArraySize, &m_pParticle[0] ); //ushort* indies = NEW ushort[maxParticle]; //for ( int i = 0;i < maxParticle ; i ++ ) //{ // indies[i] = i; //} //m_pRendBuffer->MakeIndiesBuffer(indies, maxParticle, Device::MU_STATIC); //SAFE_DELETE_ARRAY(indies); //m_Tex = NEW Texture2D(); //m_Tex->LoadTexture( Device::PF_A8, texName); m_isBeginChangeColor = m_BeginColorA == m_BeginColorB ? false : true; m_isEndChangeColor = m_EndColorA == m_EndColorB ? false : true; //材质 m_pMaterial = NEW Material; m_pMaterial->SetNode( this ); m_pMaterial->SetShader( Pipeline::PT_LIGHTING, ShaderManage::ParticleShader ); m_pMaterial->LoadTexture( Material::ATT_TEX_DIFFUSE, Device::PF_R8G8B8A8, texName ); m_pMaterial->GetDrawState( Pipeline::PT_LIGHTING ).m_isDepthMask = false; m_pMaterial->GetAlpahState( Pipeline::PT_LIGHTING ).m_isAlphaEnable = true; //计算绑定盒子 //由于喷射角度关系,绑定盒子很难精确计算,将采用随机测试的方法在编辑器中输出 }