Пример #1
0
void TexturedLine::Render()
{
    if(!lineTexture) return;

    Vect lineDir = (pointB-pointA).Norm();

    float halfWidth = width*0.5f;

    Camera *viewCam = level->GetCurrentCamera();
    Vect camPos = viewCam->GetWorldPos();
    Vect crossLine;

    DepthWriteEnable(FALSE);
    EnableBlending(TRUE);

    if(lineTexture->HasAlpha())
        BlendFunction(GS_BLEND_SRCALPHA, GS_BLEND_INVSRCALPHA);
    else
        BlendFunction(GS_BLEND_ONE, GS_BLEND_ONE);

    LoadTexture(lineTexture);
    LoadDefault3DSampler();

    MatrixPush();
    MatrixTranslate(GetWorldPos());
    MatrixRotate(GetWorldRot());

        RenderStart();
            Vect endAdjust = (lineDir*halfWidth);
            Vect backEnd  = (pointA-endAdjust);
            Vect frontEnd = (pointB+endAdjust);

            Color(color);

            crossLine = (camPos-backEnd).Cross(lineDir).Norm() * halfWidth;
            Vertex(backEnd+crossLine);  TexCoord(1.0f, 0.0f);
            Vertex(backEnd-crossLine);  TexCoord(0.0f, 0.0f);

            crossLine = (camPos-pointA).Cross(lineDir).Norm() * halfWidth;
            Vertex(pointA+crossLine);   TexCoord(1.0f, 0.5f);
            Vertex(pointA-crossLine);   TexCoord(0.0f, 0.5f);

            crossLine = (camPos-pointB).Cross(lineDir).Norm() * halfWidth;
            Vertex(pointB+crossLine);   TexCoord(1.0f, 0.5f);
            Vertex(pointB-crossLine);   TexCoord(0.0f, 0.5f);

            crossLine = (camPos-frontEnd).Cross(lineDir).Norm() * halfWidth;
            Vertex(frontEnd+crossLine); TexCoord(1.0f, 1.0f);
            Vertex(frontEnd-crossLine); TexCoord(0.0f, 1.0f);
        RenderStop(GS_TRIANGLESTRIP);

    MatrixPop();

    LoadTexture(NULL);
}
Пример #2
0
/*
* D3DParticleAddToRenderer: Adds a particle to be rendered.
*/
void D3DParticleAddToRenderer(d3d_render_pool_new *pPool, Draw3DParams *params,
   particle_system *pParticleSystem, particle *pParticle)
{
   d3d_render_packet_new *pPacket;
   d3d_render_chunk_new *pChunk;

   pPacket = D3DRenderPacketFindMatch(pPool, pParticleSystem->pTexture, NULL, 0, 0, 0);
   assert(pPacket);
   pPacket->pMaterialFctn = &D3DMaterialParticlePacket;

   pChunk = D3DRenderChunkNew(pPacket);
   assert(pChunk);
   pChunk->numIndices = pParticleSystem->numIndices;
   pChunk->numVertices = pParticleSystem->numVertices;
   pChunk->numPrimitives = pParticleSystem->numPrimitives;
   pChunk->pMaterialFctn = &D3DMaterialParticleChunk;

   MatrixTranslate(&pChunk->xForm, pParticle->pos.x, pParticle->pos.z, pParticle->pos.y);

   if (pParticleSystem->pTexture)
   {
      MatrixMultiply(&pChunk->xForm, &mPlayerHeadingTrans, &pChunk->xForm);

      for (u_int i = 0; i < pChunk->numVertices; i++)
      {
         pChunk->indices[i] = pParticleSystem->pParticleIndices[i];
         pChunk->xyz[i] = pParticleSystem->pParticleXYZ[i];
         pChunk->st0[i] = pParticleSystem->pParticleST[i];
         pChunk->bgra[i].b = pParticle->bgra.b;
         pChunk->bgra[i].g = pParticle->bgra.g;
         pChunk->bgra[i].r = pParticle->bgra.r;
         pChunk->bgra[i].a = pParticle->bgra.a;
      }
   }
   else
   {
      CHUNK_XYZ_SET(pChunk, 0, 0, 0, 0);
      CHUNK_XYZ_SET(pChunk, 1, -pParticle->velocity.x, -pParticle->velocity.y,
         -pParticle->velocity.z);
      CHUNK_BGRA_SET(pChunk, 0, (pParticle->bgra.b), pParticle->bgra.g, pParticle->bgra.r,
         pParticle->bgra.a);
      CHUNK_BGRA_SET(pChunk, 1, pParticle->bgra.b, pParticle->bgra.g, pParticle->bgra.r,
         0);
      CHUNK_INDEX_SET(pChunk, 0, 0);
      CHUNK_INDEX_SET(pChunk, 1, 1);
   }
}
Пример #3
0
void skinnedmesh_frame(skinnedmesh_t *sm,float frame) {
    int i,frame1,frame2;
    frame1 = (int)frame;
    frame -= frame1;
    if(frame1 >= sm->num_frame) frame1 %= sm->num_frame;
    frame2 = frame1 + 1;
    if(frame2 >= sm->num_frame) frame2 = 0;
    for(i = 0; i < sm->num_bone; i++) {
        float matrix_xyz[16],matrix_rot[16];
        float xyz[3],rot[4],a[3],b[3];
        VectorScale(sm->frame[frame1][i].xyz,1.0 - frame,a);
        VectorScale(sm->frame[frame2][i].xyz,frame,b);
        VectorAdd(a,b,xyz);
        QuaternionSlerp(sm->frame[frame1][i].rot,
            sm->frame[frame2][i].rot,frame,rot);
        MatrixTranslate(xyz[0],xyz[1],xyz[2],matrix_xyz);
        QuaternionToMatrix(rot,matrix_rot);
        MatrixMultiply(matrix_xyz,matrix_rot,sm->bone[i].matrix);
    }
    for(i = 0; i < sm->num_surface; i++) {
        int j;
        surface_t *surface = sm->surface[i];
        for(j = 0; j < surface->num_vertex; j++) {
            int k;
            VectorSet(0,0,0,surface->vertex[j].xyz);
            VectorSet(0,0,0,surface->vertex[j].normal);
            for(k = 0; k < surface->vertex[j].num_weight; k++) {
                float v[3];
                weight_t *weight = &surface->vertex[j].weight[k];
                VectorTransform(weight->xyz,
                    sm->bone[weight->bone].matrix,v);
                VectorScale(v,weight->weight,v);
                VectorAdd(surface->vertex[j].xyz,v,
                    surface->vertex[j].xyz);
                VectorTransformNormal(weight->normal,
                    sm->bone[weight->bone].matrix,v);
                VectorScale(v,weight->weight,v);
                VectorAdd(surface->vertex[j].normal,v,
                    surface->vertex[j].normal);
            }
        }
    }
}
Пример #4
0
    void KGEDevice::transformVertexes()
    {
        _mat = MatrixScale(0.02, 0.02, 0.02)*MatrixTranslate(Vector4(0, -20, 0, 0))*MatrixRotation(Vector4(1, 0, 0, 0), -90 * M_PI / 180);

        int vertexCount = (int)_transformMesh->positionList.size();
        for (int i = 0; i < vertexCount; ++i)
        {
            KGEVertex v = _transformMesh->GetVertex(i);
            KGEVertex tranformedV = VertexShaderProgram(_mat, _camera, _light, _transformMesh->materialList[v.materialID], v);

            _transformMesh->SetVertex(i, tranformedV);
        }


        vertexCount = _transformMesh->positionList.size();

        for (int i = 0; i < vertexCount; ++i)
        {
            _transformMesh->positionList[i].persDiv();
            _transformMesh->positionList[i] = _viewportMat * _transformMesh->positionList[i];
        }
    }
