public func Advance() { // Letzten Vertex ermitteln var iLastVertex = GetVertexNum() - 1; // Einschlag im Boden if (GBackSemiSolid(GetVertex(iLastVertex, 0) - GetX(), GetVertex(iLastVertex, 1) - GetY())) return(Remove()); // Schon über fünf Schritte fortgeschritten: Schaden an Objekten verursachen if (iLastVertex > 5) BlastObjects(GetVertex(iLastVertex, 0), GetVertex(iLastVertex, 1), 3); // Neuen Schritt durchführen if (Not(AddVertex(GetVertex(iLastVertex, 0) + Local(0) + Random(Local(1)), GetVertex(iLastVertex, 1) + Local(2) + Random(Local(3)) ))) return(Remove()); // Anziehung an ein Zielobjekt prüfen var pTarget; iLastVertex = GetVertexNum() - 1; if (iLastVertex > 7) if (pTarget = FindObject( 0, GetVertex(iLastVertex, 0) - GetX() - 50, GetVertex(iLastVertex, 1) - GetY() - 50, 100, 100, OCF_AttractLightning() )) Attraction(pTarget); }
bool cVertexBufferOGL::Compile(tVertexCompileFlag aFlags) { if(aFlags & eVertexCompileFlag_CreateTangents) { mbTangents = true; mVertexFlags |= eVertexFlag_Texture1; int idx = cMath::Log2ToInt((int)eVertexFlag_Texture1); int lSize = GetVertexNum()*4; mvVertexArray[idx].resize(lSize); cMath::CreateTriTangentVectors(&(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Texture1)][0]), &mvIndexArray[0], GetIndexNum(), &(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Position)][0]), kvVertexElements[cMath::Log2ToInt((int)eVertexFlag_Position)], &(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Texture0)][0]), &(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Normal)][0]), GetVertexNum() ); } return true; }
void cVertexBufferVBO::Transform(const cMatrixf &a_mtxTransform) { float *pPosArray = GetArray(eVertexFlag_Position); float *pNormalArray = GetArray(eVertexFlag_Normal); float *pTangentArray = NULL; if(mbTangents)pTangentArray = GetArray(eVertexFlag_Texture1); int lVtxNum = GetVertexNum(); cMatrixf mtxRot = a_mtxTransform.GetRotation(); int lVtxStride = kvVertexElements[cMath::Log2ToInt(eVertexFlag_Position)]; int lOffset = GetVertexNum()*4; for(int i=0; i<lVtxNum; i++) { float* pPos = &pPosArray[i*lVtxStride]; float* pNorm = &pNormalArray[i*3]; float* pTan = NULL; if(mbTangents)pTan = &pTangentArray[i*4]; cVector3f vPos = cMath::MatrixMul(a_mtxTransform, cVector3f(pPos[0],pPos[1],pPos[2])); pPos[0] = vPos.x; pPos[1] = vPos.y; pPos[2] = vPos.z; if(mbHasShadowDouble){ float* pExtraPos = &pPosArray[i*lVtxStride + lOffset]; pExtraPos[0] = vPos.x; pExtraPos[1] = vPos.y; pExtraPos[2] = vPos.z; } cVector3f vNorm = cMath::MatrixMul(mtxRot, cVector3f(pNorm[0],pNorm[1],pNorm[2])); vNorm.Normalise(); pNorm[0] = vNorm.x; pNorm[1] = vNorm.y; pNorm[2] = vNorm.z; if(mbTangents){ cVector3f vTan = cMath::MatrixMul(mtxRot, cVector3f(pTan[0],pTan[1],pTan[2])); vTan.Normalise(); pTan[0] = vTan.x; pTan[1] = vTan.y; pTan[2] = vTan.z; } } if(mbCompiled) { if(mbTangents) UpdateData(eVertexFlag_Position | eVertexFlag_Normal | eVertexFlag_Texture1,false); else UpdateData(eVertexFlag_Position | eVertexFlag_Normal,false); } }
void TerrainRenderable::MakeVertexBuffer() { auto device = Globals::GetDevice()->GetDeviceD3D9(); int n=GetVertexNum(); HRESULT res = device->CreateVertexBuffer(n * sizeof(TerrainVertex), D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &m_pVB, 0); if (res != S_OK) ReportErr("Terrain CreateVB Failed"); TerrainVertex* v = 0; int idx=0; m_pVB->Lock(0, 0, (void**)&v, 0); for (int y = 0; y < terrain_h; ++y) { for (int x = 0; x < terrain_w; ++x) { float posx=x; float posz=y; ConvertPos(posx,posz); m_VertexData.push_back(TerrainVertex(posx, m_pHeightField->GetHeight(x,y), posz, (float)x / terrain_w, (float)y / terrain_h)); //v[idx++]=TerrainVertex(x*vertex_stride - orgX_Offset, GetTerrainHeight(x,y), y*vertex_stride - orgY_Offset, (float)x / terrain_w, (float)y / terrain_h); } } TerrainVertex* first=&(m_VertexData[0]); memcpy_s(v,n*sizeof(TerrainVertex),first,n*sizeof(TerrainVertex)); m_pVB->Unlock(); }
void XPolyline::SetUnit(const int& unit) { if(this->m_Unit == UNIT_NONE|| m_Unit == unit) { m_Unit = unit; return; } int i; int num = GetVertexNum(); switch(m_Unit)// suppose only two type unit(inch and mm) { case UNIT_MM: if(unit == UNIT_INCH) { for(i =0; i < num; i++) { m_Point[i]/=25.4; } } break; case UNIT_INCH: if(unit == UNIT_MM) { for(i =0; i < num; i++) { m_Point[i]*=25.4; } } break; default: ; } m_bObjChanged = true; }
iVertexBuffer* cVertexBufferOGL::CreateCopy(eVertexBufferUsageType aUsageType) { cVertexBufferOGL *pVtxBuff = hplNew( cVertexBufferOGL,(mpLowLevelGraphics, mVertexFlags,mDrawType,aUsageType, GetVertexNum(),GetIndexNum()) ); //Copy the vertices to the new buffer. for(int i=0; i < klNumOfVertexFlags; i++) { if(kvVertexFlags[i] & mVertexFlags) { int lElements = kvVertexElements[i]; if(mbTangents && kvVertexFlags[i] == eVertexFlag_Texture1) lElements=4; pVtxBuff->ResizeArray(kvVertexFlags[i], (int)mvVertexArray[i].size()); memcpy(pVtxBuff->GetArray(kvVertexFlags[i]), &mvVertexArray[i][0], mvVertexArray[i].size() * sizeof(float)); } } //Copy indices to the new buffer pVtxBuff->ResizeIndices(GetIndexNum()); memcpy(pVtxBuff->GetIndices(), GetIndices(), GetIndexNum() * sizeof(unsigned int) ); pVtxBuff->mbTangents = mbTangents; pVtxBuff->mbHasShadowDouble = mbHasShadowDouble; pVtxBuff->Compile(0); return pVtxBuff; }
/* * @brief */ static void EmitFaceVertexes(node_t *node, face_t *f) { winding_t *w; int32_t i; if (f->merged || f->split[0] || f->split[1]) return; w = f->w; for (i = 0; i < w->num_points; i++) { if (noweld) { // make every point unique if (d_bsp.num_vertexes == MAX_BSP_VERTS) Com_Error(ERR_FATAL, "MAX_BSP_VERTS\n"); superverts[i] = d_bsp.num_vertexes; VectorCopy(w->points[i], d_bsp.vertexes[d_bsp.num_vertexes].point); d_bsp.num_vertexes++; c_uniqueverts++; c_totalverts++; } else superverts[i] = GetVertexNum(w->points[i]); } num_superverts = w->num_points; // this may fragment the face if > MAXEDGES FaceFromSuperverts(node, f, 0); }
// Returns whether the object has a vertex with the given CNAT value global func HasCNAT(int cnat) { for (var i = -1; i < GetVertexNum(); i++) if (GetVertex(i, VTX_CNAT) == cnat) return true; return false; }
// Returns the number of stuck vertices. (of this) global func VerticesStuckSemi() { var vertices = 0; // Loop through vertices. for (var i = -1; i < GetVertexNum(); i++) // Solid? if (GBackSemiSolid(GetVertex(i, VTX_X), GetVertex(i, VTX_Y))) // Count vertices. vertices++; return vertices; }
cBoundingVolume cVertexBufferOGL::CreateBoundingVolume() { cBoundingVolume bv; int lNum = cMath::Log2ToInt((int)eVertexFlag_Position); bv.AddArrayPoints(&(mvVertexArray[lNum][0]), GetVertexNum()); bv.CreateFromPoints(kvVertexElements[cMath::Log2ToInt(eVertexFlag_Position)]); return bv; }
// e.g. clonk->SetVertexCNAT(k, CNAT_CollideHalfVehicle, true); for k != 2 makes the clonk behave correctly wrt. to HalfVehicle global func SetVertexCNAT(int vtx, int val, bool set) { if (val == nil || set == nil) return FatalError("this function requires its second and third parameter to be non-nil"); if (!this) return FatalError("this function requires object context"); if (vtx == nil) for (var i = GetVertexNum(); i-->0;) SetVertexCNAT(i, val, set); else SetVertex(vtx, VTX_CNAT, GetVertex(vtx, VTX_CNAT) & ~val | (set && val), 2); }
private func Timer() { // Positionen var x0 = GetX(GetActionTarget(1)), y0 = GetY(GetActionTarget(1)), x1 = GetX(GetActionTarget(0)), y1 = GetY(GetActionTarget(0)); // Einzelne Vertexe mit Partikeln verschönern var i=0; var iVtxNum = GetVertexNum(); while(i<iVtxNum) { SetVertex(i, 0, (x0+(x1-x0)*i/iVtxNum)+RandomX(5,-5)); SetVertex(i, 1, (y0+(y1-y0)*i/iVtxNum)+RandomX(5,-5)); DrawParticleLine ("LightningSpark", GetVertex(i)-GetX(), GetVertex(i, 1)-GetY(), GetVertex(i+1)-GetX(), GetVertex(i+1,1)-GetY(), 6, 60, RGB(250,0,0), RGB(250,0,0)); DrawParticleLine ("BloodSpark", GetVertex(i)-GetX(), GetVertex(i, 1)-GetY(), GetVertex(i+1)-GetX(), GetVertex(i+1,1)-GetY(), 3, 25, RGB(250,100,100), RGB(250,100,100)); i++; } }
void TerrainRenderablePlane::MakeVertexBuffer() { auto device = Globals::GetDevice()->GetDeviceD3D9(); int n = GetVertexNum(); HRESULT res = device->CreateVertexBuffer(n * sizeof(TerrainVertex), D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &m_pVB, 0); if (res != S_OK) ReportErr("Terrain CreateVB Failed"); TerrainVertex* v = 0; int idx = 0; m_pVB->Lock(0, 0, (void**)&v, 0); m_VertexData.push_back(TerrainVertex(0 - w / 2, 0 , 0 - h / 2, 0, 0)); m_VertexData.push_back(TerrainVertex(0 - w / 2, 0 , h - h / 2, 0, 1)); m_VertexData.push_back(TerrainVertex(w - w / 2, 0 , h - h / 2, 1, 1)); m_VertexData.push_back(TerrainVertex(w - w / 2, 0 , 0 - h / 2, 1, 0)); TerrainVertex* first = &(m_VertexData[0]); memcpy_s(v, n*sizeof(TerrainVertex), first, n*sizeof(TerrainVertex)); m_pVB->Unlock(); }
void XPolyline::UpdateBndBox() { if(m_bObjChanged) { m_BndBox.Reset(); int Num = GetVertexNum(); for(int i = 0; i < Num; i++) { m_BndBox.AddVertex( m_Point[i] ); } PNT & min = m_BndBox.GetMin(); PNT & max = m_BndBox.GetMax(); for(int i=0;i<3;i++) { if(max[2]-min[2]<0.1) { min[i] -= 0.05; max[i] += 0.05; } } m_bObjChanged = false; } }
void TerrainRenderable::Render(HippoD3d9Device* pdevice, unsigned int escapeTime) { auto d3d9device = pdevice->GetDeviceD3D9(); //*d3d9device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);*/ //world matrix D3DXMATRIX tmpMatrix; D3DXMatrixMultiply(&tmpMatrix, &m_local_matrix, m_parent->GetWorldTransform()); HRESULT v = m_fxhandle->SetMatrix("g_mWorld", &tmpMatrix); //wvp matrix auto proj = Globals::GetRender()->GetProjMatrix(); auto view = Globals::GetRender()->GetViewMatrix(); D3DXMATRIX vp = (*view)*(*proj); v = m_fxhandle->SetMatrix("g_mViewProjection", &vp); //camera const D3DXVECTOR3* pos=Globals::GetCurrentCamera()->GetPos(); v = m_fxhandle->SetValue("g_camera_pos", pos, sizeof(D3DXVECTOR3)); //texture v = m_fxhandle->SetTexture("g_DiffuseTex", m_pTextrue[0]); v = m_fxhandle->SetTexture("g_DetailTex", m_pTextrue[1]); v = m_fxhandle->SetTexture("g_NormalTex", m_pTextrue[2]); //tower info const GameEntityPtrCon& con = Globals::GetWorld()->GetAllTower(); GameEntityPtrCon::const_iterator itr = con.begin(); GameEntityPtrCon::const_iterator itrend = con.end(); D3DXVECTOR4 tmp[2]; int idx = 0; while (itr != itrend) { auto towerptr = (TowerEntity*)itr->get(); D3DXVECTOR3* pos = towerptr->GetPos(); float r = towerptr->GetRange(); tmp[idx] = D3DXVECTOR4(pos->x, pos->y, pos->z, r); ++itr; ++idx; } v=m_fxhandle->SetVectorArray("towerInfo", tmp, 2); //robot info auto robot=Globals::GetWorld()->GetPlayer(); D3DXVECTOR4 robotpos = D3DXVECTOR4(robot->GetPos()->x, robot->GetPos()->z, 2, 1); v=m_fxhandle->SetVector("robotInfo", &robotpos); d3d9device->SetStreamSource(0, m_pVB, 0, sizeof(TerrainVertex)); d3d9device->SetVertexDeclaration(m_pVertexDecl); d3d9device->SetIndices(m_pIB); UINT iPass, totalPasses; m_fxhandle->Begin(&totalPasses, 0); for (iPass = 0; iPass < totalPasses; iPass++) { m_fxhandle->BeginPass(iPass); //d3d9device->DrawPrimitive(D3DPT_POINTLIST, // 0, // 将要绘制的索引缓冲区的起始地址 // GetVertexNum()); // 绘制的图元数量 d3d9device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, // 将要绘制的索引缓冲区的起始地址 0, // 索引数组中最小的索引值 GetVertexNum(), // 要绘制的索引数组中的顶点数量 0, // 从索引数组中的第几个元素开始绘制图元 GetTriangleNum()); // 绘制的图元数量 m_fxhandle->EndPass(); } m_fxhandle->End(); return; //patch auto pthitr = m_all_patch.begin(); while (pthitr != m_all_patch.end()) { auto patch_fx = (*pthitr)->GetPatchFx(); auto patch_ib = (*pthitr)->GetIB(); int tri_count = (*pthitr)->GetIndexCount() / 3; d3d9device->SetStreamSource(0, m_pVB, 0, sizeof(TerrainVertex)); d3d9device->SetVertexDeclaration(m_pVertexDecl); HRESULT v = d3d9device->SetIndices(patch_ib); v=patch_fx->SetMatrix("g_mWorld", &tmpMatrix); v = patch_fx->SetMatrix("g_mViewProjection", &vp); v = patch_fx->SetValue("g_camera_pos", pos, sizeof(D3DXVECTOR3)); UINT totalPasses; v=patch_fx->Begin(&totalPasses, 0); v = patch_fx->BeginPass(0); v = d3d9device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, // 将要绘制的索引缓冲区的起始地址 0, // 索引数组中最小的索引值 GetVertexNum(), // 要绘制的索引数组中的顶点数量 0, // 从索引数组中的第几个元素开始绘制图元 tri_count); // 绘制的图元数量 v = patch_fx->EndPass(); ++pthitr; } }
bool cVertexBufferVBO::Compile(tVertexCompileFlag aFlags) { if(mbCompiled) return false; mbCompiled = true; //Create tangents if(aFlags & eVertexCompileFlag_CreateTangents) { mbTangents = true; mVertexFlags |= eVertexFlag_Texture1; int idx = cMath::Log2ToInt((int)eVertexFlag_Texture1); int lSize = GetVertexNum()*4; mvVertexArray[idx].resize(lSize); cMath::CreateTriTangentVectors(&(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Texture1)][0]), &mvIndexArray[0], GetIndexNum(), &(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Position)][0]), kvVertexElements[cMath::Log2ToInt((int)eVertexFlag_Position)], &(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Texture0)][0]), &(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Normal)][0]), GetVertexNum() ); } GLenum usageType = GL_STATIC_DRAW_ARB; if(mUsageType== eVertexBufferUsageType_Dynamic) usageType = GL_DYNAMIC_DRAW_ARB; else if(mUsageType== eVertexBufferUsageType_Stream) usageType = GL_STREAM_DRAW_ARB; //Create the VBO vertex arrays for(int i=0;i< klNumOfVertexFlags; i++) { if(mVertexFlags & kvVertexFlags[i]) { glGenBuffersARB(1,(GLuint *)&mvArrayHandle[i]); glBindBufferARB(GL_ARRAY_BUFFER_ARB, mvArrayHandle[i]); glBufferDataARB(GL_ARRAY_BUFFER_ARB, mvVertexArray[i].size()*sizeof(float), &(mvVertexArray[i][0]), usageType); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); //Log("%d-Handle: %d, size: %d \n",i,mvArrayHandle[i], mvVertexArray); } } //Create the VBO index array glGenBuffersARB(1,(GLuint *)&mlElementHandle); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,mlElementHandle); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GetIndexNum()*sizeof(unsigned int), &mvIndexArray[0], usageType); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,0); //Log("VBO compile done!\n"); return true; }
void TerrainRenderablePlane::Render(HippoD3d9Device* pdevice, unsigned int escapeTime) { auto d3d9device = pdevice->GetDeviceD3D9(); //d3d9device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); //world matrix D3DXMATRIX tmpMatrix; D3DXMatrixMultiply(&tmpMatrix, &m_local_matrix, m_parent->GetWorldTransform()); HRESULT v = m_fxhandle->SetMatrix("g_mWorld", &tmpMatrix); //wvp matrix auto proj = Globals::GetRender()->GetProjMatrix(); auto view = Globals::GetRender()->GetViewMatrix(); D3DXMATRIX vp = (*view)*(*proj); v = m_fxhandle->SetMatrix("g_mViewProjection", &vp); //camera const D3DXVECTOR3* pos = Globals::GetCurrentCamera()->GetPos(); v = m_fxhandle->SetValue("g_camera_pos", pos, sizeof(D3DXVECTOR3)); //material D3DXCOLOR vWhite = D3DXCOLOR(0.5, 0.3, 0.2, 1); v = m_fxhandle->SetValue("g_MaterialDiffuseColor", &vWhite, sizeof(D3DXCOLOR)); //texture v = m_fxhandle->SetTexture("g_MeshTexture", m_pTextrue[0]); //tower info auto alltowers = Globals::GetWorld()->GetAllTower(); auto itr = alltowers.begin(); D3DXVECTOR4 tmp[2]; int idx = 0; while (itr != alltowers.end()) { TowerEntity* pEntity = (TowerEntity*)((*itr).get()); D3DXVECTOR3* pos = pEntity->GetPos(); float r = pEntity->GetRange(); tmp[idx] = D3DXVECTOR4(pos->x, pos->y, pos->z, r); ++itr; ++idx; } v = m_fxhandle->SetVectorArray("towerInfo", tmp, 2); //robot info auto player = Globals::GetWorld()->GetPlayer(); pos = player->GetPos(); D3DXVECTOR4 robotpos = D3DXVECTOR4(pos->x, pos->z, 12.f, 1.0f); v = m_fxhandle->SetVector("robotInfo", &robotpos); d3d9device->SetStreamSource(0, m_pVB, 0, sizeof(TerrainVertex)); d3d9device->SetVertexDeclaration(m_pVertexDecl); d3d9device->SetIndices(m_pIB); UINT iPass, totalPasses; m_fxhandle->Begin(&totalPasses, 0); for (iPass = 0; iPass < totalPasses; iPass++) { m_fxhandle->BeginPass(iPass); d3d9device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, // 将要绘制的索引缓冲区的起始地址 0, // 索引数组中最小的索引值 GetVertexNum(), // 要绘制的索引数组中的顶点数量 0, // 从索引数组中的第几个元素开始绘制图元 GetTriangleNum()); // 绘制的图元数量 m_fxhandle->EndPass(); } m_fxhandle->End(); m_border_renderable->Render(pdevice, escapeTime); }