bool Polyangle::split(Polyangle & p1, Polyangle & p2, Polyangle & route, const Droite & d, const double largeurDemiRoute) const { //calcul des deux parallèles a ma droite de coupe Vector2D orthoAB = Vector2D(-d.getD().y(), d.getD().x()); Droite para1(d.getO() + orthoAB * largeurDemiRoute, d.getD()); Droite para2(d.getO() - orthoAB * largeurDemiRoute, d.getD()); Polyangle pTemp; if(!split(p1, pTemp, para1))return false; return pTemp.split(route, p2, para2); }
TEST(SaveLoadTest, SaveLoadLatestVersion) { // Use the temp application. TaskSystem *pTempApp1 = new TaskSystem(); TaskSystem* pPreviousApp = SetWorkingBrain(pTempApp1); { Parameter para(_T("OS"), _T("Windows7")); para.SetComments(_T("global")); GetWorkingBrain()->GetVariableManager()->AddUserParameter(para); } CString conditionId = _T("DoesRegExist"); { ConditionPtr pRegCondition = Condition::Create(_T("RegisterKeyExistsCondition"), GetWorkingBrain()->GetBehaviorManager()); Parameter objectId(OBJECT_ID, conditionId); Parameter para1(_T("RootKey"), _T("HKEY_LOCAL_MACHINE")); Parameter para2(_T("SubKey"), _T("Software\\Microsoft")); pRegCondition->GetParameterTable().AddParameter(objectId); pRegCondition->GetParameterTable().AddParameter(para1); pRegCondition->GetParameterTable().AddParameter(para2); //GetWorkingBrain()->GetBehaviorManager()->RegisterCondition(pRegCondition); } CString actionId = _T("DemoToRunSysCmd"); { ActionPtr pNewAction = Action::Create(_T("RunSystemCommandAction"), GetWorkingBrain()->GetBehaviorManager()); Parameter objectId(OBJECT_ID, actionId); objectId.SetComments(_T("Object Id is used to reference this object everywhere.")); Parameter objectType; pNewAction->GetParameterTable().GetParameter(OBJECT_TYPE, objectType); objectType.SetComments(_T("Object type indicates which behavior body will this action invokes.")); Parameter cmd(APPLICATION_NAME, _T("regedit.exe")); cmd.SetComments(_T("Indicate which command will be run")); pNewAction->GetParameterTable().AddParameter(objectId); pNewAction->GetParameterTable().AddParameter(objectType); pNewAction->GetParameterTable().AddParameter(cmd); //GetWorkingBrain()->GetBehaviorManager()->RegisterAction(pNewAction); GetWorkingBrain()->GetBehaviorManager()->AddActionTask(pNewAction); } CString fileName(_T("C:\\braintest.xml")); // Save bool ret = GetWorkingBrain()->XmlOut(fileName); EXPECT_EQ(true, ret); // Load TaskSystem *pTempApp2 = new TaskSystem(); SetWorkingBrain(pTempApp2); ret = GetWorkingBrain()->XmlIn(fileName); EXPECT_EQ(true, ret); { ActionPtr pAction = GetWorkingBrain()->GetBehaviorManager()->GetActionById(actionId); EXPECT_EQ(true, (pAction != NULL)); } { ConditionPtr pCondition = GetWorkingBrain()->GetBehaviorManager()->GetConditionById(conditionId); EXPECT_EQ(true, (pCondition != NULL)); } // Recover SetWorkingBrain(pPreviousApp); }
void nuiGLDrawContext::DrawGradient(const nuiGradient& rGradient, const nuiRect& rEnclosingRect, nuiSize x1, nuiSize y1, nuiSize x2, nuiSize y2) { nglVector2f vec(x2 - x1, y2 - y1); nglVector2f para(-vec[1], vec[0]); nglVector2f vec1(vec); nglVector2f para1(para); vec1.Normalize(); para1.Normalize(); // What Quadrant are we in?: // | // a | b // | // ---------------- // | // c | d // | float xa, xb, xc, xd; float ya, yb, yc, yd; float x, y; float xp, yp; float xx, yy; float xxp, yyp; xa = xc = rEnclosingRect.Left(); xb = xd = rEnclosingRect.Right(); ya = yb = rEnclosingRect.Top(); yc = yd = rEnclosingRect.Bottom(); if (x1 < x2) { // Go from a to d or c to b if (y1 == y2) { x = xa; y = ya; xp = xc; yp = yc; xx = xd; yy = yd; xxp= xb; yyp= yb; } else if (y1 < y2) { // a to d IntersectLines(xa,ya, para1[0], para1[1], xb, yb, vec1[0], vec1[1], x, y); IntersectLines(xa,ya, para1[0], para1[1], xc, yc, vec1[0], vec1[1], xp, yp); IntersectLines(xd,yd, para1[0], para1[1], xc, yc, vec1[0], vec1[1], xx, yy); IntersectLines(xd,yd, para1[0], para1[1], xb, yb, vec1[0], vec1[1], xxp, yyp); } else { // c to d IntersectLines(xc,yc, para1[0], para1[1], xa, ya, vec1[0], vec1[1], x, y); IntersectLines(xc,yc, para1[0], para1[1], xd, yd, vec1[0], vec1[1], xp, yp); IntersectLines(xb,yb, para1[0], para1[1], xd, yd, vec1[0], vec1[1], xx, yy); IntersectLines(xb,yb, para1[0], para1[1], xa, ya, vec1[0], vec1[1], xxp, yyp); } } else { if (y1 == y2) { x = xd; y = yd; xp = xb; yp = yb; xx = xa; yy = ya; xxp= xc; yyp= yc; } else if (y1 < y2) { // b to c IntersectLines(xb,yb, para1[0], para1[1], xd, yd, vec1[0], vec1[1], x, y); IntersectLines(xb,yb, para1[0], para1[1], xa, ya, vec1[0], vec1[1], xp, yp); IntersectLines(xc,yc, para1[0], para1[1], xa, ya, vec1[0], vec1[1], xx, yy); IntersectLines(xc,yc, para1[0], para1[1], xd, yd, vec1[0], vec1[1], xxp, yyp); } else { // d to a IntersectLines(xd,yd, para1[0], para1[1], xc, yc, vec1[0], vec1[1], x, y); IntersectLines(xd,yd, para1[0], para1[1], xb, yb, vec1[0], vec1[1], xp, yp); IntersectLines(xa,ya, para1[0], para1[1], xb, yb, vec1[0], vec1[1], xx, yy); IntersectLines(xa,ya, para1[0], para1[1], xc, yc, vec1[0], vec1[1], xxp, yyp); } } float startx,starty; float startxp,startyp; float stopx,stopy; float stopxp,stopyp; if (y1 != y2) { IntersectLines(x1, y1, para1[0], para1[1], x, y, vec1[0], vec1[1], startx, starty); IntersectLines(x1, y1, para1[0], para1[1], xp, yp, vec1[0], vec1[1], startxp, startyp); IntersectLines(x2, y2, para1[0], para1[1], x, y, vec1[0], vec1[1], stopx, stopy); IntersectLines(x2, y2, para1[0], para1[1], xp, yp, vec1[0], vec1[1], stopxp, stopyp); } else { startx = x1; starty = y; startxp = x1; startyp = yp; stopx = x2; stopy = y; stopxp = x2; stopyp = yp; } nuiGradientStopList::const_iterator it = rGradient.GetStopList().begin(); nuiGradientStopList::const_iterator end = rGradient.GetStopList().end(); float px1, py1; float px2, py2; PushClipping(); nuiRect r = rEnclosingRect; nglMatrixf m(GetMatrix()); nglVectorf v1(r.Left(), r.Top(), 0); v1 = m * v1; nglVectorf v2 = nglVectorf(r.Right(), r.Bottom(), 0); v2 = m * v2; r.Set(v1[0], v1[1], v2[0], v2[1], false); Clip(r); SetClipping(true); std::vector<nuiShape::CacheElement::Vertex> vertices; nuiColor col = it->second; vertices.push_back(nuiShape::CacheElement::Vertex(x, y, col)); vertices.push_back(nuiShape::CacheElement::Vertex(xp, yp, col)); for ( ; it != end; ++it) { float r = it->first; float rm = 1.0f - r; px1 = startx * rm + stopx * r; py1 = starty * rm + stopy * r; px2 = startxp * rm + stopxp * r; py2 = startyp * rm + stopyp * r; col = it->second; vertices.push_back(nuiShape::CacheElement::Vertex(px1, py1, col)); vertices.push_back(nuiShape::CacheElement::Vertex(px2, py2, col)); } vertices.push_back(nuiShape::CacheElement::Vertex(xxp, yyp, col)); vertices.push_back(nuiShape::CacheElement::Vertex(xx, yy, col)); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glColorPointer(4, GL_FLOAT, sizeof(nuiShape::CacheElement::Vertex), vertices[0].mColor); glVertexPointer(3, GL_FLOAT, sizeof(nuiShape::CacheElement::Vertex), vertices[0].mCoord); glDrawArrays(GL_QUAD_STRIP, 0, vertices.size()); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); PopClipping(); }
void nuiDrawContext::DrawGradient(const nuiGradient& rGradient, const nuiRect& rEnclosingRect, nuiSize x1, nuiSize y1, nuiSize x2, nuiSize y2) { nuiVector2 vec(x2 - x1, y2 - y1); nuiVector2 para(-vec[1], vec[0]); nuiVector2 vec1(vec); nuiVector2 para1(para); vec1.Normalize(); para1.Normalize(); // What Quadrant are we in?: // | // a | b // | // ---------------- // | // c | d // | float xa, xb, xc, xd; float ya, yb, yc, yd; float x, y; float xp, yp; float xx, yy; float xxp, yyp; xa = xc = rEnclosingRect.Left(); xb = xd = rEnclosingRect.Right(); ya = yb = rEnclosingRect.Top(); yc = yd = rEnclosingRect.Bottom(); if (x1 < x2) { // Go from a to d or c to b if (y1 == y2) { x = xa; y = ya; xp = xc; yp = yc; xx = xd; yy = yd; xxp= xb; yyp= yb; } else if (y1 < y2) { // a to d IntersectLines(xa,ya, para1[0], para1[1], xb, yb, vec1[0], vec1[1], x, y); IntersectLines(xa,ya, para1[0], para1[1], xc, yc, vec1[0], vec1[1], xp, yp); IntersectLines(xd,yd, para1[0], para1[1], xc, yc, vec1[0], vec1[1], xx, yy); IntersectLines(xd,yd, para1[0], para1[1], xb, yb, vec1[0], vec1[1], xxp, yyp); } else { // c to d IntersectLines(xc,yc, para1[0], para1[1], xa, ya, vec1[0], vec1[1], x, y); IntersectLines(xc,yc, para1[0], para1[1], xd, yd, vec1[0], vec1[1], xp, yp); IntersectLines(xb,yb, para1[0], para1[1], xd, yd, vec1[0], vec1[1], xx, yy); IntersectLines(xb,yb, para1[0], para1[1], xa, ya, vec1[0], vec1[1], xxp, yyp); } } else { if (y1 == y2) { x = xd; y = yd; xp = xb; yp = yb; xx = xa; yy = ya; xxp= xc; yyp= yc; } else if (y1 < y2) { // b to c IntersectLines(xb,yb, para1[0], para1[1], xd, yd, vec1[0], vec1[1], x, y); IntersectLines(xb,yb, para1[0], para1[1], xa, ya, vec1[0], vec1[1], xp, yp); IntersectLines(xc,yc, para1[0], para1[1], xa, ya, vec1[0], vec1[1], xx, yy); IntersectLines(xc,yc, para1[0], para1[1], xd, yd, vec1[0], vec1[1], xxp, yyp); } else { // d to a IntersectLines(xd,yd, para1[0], para1[1], xc, yc, vec1[0], vec1[1], x, y); IntersectLines(xd,yd, para1[0], para1[1], xb, yb, vec1[0], vec1[1], xp, yp); IntersectLines(xa,ya, para1[0], para1[1], xb, yb, vec1[0], vec1[1], xx, yy); IntersectLines(xa,ya, para1[0], para1[1], xc, yc, vec1[0], vec1[1], xxp, yyp); } } float startx,starty; float startxp,startyp; float stopx,stopy; float stopxp,stopyp; if (y1 != y2) { IntersectLines(x1, y1, para1[0], para1[1], x, y, vec1[0], vec1[1], startx, starty); IntersectLines(x1, y1, para1[0], para1[1], xp, yp, vec1[0], vec1[1], startxp, startyp); IntersectLines(x2, y2, para1[0], para1[1], x, y, vec1[0], vec1[1], stopx, stopy); IntersectLines(x2, y2, para1[0], para1[1], xp, yp, vec1[0], vec1[1], stopxp, stopyp); } else { startx = x1; starty = y; startxp = x1; startyp = yp; stopx = x2; stopy = y; stopxp = x2; stopyp = yp; } nuiGradientStopList::const_iterator it = rGradient.GetStopList().begin(); nuiGradientStopList::const_iterator end = rGradient.GetStopList().end(); float px1, py1; float px2, py2; PushClipping(); Clip(rEnclosingRect); EnableClipping(true); nuiRenderArray* pArray = new nuiRenderArray(GL_TRIANGLE_STRIP); pArray->EnableArray(nuiRenderArray::eVertex); pArray->EnableArray(nuiRenderArray::eColor); // nuiRenderArray Array(GL_LINES); // pArray->SetVertexElements(3); // pArray->SetColorElements(4); nuiColor col = it->second; pArray->SetVertex(x, y); pArray->SetColor(col); pArray->PushVertex(); pArray->SetVertex(xp, yp); pArray->PushVertex(); for ( ; it != end; ++it) { float r = it->first; float rm = 1.0f - r; px1 = startx * rm + stopx * r; py1 = starty * rm + stopy * r; px2 = startxp * rm + stopxp * r; py2 = startyp * rm + stopyp * r; col = it->second; pArray->SetColor(col); pArray->SetVertex(px2, py2); pArray->PushVertex(); pArray->SetVertex(px1, py1); pArray->PushVertex(); } pArray->SetVertex(xx, yy); pArray->PushVertex(); pArray->SetVertex(xxp, yyp); pArray->PushVertex(); DrawArray(pArray); PopClipping(); }
/* @S_GET_TASK_GIFTS=0x0911 --获取任务奖励 */ int TASK::clientGetTaskReward( ROLE* role, unsigned char * data, size_t dataLen ) { WORD wTaskID; if ( !BASE::parseWORD( data, dataLen, wTaskID ) ) return 0; BYTE byRet = TASK_SUCCESS; string strData; do { CONFIG::MISSION_CFG* taskCfg = CONFIG::getMissionCfg(wTaskID); COND_BREAK( nullptr == taskCfg, byRet, TASK_ERROR_ID ); auto it = role->mapTask.find( taskCfg->group ); COND_BREAK( it == role->mapTask.end(), byRet, TASK_ERROR_ID ); auto& task = it->second; COND_BREAK( task.wTaskID != wTaskID, byRet, TASK_ERROR_ID ); COND_BREAK( role->wLevel < taskCfg->level_limit, byRet, NOT_ENOUGH_LEVEL ); COND_BREAK( task.byTaskStatus == E_TASK_UNCOMPLETE, byRet, NOT_ENOUGH_LEVEL ); COND_BREAK( task.byTaskStatus == E_TASK_COMPLETE_ALREADY_GET_PRIZE, byRet, ALREADY_GET ); CONFIG::ITEM_CFG* itemCfg = CONFIG::getItemCfg( taskCfg->itemID ); if ( itemCfg!=NULL )//可能没有物品奖励 { COND_BREAK(ItemCtrl::makeOneTypeItem(role, itemCfg, taskCfg->itemNum) == -1, byRet, ITEM_FULL); } autoUnlockTask( role, wTaskID); CONFIG::MISSION_CFG* nextTaskCfg = CONFIG::getMissionCfg( wTaskID+1 ); if (nextTaskCfg != NULL && nextTaskCfg->group == taskCfg->group) { task = MAIN_TASK_INFO( wTaskID+1 ); } else { task.byTaskStatus = E_TASK_COMPLETE_ALREADY_GET_PRIZE; } if ( taskCfg->ingot > 0 )//1元宝 { ADDUP(role->dwIngot, (int)taskCfg->ingot); notifyIngot(role); } if( taskCfg->coin > 0 )//2铜钱 { ADDUP(role->dwCoin, (int)taskCfg->coin); notifyCoin(role); } if(taskCfg->exp > 0)//3经验 { WORD wOldLevel = role->wLevel; CONFIG::addRoleExp( role, role->dwExp, taskCfg->exp ); notifyExp(role); } if ( taskCfg->type == E_TASK_LEVEL ) { RoleMgr::getMe().judgeCompleteTypeTask(role, E_TASK_LEVEL);//升级触发点 } if ( taskCfg->type == E_TASK_VIP_LOGIN ) { ITEM_INFO para1(0, role->getVipLevel()); RoleMgr::getMe().judgeCompleteTypeTask(role, E_TASK_VIP_LOGIN, ¶1); } if ( taskCfg->type == E_TASK_SET_FIGHT_SKILL_NUM ) { role->role_skill.judgeSetSkillTask(); } if( taskCfg->type == E_TASK_FIGHT_BOSS ) { ADDUP3( role->byAllBuyBossTimes, 1, BYTE_MAX ); } logs_db_thread::singleton().consume(service::id, role->roleName, role->dwRoleID, (int)taskCfg->coin, (int)taskCfg->ingot, purpose::task_reward, 0); } while (0); S_APPEND_BYTE( strData, byRet); PROTOCAL::sendClient( role->client, PROTOCAL::cmdPacket(S_GET_TASK_GIFTS, strData) ); return 0; #if 0 if (taskCfg != NULL) { auto it = role->mapTask.find( taskCfg->group ); if ( it != role->mapTask.end()) { auto& task = it->second; if(task.wTaskID == wTaskID ) { if (role->wLevel >= taskCfg->level_limit) { if (task.byTaskStatus == E_TASK_UNCOMPLETE) { byRet = NOT_COMPELETE; } else if (task.byTaskStatus == E_TASK_COMPLETE_ALREADY_GET_PRIZE) { byRet = ALREADY_GET; } else { byRet = TASK_SUCCESS; if (taskCfg->itemID != 0) { CONFIG::ITEM_CFG* itemCfg = CONFIG::getItemCfg( taskCfg->itemID ); if ( itemCfg!=NULL ) { if (ItemCtrl::makeOneTypeItem(role, itemCfg, taskCfg->itemNum) == -1) { byRet = ITEM_FULL; } } } if (byRet != ITEM_FULL) { autoUnlockTask( role, wTaskID); nextTaskCfg = CONFIG::getMissionCfg( wTaskID+1 ); if (nextTaskCfg != NULL && nextTaskCfg->group == taskCfg->group) { task = MAIN_TASK_INFO( wTaskID+1 ); } else { task.byTaskStatus = E_TASK_COMPLETE_ALREADY_GET_PRIZE; //if (taskCfg->repeat == 1) //{ // task.byTaskStatus = E_TASK_COMPLETE_ALREADY_GET_PRIZE; //} //else //{ // role->mapTask.erase(it); //} } if ( taskCfg->ingot > 0 )//1元宝 { ADDUP(role->dwIngot, (int)taskCfg->ingot); notifyIngot(role); } if(taskCfg->coin > 0)//2铜钱 { ADDUP(role->dwCoin, (int)taskCfg->coin); notifyCoin(role); } logs_db_thread::singleton().consume(service::id, role->roleName, role->dwRoleID, (int)taskCfg->coin, (int)taskCfg->ingot, purpose::task_reward, 0); if(taskCfg->exp > 0)//3经验 { WORD wOldLevel = role->wLevel; CONFIG::addRoleExp( role, role->dwExp, taskCfg->exp ); notifyExp(role); } if ( taskCfg->type == E_TASK_LEVEL ) { RoleMgr::getMe().judgeCompleteTypeTask(role, E_TASK_LEVEL);//升级触发点 } if ( taskCfg->type == E_TASK_VIP_LOGIN ) { ITEM_INFO para1(0, role->getVipLevel()); RoleMgr::getMe().judgeCompleteTypeTask(role, E_TASK_VIP_LOGIN, ¶1); } if ( taskCfg->type == E_TASK_SET_FIGHT_SKILL_NUM ) { role->role_skill.judgeSetSkillTask(); } if( taskCfg->type == E_TASK_FIGHT_BOSS ) { ADDUP3( role->byAllBuyBossTimes, 1, BYTE_MAX ); } } } } else { byRet = NOT_ENOUGH_LEVEL; } } } } S_APPEND_BYTE( strData, byRet); PROTOCAL::sendClient( role->client, PROTOCAL::cmdPacket(S_GET_TASK_GIFTS, strData) ); return 0; #endif }