Пример #5
0
DGLE_RESULT DGLE_API CBitmapFont::Draw2D(float fX, float fY, const char *pcTxt, const TColor4 &stColor, float fAngle, bool bVerticesColors)
{
	uint length = strlen(pcTxt);

	if (length == 0)
		return S_FALSE;

	bool b_need_update;

	_pRender2D->NeedToUpdateBatchData(b_need_update);

	if (!b_need_update)
	{
		_pRender2D->Draw(_pTex, TDrawDataDesc(), CRDM_TRIANGLES, length * 6, TRectF(), (E_EFFECT2D_FLAGS)(EF_BLEND | (bVerticesColors ? EF_DEFAULT : EF_COLOR_MIX)));
		return S_OK;
	}

	uint width, height;
	
	GetTextDimensions(pcTxt, width, height);
	
	float quad[] = {fX, fY, fX + (float)width, fY, fX + (float)width, fY + (float)height, fX, fY + (float)height};
	
	TMatrix4 transform;

	if (fAngle != 0.f)
	{
		TMatrix4 rot = MatrixIdentity();
		
		const float s = sinf(-fAngle * (float)M_PI/180.f), c = cosf(-fAngle * (float)M_PI/180.f);

		rot._2D[0][0] = c;
		rot._2D[0][1] = -s;
		rot._2D[1][0] = s;
		rot._2D[1][1] = c;

		transform = MatrixTranslate(TVector3(-(fX + width / 2.f), -(fY + height / 2.f), 0.f)) * rot * MatrixTranslate(TVector3(fX + width / 2.f, fY + height / 2.f, 0.f));

		float x = quad[0], y = quad[1];
		quad[0]	= transform._2D[0][0] * x + transform._2D[1][0] * y + transform._2D[3][0];
		quad[1]	= transform._2D[0][1] * x + transform._2D[1][1] * y + transform._2D[3][1];

		 x = quad[2]; y = quad[3];
		quad[2]	= transform._2D[0][0] * x + transform._2D[1][0] * y + transform._2D[3][0];
		quad[3]	= transform._2D[0][1] * x + transform._2D[1][1] * y + transform._2D[3][1];

		x = quad[4]; y = quad[5];
		quad[4]	= transform._2D[0][0] * x + transform._2D[1][0] * y + transform._2D[3][0];
		quad[5]	= transform._2D[0][1] * x + transform._2D[1][1] * y + transform._2D[3][1];

		x = quad[6]; y = quad[7];
		quad[6]	= transform._2D[0][0] * x + transform._2D[1][0] * y + transform._2D[3][0];
		quad[7]	= transform._2D[0][1] * x + transform._2D[1][1] * y + transform._2D[3][1];
	}

	if (!_pRender2D->BBoxInScreen(quad, fAngle != 0.f))
		return S_OK;

	float xoffset = 0.f;
	uint t_w, t_h;
	
	_pTex->GetDimensions(t_w, t_h);

	TColor4 prev_color, verts_colors[4];
	
	_pRender2D->GetColorMix(prev_color);
	_pRender2D->SetColorMix(stColor);

	if (bVerticesColors)
		_pRender2D->GetVerticesColors(verts_colors[0], verts_colors[1], verts_colors[2], verts_colors[3]);

	uint size = length * 12 * 2;

	if (bVerticesColors)
		size = length * 24 * 2;

	if (_uiBufferSize < size)
	{
		_uiBufferSize = size;
		delete[] _pBuffer;
		_pBuffer = new float[_uiBufferSize];
	}

	for (uint i = 0; i < length; ++i)
	{
		const uchar ch = static_cast<const uchar>(pcTxt[i]) - 32;
		
		const int
			&curb_x = _astChars[ch].x,
			&curb_y = _astChars[ch].y,
			&curb_w = _astChars[ch].w,
			&curb_h = _astChars[ch].h;
		
		const uint idx = i * 24;

		_pBuffer[idx] = fX + xoffset; _pBuffer[idx + 1] = fY; _pBuffer[idx + 2] = (float)curb_x / (float)t_w; _pBuffer[idx + 3] = (float)curb_y / (float)t_h;
		_pBuffer[idx + 4] = fX + xoffset + (float)curb_w * _fScale; _pBuffer[idx + 5] = fY; _pBuffer[idx + 6] = (float)(curb_x + curb_w) / (float)t_w; _pBuffer[idx + 7] = (float)curb_y / (float)t_h;
		_pBuffer[idx + 8] = fX + xoffset + (float)curb_w * _fScale; _pBuffer[idx + 9] = fY + (float)curb_h * _fScale; _pBuffer[idx + 10] = (float)(curb_x + curb_w) / (float)t_w; _pBuffer[idx + 11] = (float)(curb_y + curb_h) / (float)t_h;
		_pBuffer[idx + 12] = _pBuffer[idx]; _pBuffer[idx + 13] = _pBuffer[idx + 1]; _pBuffer[idx + 14] = _pBuffer[idx + 2]; _pBuffer[idx + 15] = _pBuffer[idx + 3];
		_pBuffer[idx + 16] = _pBuffer[idx + 8]; _pBuffer[idx + 17] = _pBuffer[idx + 9]; _pBuffer[idx + 18] = _pBuffer[idx + 10]; _pBuffer[idx + 19] = _pBuffer[idx + 11];
		_pBuffer[idx + 20] = fX + xoffset; _pBuffer[idx + 21] = fY + (float)curb_h * _fScale; _pBuffer[idx + 22] = (float)curb_x / (float)t_w; _pBuffer[idx + 23] = (float)(curb_y + curb_h) / (float)t_h;

		if (fAngle != 0.f)
		{
			float x = _pBuffer[idx], y = _pBuffer[idx + 1];
			_pBuffer[idx]		= transform._2D[0][0] * x + transform._2D[1][0] * y + transform._2D[3][0];
			_pBuffer[idx + 1]	= transform._2D[0][1] * x + transform._2D[1][1] * y + transform._2D[3][1];

			 x = _pBuffer[idx + 4]; y = _pBuffer[idx + 5];
			_pBuffer[idx + 4]	= transform._2D[0][0] * x + transform._2D[1][0] * y + transform._2D[3][0];
			_pBuffer[idx + 5]	= transform._2D[0][1] * x + transform._2D[1][1] * y + transform._2D[3][1];

			x = _pBuffer[idx + 8]; y = _pBuffer[idx + 9];
			_pBuffer[idx + 8]	= transform._2D[0][0] * x + transform._2D[1][0] * y + transform._2D[3][0];
			_pBuffer[idx + 9]	= transform._2D[0][1] * x + transform._2D[1][1] * y + transform._2D[3][1];

			x = _pBuffer[idx + 20]; y = _pBuffer[idx + 21];
			_pBuffer[idx + 20] = transform._2D[0][0] * x + transform._2D[1][0] * y + transform._2D[3][0];
			_pBuffer[idx + 21] = transform._2D[0][1] * x + transform._2D[1][1] * y + transform._2D[3][1];

			_pBuffer[idx + 12] = _pBuffer[idx]; _pBuffer[idx + 13] = _pBuffer[idx + 1];
			_pBuffer[idx + 16] = _pBuffer[idx + 8]; _pBuffer[idx + 17] = _pBuffer[idx + 9];
		}

		if (bVerticesColors)
		{
			const uint idx = length * 24 + i * 24;
			memcpy(&_pBuffer[idx], verts_colors[0], 12 * sizeof(float));
			memcpy(&_pBuffer[idx + 12], verts_colors[0], 4 * sizeof(float));
			memcpy(&_pBuffer[idx + 16], verts_colors[2], 8 * sizeof(float));
		}

		xoffset += (float)curb_w * _fScale;
	}

	TDrawDataDesc desc;

	desc.pData = (uint8 *)_pBuffer;
	desc.uiVertexStride = 4 * sizeof(float);
	desc.bVertices2D = true;
	desc.uiTextureVertexOffset = 2 * sizeof(float);
	desc.uiTextureVertexStride = desc.uiVertexStride;

	if (bVerticesColors)
		desc.uiColorOffset = length * 24 * sizeof(float);

	_pRender2D->Draw(_pTex, desc, CRDM_TRIANGLES, length*6, TRectF(), (E_EFFECT2D_FLAGS)(EF_BLEND | (bVerticesColors ? EF_DEFAULT : EF_COLOR_MIX)));

	_pRender2D->SetColorMix(prev_color);

	return S_OK;
}
Пример #6
0
void RotationManipulator::RenderScaled(const Vect &cameraDir, float scale)
{
    traceInFast(RotationManipulator::RenderScaled);

    DWORD i;

    Shader *rotManipShader = GetVertexShader(TEXT("Editor:RotationManipulator.vShader"));
    LoadVertexShader(rotManipShader);
    LoadPixelShader(GetPixelShader(TEXT("Base:SolidColor.pShader")));

    rotManipShader->SetVector(rotManipShader->GetParameter(2), cameraDir);

    MatrixPush();
    MatrixTranslate(GetWorldPos());
    MatrixScale(scale, scale, scale);

        for(i=0; i<3; i++)
        {
            Vect axisColor(0.0f, 0.0f, 0.0f);

            axisColor.ptr[i] = 1.0f;
            if(i == activeAxis)
                axisColor.Set(1.0f, 1.0f, 0.0f);
            else
                axisColor.ptr[i] = 1.0f;

            rotManipShader->SetVector(rotManipShader->GetParameter(1), axisColor);

            LoadVertexBuffer(axisBuffers[i]);
            LoadIndexBuffer(NULL);

            Draw(GS_LINESTRIP);
        }

        LoadVertexBuffer(NULL);

        //----------------------------------------------------

        Shader *solidShader = GetVertexShader(TEXT("Base:SolidColor.vShader"));
        LoadVertexShader(solidShader);

        MatrixPush();
        MatrixRotate(Quat().SetLookDirection(cameraDir));

            LoadVertexBuffer(axisBuffers[2]);
            LoadIndexBuffer(NULL);

            solidShader->SetColor(solidShader->GetParameter(1), 0.5, 0.5, 0.5, 0.5);

            Draw(GS_LINESTRIP);

            MatrixScale(1.25f, 1.25f, 1.25f);

            //---------------

            if(activeAxis == 4)
                solidShader->SetColor(solidShader->GetParameter(1), 1.0f, 1.0f, 0.0, 1.0f);
            else
                solidShader->SetColor(solidShader->GetParameter(1), 0.8, 0.8, 0.8, 0.8);

            Draw(GS_LINESTRIP);

        MatrixPop();

    MatrixPop();

    LoadVertexShader(NULL);
    LoadPixelShader(NULL);

    traceOutFast;
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CParticleProperty::UpdateControlPoint( ParticleEffectList_t *pEffect, int iPoint, bool bInitializing )
{
	ParticleControlPoint_t *pPoint = &pEffect->pControlPoints[iPoint];

	if ( !pPoint->hEntity.Get() )
	{
		if ( pPoint->iAttachType == PATTACH_WORLDORIGIN && bInitializing )
		{
			pEffect->pParticleEffect->SetControlPointOrientation( pPoint->iControlPoint, Vector(1,0,0), Vector(0,1,0), Vector(0,0,1) );
			pEffect->pParticleEffect->SetControlPoint( pPoint->iControlPoint, pPoint->vecOriginOffset );
			pEffect->pParticleEffect->SetSortOrigin( pPoint->vecOriginOffset );
		}

		pEffect->pParticleEffect->SetControlPointEntity( pPoint->iControlPoint, NULL );
		return;
	}

	// Only update non-follow particles when we're initializing, 
	// unless we're parented to something, in which case we should always update
	if ( !bInitializing && !pPoint->hEntity->GetMoveParent() && (pPoint->iAttachType == PATTACH_ABSORIGIN || pPoint->iAttachType == PATTACH_POINT ) )
		return;

	if ( pPoint->iAttachType == PATTACH_CUSTOMORIGIN )
		return;

	Vector vecOrigin, vecForward, vecRight, vecUp;

	float flOffset = 0.0f;
	bool bUsingHeadOrigin = false;

#ifdef TF_CLIENT_DLL

	CBaseEntity *pWearable = (CBaseEntity*) pPoint->hEntity.Get();
	if ( pWearable && dynamic_cast<IHasAttributes*>( pWearable ) && !pWearable->IsPlayer() )
	{
		C_BaseAnimating *pAnimating = pPoint->hEntity->GetBaseAnimating();
		if ( pAnimating )
		{
			int bUseHeadOrigin = 0;
			CALL_ATTRIB_HOOK_INT_ON_OTHER( pPoint->hEntity.Get(), bUseHeadOrigin, particle_effect_use_head_origin );
			if ( bUseHeadOrigin > 0 )
			{
				int iBone = Studio_BoneIndexByName( pAnimating->GetModelPtr(), "bip_head" );
				if ( iBone < 0 )
				{
					iBone = Studio_BoneIndexByName( pAnimating->GetModelPtr(), "prp_helmet" );
					if ( iBone < 0 )
					{
						iBone = Studio_BoneIndexByName( pAnimating->GetModelPtr(), "prp_hat" );
					}
				}
				if ( iBone >= 0 )
				{
					bUsingHeadOrigin = true;
					const matrix3x4_t headBone = pAnimating->GetBone( iBone );
					MatrixVectors( headBone, &vecForward, &vecRight, &vecUp );
					MatrixPosition( headBone, vecOrigin );

					CALL_ATTRIB_HOOK_FLOAT_ON_OTHER( pPoint->hEntity.Get(), flOffset, particle_effect_vertical_offset );
				}
			}
		}
	}
#endif

	if ( !bUsingHeadOrigin )
	{
		switch ( pPoint->iAttachType )
		{
		case PATTACH_POINT:
		case PATTACH_POINT_FOLLOW:
			{
				C_BaseAnimating *pAnimating = pPoint->hEntity->GetBaseAnimating();

				Assert( pAnimating );
				if ( pAnimating )
				{
					matrix3x4_t attachmentToWorld;

					if ( !pAnimating->GetAttachment( pPoint->iAttachmentPoint, attachmentToWorld ) )
					{
						// try C_BaseAnimating if attach point is not on the weapon
						if ( !pAnimating->C_BaseAnimating::GetAttachment( pPoint->iAttachmentPoint, attachmentToWorld ) )
						{
							Warning( "Cannot update control point %d for effect '%s'.\n", pPoint->iAttachmentPoint, pEffect->pParticleEffect->GetEffectName() );
							attachmentToWorld = pAnimating->RenderableToWorldTransform();
						}
					}

					VMatrix vMat(attachmentToWorld);
					MatrixTranslate( vMat, pPoint->vecOriginOffset );
					MatrixVectors( vMat.As3x4(), &vecForward, &vecRight, &vecUp );
					MatrixPosition( vMat.As3x4(), vecOrigin );

					if ( pEffect->pParticleEffect->m_pDef->IsViewModelEffect() )
					{
						FormatViewModelAttachment( vecOrigin, true );
					}
				}
			}
			break;

		case PATTACH_ABSORIGIN:
		case PATTACH_ABSORIGIN_FOLLOW:
		default:
			{
				vecOrigin = pPoint->hEntity->GetAbsOrigin() + pPoint->vecOriginOffset;
				pPoint->hEntity->GetVectors( &vecForward, &vecRight, &vecUp );
			}
			break;

		case PATTACH_ROOTBONE_FOLLOW:
			{
				C_BaseAnimating *pAnimating = pPoint->hEntity->GetBaseAnimating();

				Assert( pAnimating );
				if ( pAnimating )
				{
					matrix3x4_t rootBone;
					if ( pAnimating->GetRootBone( rootBone ) )
					{
						MatrixVectors( rootBone, &vecForward, &vecRight, &vecUp );
						MatrixPosition( rootBone, vecOrigin );
					}
				}
			}
			break;
		}
	}

	Vector vecForcedOriginOffset( 0, 0, flOffset );
	pEffect->pParticleEffect->SetControlPointOrientation( pPoint->iControlPoint, vecForward, vecRight, vecUp );
	pEffect->pParticleEffect->SetControlPointEntity( pPoint->iControlPoint, pPoint->hEntity );
	pEffect->pParticleEffect->SetControlPoint( pPoint->iControlPoint, vecOrigin + vecForcedOriginOffset );
	pEffect->pParticleEffect->SetSortOrigin( vecOrigin + vecForcedOriginOffset);
}
Пример #8
0
void ArmGLWidget::drawArm(ArmShovelAngles A)
{
    // Rover!
    glColor3f (.5, .5, .5);
    glTranslatef (-35, 5, 15);
    drawBox(45, 15, 45);
    glTranslatef (35, -5, -15);

    glColor3f (1, 1, 1);

    // Testing
    matrix m = MatrixTranslate(0, 0, 0);

    //m = MatrixRotateY(A.base.rotation) * m;
    m = MatrixTranslate (-ArmController::BASE_OFFSET, 0, 0) * m;

    m = MatrixRotateZ(A.base.shoulder) * m;
    m = MatrixTranslate(ArmController::SEG1_LEN, 0, 0) * m;

    //m = MatrixTranslate(0, 0, -OFFSET) * m;
    m = MatrixRotateZ(A.base.elbow - 180) * m;
    m = MatrixTranslate(40, 0, 0) * m;


    glPushMatrix();
        glMultMatrixf (*(m.array));
        drawBox(1, 1, 1);
    glPopMatrix();

    glColor3f (1, 0, 0);

    // Draw arm box
    drawBox(15, 5, 15);

    // Draw box to drop samples into
    glPushMatrix();
    // x = front to back, y = up and down, z = side to side
    glTranslatef(0, - 2.5 + (4 + 5 - 2) * 2.54 , (23) * 2.54);
    drawBox(7.25 * 2.54, 4 * 2.54, 6.5 * 2.54);
    glPopMatrix();

    glRotatef(A.base.rotation, 0, 1, 0);
    glTranslatef(0, 3.5, 0);
    drawCylinderY(3, 2);
    glTranslatef(-ArmController::BASE_OFFSET, 2, 0);
    drawCylinderZ(2, 6);


    glColor3f (0, 1, 0);

    glRotatef (A.base.shoulder, 0, 0, 1);//g.RotateTransform(-A.thetaS, System..Drawing2D.MatrixOrder.Prepend);
    glTranslatef(ArmController::SEG1_LEN/2, 0, 0);
    drawCylinderX(2, ArmController::SEG1_LEN);
    glTranslatef(ArmController::SEG1_LEN/2, 0, -ArmController::OFFSET/2);
    drawCylinderZ(2, ArmController::OFFSET + 4);
    glTranslatef(0, 0, -ArmController::OFFSET/2);

    glColor3f (1, 1, 0);

    // Elbow to wrist elevation
    glRotatef (A.base.elbow - 180, 0, 0, 1);//g.RotateTransform(180 - A.thetaE, System.Drawing.Drawing2D.MatrixOrder.Prepend);
    float elbowToEnd = 35;
    glTranslatef (elbowToEnd/2, 0, 0);
    drawCylinderX(2, elbowToEnd);
    glTranslatef (elbowToEnd/2, 0, 0);
    drawCylinderZ(2, 4);


    glColor3f (1, 0, 1);

    glPushMatrix();
    glRotatef(((float)A.head - 1000.0f) * 160.0f / 1024.0f, 0, 0, 1);

    glPushMatrix();
    glRotatef(((float)A.lid - 600.0f) * 300.0f / 1024.0f, 0, 0, 1);
    this->drawBox(4, 1, 6);
    glPopMatrix();


    glRotatef(90, 0, 0, 1);
    glTranslatef(2, 0, 0);
    this->drawBox(4, 1, 8);
    glTranslatef(2, 0, 0);

    glRotatef(-90, 0, 0, 1);
    glTranslatef(4, 0, 0);
    this->drawBox(7, 1, 8);
    glTranslatef(4, 0, 0);

    glRotatef(-70, 0, 0, 1);
    glTranslatef(2.5, 0, 0);
    this->drawBox(5, 1, 8);
    glPopMatrix();



   /* float GRIPPER_ARM_LEN = 8;

    static float r = 0;
    r += 7;

    //glRotatef (A.wristRotation, 1, 0, 0);

    // CLAMPY CLAMPY!
    static float a = 0;
    a = sind(r) * 15;
    drawCylinderX(4, 1);
    glPushMatrix();
    glTranslatef(0, 0, -4);
    drawCylinderY(1, 2);
    glRotatef(a, 0, 1, 0);
    glTranslatef (GRIPPER_ARM_LEN/2, 0, 0);
    drawCylinderX(1, GRIPPER_ARM_LEN);
    glTranslatef (GRIPPER_ARM_LEN/2, 0, 0);
    glRotatef(-a - 90, 0, 1, 0);
    drawCylinderY(1, 2);
    glTranslatef(1, 0, 0);
    drawCylinderX(1, 2);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0, 0, 4);
    drawCylinderY(1, 2);
    glRotatef(-a, 0, 1, 0);
    glTranslatef (GRIPPER_ARM_LEN/2, 0, 0);
    drawCylinderX(1, GRIPPER_ARM_LEN);
    glTranslatef (GRIPPER_ARM_LEN/2, 0, 0);
    glRotatef(a + 90, 0, 1, 0);
    drawCylinderY(1, 2);
    glTranslatef(1, 0, 0);
    drawCylinderX(1, 2);
    glPopMatrix();*/
}
Пример #9
0
void ArmGLWidget::drawArm(ArmAstroAngles A)
{
    // Rover!
    glColor3f (.5, .5, .5);
    glTranslatef (-35, 5, 15);
    drawBox(45, 15, 45);
    glTranslatef (35, -5, -15);

    glColor3f (1, 1, 1);

    // Testing
    matrix m = MatrixTranslate(0, 0, 0);

    //m = MatrixRotateY(A.base.rotation) * m;
    m = MatrixTranslate (-ArmController::BASE_OFFSET, 0, 0) * m;

    m = MatrixRotateZ(A.base.shoulder) * m;
    m = MatrixTranslate(ArmController::SEG1_LEN, 0, 0) * m;

    //m = MatrixTranslate(0, 0, -OFFSET) * m;
    m = MatrixRotateZ(A.base.elbow - 180) * m;
    m = MatrixTranslate(40, 0, 0) * m;


    glPushMatrix();
        glMultMatrixf (*(m.array));
        drawBox(1, 1, 1);
    glPopMatrix();

    glColor3f (1, 0, 0);

    // Draw arm box
    drawBox(15, 5, 15);

    glRotatef(A.base.rotation, 0, 1, 0);
    glTranslatef(0, 3.5, 0);
    drawCylinderY(3, 2);
    glTranslatef(-ArmController::BASE_OFFSET, 2, 0);
    drawCylinderZ(2, 6);


    glColor3f (0, 1, 0);

    glRotatef (A.base.shoulder, 0, 0, 1);//g.RotateTransform(-A.thetaS, System..Drawing2D.MatrixOrder.Prepend);
    glTranslatef(ArmController::SEG1_LEN/2, 0, 0);
    drawCylinderX(2, ArmController::SEG1_LEN);
    glTranslatef(ArmController::SEG1_LEN/2, 0, -ArmController::OFFSET/2);
    drawCylinderZ(2, ArmController::OFFSET + 4);
    glTranslatef(0, 0, -ArmController::OFFSET/2);

    glColor3f (1, 1, 0);

    // Elbow to wrist elevation
    glRotatef (A.base.elbow - 180, 0, 0, 1);//g.RotateTransform(180 - A.thetaE, System.Drawing.Drawing2D.MatrixOrder.Prepend);
    float elbowToEnd = 20;
    glTranslatef (elbowToEnd/2, 0, 0);
    drawCylinderX(2, elbowToEnd);
    glTranslatef (elbowToEnd/2, 0, 0);
    drawCylinderZ(2, 4);


    //glColor3f (0, 0, 1);
    // Wirst elevation to wrist rotate
    //glRotatef(-A.wristElevation, 0, 0, 1);//g.RotateTransform(A.thetaW, System.Drawing.Drawing2D.MatrixOrder.Prepend);

    //glTranslatef(ArmController::END_EFFECTOR_MID/2, 0, 0);
    //drawCylinderX(2, ArmController::END_EFFECTOR_MID);
    //glTranslatef(ArmController::END_EFFECTOR_MID/2, 0, 0);
    //drawCylinderY(2, 4);

    glColor3f (1, 0, 1);

    float GRIPPER_ARM_LEN = 8;
    //float HALF = ArmController::END_EFFECTOR_END - GRIPPER_ARM_LEN; // Point of rotation servo
    //glRotatef(A.writsTip, 0, 1, 0);
    //glTranslatef(HALF/2, 0, 0);
    //drawCylinderX(2, HALF);
    //glTranslatef(HALF/2, 0, 0);

    //glColor3f (0, 1, 1);

    static float r = 0;
    r += 7;

    //glRotatef (A.wristRotation, 1, 0, 0);

    // CLAMPY CLAMPY!
    static float a = 0;
    a = sind(r) * 15;
    drawCylinderX(4, 1);
    glPushMatrix();
    glTranslatef(0, 0, -4);
    drawCylinderY(1, 2);
    glRotatef(a, 0, 1, 0);
    glTranslatef (GRIPPER_ARM_LEN/2, 0, 0);
    drawCylinderX(1, GRIPPER_ARM_LEN);
    glTranslatef (GRIPPER_ARM_LEN/2, 0, 0);
    glRotatef(-a - 90, 0, 1, 0);
    drawCylinderY(1, 2);
    glTranslatef(1, 0, 0);
    drawCylinderX(1, 2);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0, 0, 4);
    drawCylinderY(1, 2);
    glRotatef(-a, 0, 1, 0);
    glTranslatef (GRIPPER_ARM_LEN/2, 0, 0);
    drawCylinderX(1, GRIPPER_ARM_LEN);
    glTranslatef (GRIPPER_ARM_LEN/2, 0, 0);
    glRotatef(a + 90, 0, 1, 0);
    drawCylinderY(1, 2);
    glTranslatef(1, 0, 0);
    drawCylinderX(1, 2);
    glPopMatrix();
}
Пример #10
0
static int vmatrix_MatrixTranslate (lua_State *L) {
  MatrixTranslate(luaL_checkvmatrix(L, 1), luaL_checkvector(L, 2));
  return 0;
}