MMatrix ropeGenerator::getMatrixFromParamCurve( MFnNurbsCurve &curveFn, float param, float twist, MAngle divTwist ) { MPoint pDivPos; //Here we control the tangent of the rope curveFn.getPointAtParam( param, pDivPos, MSpace::kWorld ); MVector vTangent( curveFn.tangent( param, MSpace::kWorld ).normal() ); MVector vNormal( curveFn.normal( param, MSpace::kWorld ).normal() ); if ( MAngle( PrevNormal.angle( vNormal ) ).asDegrees() > 90 ) //fprintf(stderr, "Angle = %g\n",MAngle( PrevNormal.angle( vNormal )).asDegrees()); vNormal = vNormal * -1; PrevNormal = vNormal; //if ( vNormal.angle( ) ) MQuaternion qTwist( twist * divTwist.asRadians(), vTangent ); vNormal = vNormal.rotateBy( qTwist ); MVector vExtra( vNormal ^ vTangent ); vNormal.normalize(); vTangent.normalize(); vExtra.normalize(); double dTrans[4][4] ={ {vNormal.x, vNormal.y, vNormal.z, 0.0f}, {vTangent.x, vTangent.y, vTangent.z, 0.0f}, {vExtra.x, vExtra.y, vExtra.z, 0.0f}, {pDivPos.x,pDivPos.y,pDivPos.z, 1.0f}}; MMatrix mTrans( dTrans ); return mTrans; }
int TSecurityChannelStream::receive( void* apBuffer, size_t aszBufferSize, size_t& aszReceivedBytes, unsigned int aunTimeout) { if(!isAttached()) { __L_BAD(m_pLog, "Stream is not attached"); return -4; } if(!m_pSecurityChannel->isEstablished()) { __L_BAD(m_pLog, "Security session is not established!"); return -5; } size_t szBufferOffset = 0; SECURITY_STATUS ssResult = SEC_E_INCOMPLETE_MESSAGE; while(true) { if(!szBufferOffset || ssResult == SEC_E_INCOMPLETE_MESSAGE) { size_t szRead = 0; int nResult = m_pSocketStream->receive( &m_vInBuffer[0] + szBufferOffset, m_vInBuffer.size() - szBufferOffset, szRead, aunTimeout); if(nResult) { __L_BADH(m_pLog, "Cannot receive message during handshake loop", nResult); return nResult; } if(!szRead) { __L_TRK(m_pLog, "Receive time out!"); return -31; } szBufferOffset += szRead; } m_inSecBuff[0].BufferType = SECBUFFER_DATA; m_inSecBuff[0].cbBuffer = szBufferOffset; m_inSecBuff[0].pvBuffer = &m_vInBuffer[0]; m_inSecBuff[1].BufferType = SECBUFFER_EMPTY; m_inSecBuff[1].cbBuffer = 0; m_inSecBuff[1].pvBuffer = NULL; m_inSecBuff[2].BufferType = SECBUFFER_EMPTY; m_inSecBuff[2].cbBuffer = 0; m_inSecBuff[2].pvBuffer = NULL; m_inSecBuff[3].BufferType = SECBUFFER_EMPTY; m_inSecBuff[3].cbBuffer = 0; m_inSecBuff[3].pvBuffer = NULL; ssResult = ::DecryptMessage( &m_pSecurityChannel->getContext(), &m_inBuffDesc, 0, NULL); if(ssResult < 0 && ssResult != SEC_I_RENEGOTIATE && ssResult != SEC_I_CONTEXT_EXPIRED && ssResult != SEC_E_INCOMPLETE_MESSAGE) { __L_BADH(m_pLog, "Error in ::DecryptMessage", ssResult); return ssResult; } // need more data if(ssResult == SEC_E_INCOMPLETE_MESSAGE) continue; if(ssResult == SEC_I_CONTEXT_EXPIRED) { __L_TRK(m_pLog, "> Context expired. Shutting down channel..."); int nResult = m_pSecurityChannel->shutdown(false); if(nResult) { __L_BADH(m_pLog, "Error shutdown Security Channel", nResult); return nResult; } return 0; } SecBuffer *pData = NULL; SecBuffer *pExtra = NULL; for(short i=0; i<4; ++i) { if(m_inSecBuff[i].BufferType == SECBUFFER_DATA) pData = &m_inSecBuff[i]; if(m_inSecBuff[i].BufferType == SECBUFFER_EXTRA ) pExtra = &m_inSecBuff[i]; } if(ssResult == SEC_E_OK && pData) { // TODO: may be only when pExtra == NULL aszReceivedBytes = min(m_vInBuffer.size(), pData->cbBuffer); memcpy(apBuffer, pData->pvBuffer, aszReceivedBytes); return 0; } if(pExtra) { memcpy( &m_vInBuffer[0], &m_vInBuffer[0] + (szBufferOffset - pExtra->cbBuffer), pExtra->cbBuffer); szBufferOffset = pExtra->cbBuffer; } else { szBufferOffset = 0; } if(ssResult == SEC_I_RENEGOTIATE) { int nResult = m_pSecurityChannel->renegotiate(); if(nResult) { __L_BADH(m_pLog, "Error while renegotiate channel", nResult); return nResult; } size_t szAuthExtraSize = m_pSecurityChannel->getExtraDataSize(); if(szAuthExtraSize) { TBlob vExtra(szAuthExtraSize); m_pSecurityChannel->getExtraData(&vExtra[0]); memcpy( &m_vInBuffer[0], &vExtra[0], szAuthExtraSize); szBufferOffset = szAuthExtraSize; } } } return 0; }