void D3D10Shader::UpdateParams() { List<BYTE> shaderConstantData; bool bUpload = false; for(UINT i=0; i<Params.Num(); i++) { ShaderParam ¶m = Params[i]; if(param.type != Parameter_Texture) { if(!param.curValue.Num()) { AppWarning(TEXT("D3D10Shader::UpdateParams: shader parameter '%s' not set"), param.name.Array()); bUpload = false; break; } shaderConstantData.AppendList(param.curValue); if(param.bChanged) { bUpload = true; param.bChanged = false; } } else { if(param.curValue.Num()) { Texture *texture = *(Texture**)param.curValue.Array(); LoadTexture(texture, param.textureID); } } } if(shaderConstantData.Num() != constantSize) { AppWarning(TEXT("D3D10Shader::UpdateParams: invalid parameter specifications, constant size given: %d, constant size expected: %d"), shaderConstantData.Num(), constantSize); bUpload = false; } if(bUpload) { D3D11_MAPPED_SUBRESOURCE map; HRESULT err; if(FAILED(err = GetD3DCtx()->Map(constantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &map))) { AppWarning(TEXT("D3D10Shader::UpdateParams: could not map constant buffer, result = %08lX"), err); return; } mcpy(map.pData, shaderConstantData.Array(), shaderConstantData.Num()); GetD3DCtx()->Unmap(constantBuffer, 0); } }
void Triangulator::ConnectChibiLoops(ChibiLoopNode &loopNode, List<LoopVerts> &LoopList, List<LoopVerts> &NewLoopList) { DWORD i, j, k, l; List<PolyLine> CurLoop; CurLoop.CopyList(LoopList[loopNode.loop]); if(!ChibiLoopFacingUp(CurLoop)) ReverseLoop(CurLoop); List<DWORD> AlreadyUsed; for(i=0; i<loopNode.Children.Num(); i++) { ChibiLoopNode &childNode = loopNode.Children[i]; List<PolyLine> &childLoop = LoopList[childNode.loop]; if(ChibiLoopFacingUp(childLoop)) ReverseLoop(childLoop); } List<DWORD> CurChildren; CurChildren.SetSize(loopNode.Children.Num()); for(i=0; i<loopNode.Children.Num(); i++) CurChildren[i] = i; i = 0; while(CurChildren.Num()) { ChibiLoopNode &childNode = loopNode.Children[CurChildren[i]]; List<PolyLine> &childLoop = LoopList[childNode.loop]; //--------------------------------------------- // find closest points between loops DWORD curBestChoiceLoop1 = INVALID; DWORD curBestChoiceLoop2 = INVALID; float closestPos = 0.0f; for(j=0; j<CurLoop.Num(); j++) { if(AlreadyUsed.FindValueIndex(CurLoop[j].v1) != INVALID) continue; Vect2 &v1 = Verts[CurLoop[j].v1]; for(k=0; k<childLoop.Num(); k++) { if(AlreadyUsed.FindValueIndex(childLoop[k].v1) != INVALID) continue; Vect2 &v2 = Verts[childLoop[k].v1]; BOOL bBadChoice = LineIntersectsShape(v1, v2, CurLoop); if(bBadChoice) continue; for(l=0; l<CurChildren.Num(); l++) { if(LineIntersectsShape(v1, v2, LoopList[loopNode.Children[CurChildren[l]].loop])) { bBadChoice = TRUE; break; } } if(bBadChoice) continue; float dist = v2.Dist(v1); if((curBestChoiceLoop1 != INVALID) && (dist > closestPos)) continue; closestPos = dist; curBestChoiceLoop1 = j; curBestChoiceLoop2 = k; } } if(curBestChoiceLoop1 == INVALID) { i = (i == CurChildren.Num()-1) ? 0 : (i+1); if(i == 0) { AppWarning(TEXT("...almost infinitely looped there. Fortunately I have measures against such devious things.")); break; } continue; } AlreadyUsed << CurLoop[curBestChoiceLoop1].v1; AlreadyUsed << childLoop[curBestChoiceLoop2].v1; //--------------------------------------------- // connect loops if(CurLoop[0].lineData && !childLoop[0].lineData) { for(j=0; j<childLoop.Num(); j++) childLoop[j].lineData = CurLoop[0].lineData; } SetNewLoopStartPosition(CurLoop, curBestChoiceLoop1); SetNewLoopStartPosition(childLoop, curBestChoiceLoop2); if(!CurLoop[0].lineData && childLoop[0].lineData) { for(j=0; j<CurLoop.Num(); j++) CurLoop[j].lineData = childLoop[0].lineData; } PolyLine &lastLine = CurLoop.Last(); PolyLine *pLine = CurLoop.CreateNew(); pLine->v1 = lastLine.v2; pLine->v2 = childLoop[0].v1; CurLoop.AppendList(childLoop); pLine = CurLoop.CreateNew(); pLine->v1 = childLoop[0].v1; pLine->v2 = CurLoop[0].v1; /*for(j=0; j<CurLoop.Num(); j++) { String chong; chong << long(j) << TEXT(": x: ") << FormattedString(TEXT("%0.4f"), Verts[CurLoop[j].v1].x) << TEXT("\ty: ") << FormattedString(TEXT("%0.4f"), Verts[CurLoop[j].v1].y) << TEXT("\r\n"); OutputDebugString(chong); } OutputDebugString(TEXT("====================================\r\n"));*/ CurChildren.Remove(i); i = 0; } NewLoopList.CreateNew()->CopyList(CurLoop); CurLoop.Clear(); for(i=0; i<loopNode.Children.Num(); i++) { ChibiLoopNode &childNode = loopNode.Children[i]; for(j=0; j<childNode.Children.Num(); j++) ConnectChibiLoops(childNode.Children[j], LoopList, NewLoopList); } }