示例#1
0
void animSequencePlay( tAnimSequence const* pAnimSequence,
                       tAnimHierarchy const* pAnimHierarchy,
                       tVector4* aPositions,
                       tVector4* aScalings,
                       tQuaternion* aRotations,
                       tVector4* aRotationVecs,
                       tMatrix44* aAnimMatrices,
                       float fTime )
{
    float fNumLoops = floorf( fTime / pAnimSequence->mfLastTime );
    float fFrameTime = fTime - fNumLoops * pAnimSequence->mfLastTime;
    
    // key frame for the joints
    int iNumJoints = pAnimSequence->miNumJoints;
    for( int i = 0; i < iNumJoints; i++ )
    {
        int iStart = pAnimSequence->maiStartFrames[i];
        int iEnd = pAnimSequence->maiEndFrames[i];
        
        // no valid animation frame for this joint
        if( iStart < 0 || iEnd < 0 )
        {
            continue;
        }
     
        // find the ending frame
        int iEndFrame = iStart;
        for( iEndFrame = iStart; iEndFrame <= iEnd; iEndFrame++ )
        {
            if( pAnimSequence->mafTime[iEndFrame] > fFrameTime )
            {
                break;
            }
            
        }   // for end frame = start to end
        
        // didn't find end frame
        if( iEndFrame > iEnd )
        {
            iEndFrame = iEnd;
        }
        
        int iStartFrame = iEndFrame - 1;
        if( iStartFrame < 0 )
        {
            iStartFrame = 0;
        }
        
        // just at the start
        if( iStartFrame < iStart )
        {
            iStartFrame = iStart;
        }
        
        WTFASSERT2( iStartFrame >= iStart && iStartFrame <= iEnd, "out of bounds looking for start animation frame" );
        WTFASSERT2( iEndFrame >= iStart && iEndFrame <= iEnd, "out of bounds looking for end animation frame" );
        
        float fTimeDuration = pAnimSequence->mafTime[iEndFrame] - pAnimSequence->mafTime[iStartFrame];
        float fTimeFromStart = fFrameTime - pAnimSequence->mafTime[iStartFrame];
        float fPct = 0.0f;
        
        if( fTimeDuration > 0.0f )
        {
            fPct = fTimeFromStart / fTimeDuration;
        }
        
        // clamp pct
        if( fPct > 1.0f )
        {
            fPct = 1.0f;
        }
        
        Vector4Lerp( &aPositions[i],
                     &pAnimSequence->maPositions[iStartFrame],
                     &pAnimSequence->maPositions[iEndFrame],
                     fPct );
        
        Vector4Lerp( &aScalings[i],
                     &pAnimSequence->maScalings[iStartFrame],
                     &pAnimSequence->maScalings[iEndFrame],
                     fPct );
        
        quaternionSlerp( &aRotations[i],
                         &pAnimSequence->maRotation[iStartFrame],
                         &pAnimSequence->maRotation[iEndFrame],
                         fPct );
        
        Vector4Lerp( &aRotationVecs[i],
                     &pAnimSequence->maRotationVec[iStartFrame],
                     &pAnimSequence->maRotationVec[iEndFrame],
                     fPct );
        
#if 0
        tJoint* pJoint = pAnimSequence->mapJoints[iStart];
        
        tJob job;
        tKeyFrameJobData interpJobData;
        
        interpJobData.mfPct = fPct;
        interpJobData.mpPos0 = &pAnimSequence->maPositions[iStartFrame];
        interpJobData.mpPos1 = &pAnimSequence->maPositions[iEndFrame];
        interpJobData.mpScale0 = &pAnimSequence->maScalings[iStartFrame];
        interpJobData.mpScale1 = &pAnimSequence->maScalings[iEndFrame];
        interpJobData.mpRot0 = &pAnimSequence->maRotation[iStartFrame];
        interpJobData.mpRot1 = &pAnimSequence->maRotation[iEndFrame];
        interpJobData.mpResultPos = &aPositions[i];
        interpJobData.mpResultScale = &aScalings[i];
        interpJobData.mpResultRot = &aRotations[i];
        interpJobData.mpJoint = pJoint;
        
        interpJobData.mpRotVec0 = &pAnimSequence->maRotationVec[iStartFrame];
        interpJobData.mpRotVec1 = &pAnimSequence->maRotationVec[iEndFrame];
        interpJobData.mpResultRotVec = &aRotationVecs[i];
        
        job.mpfnFunc = interpolateJob;
        job.mpData = &interpJobData;
        job.miDataSize = sizeof( tKeyFrameJobData );
        
        jobManagerAddJob( gpJobManager, &job );
#endif // #if 0
    }

#if 0
        tVector4* pScale = &aScalings[i];
        tVector4* pPosition = &aPositions[i];
        
        // interpolate position, scale, and rotation
        Vector4Lerp( pPosition,
                     &pAnimSequence->maPositions[iEndFrame],
                     &pAnimSequence->maPositions[iStartFrame],
                     fPct );
        
        Vector4Lerp( pScale,
                     &pAnimSequence->maScalings[iEndFrame],
                     &pAnimSequence->maScalings[iStartFrame],
                     fPct );
        
        quaternionSlerp( &aRotations[i],
                         &pAnimSequence->maRotation[iEndFrame],
                         &pAnimSequence->maRotation[iStartFrame],
                         fPct );
    
    jobManagerWait( gpJobManager );
#endif // #if 0
    
    for( int i = 0; i < iNumJoints; i++ )
    {
        int iStart = pAnimSequence->maiStartFrames[i];
        int iEnd = pAnimSequence->maiEndFrames[i];
        
        // no valid animation frame for this joint
        if( iStart < 0 || iEnd < 0 )
        {
            continue;
        }
        
#if 0
        tJob job;
        tMatrixJobData matrixJobData;
        matrixJobData.mpPosition = &aPositions[i];
        matrixJobData.mpRotation = &aRotations[i];
        matrixJobData.mpScale = &aScalings[i];
        matrixJobData.mpResultMat = &aAnimMatrices[i];
        matrixJobData.mpJoint = pAnimSequence->mapUniqueJoints[i];
        
        matrixJobData.mpRotationVec = &aRotationVecs[i];
        
        job.mpfnFunc = &matrixUpdateJob;
        job.mpData = &matrixJobData;
        job.miDataSize = sizeof( tMatrixJobData );
        
        jobManagerAddJob( gpJobManager, &job );
#endif // #if 0
        
        tMatrix44 posMatrix, scaleMatrix, rotMatrix, posRotMatrix;
        //quaternionToMatrix( &rotMatrix, pMatrixData->mpRotation );
        
        tMatrix44 rotMatZY, rotMatX, rotMatY, rotMatZ;
        Matrix44RotateX( &rotMatX, aRotationVecs[i].fX );
        Matrix44RotateY( &rotMatY, aRotationVecs[i].fY );
        Matrix44RotateZ( &rotMatZ, aRotationVecs[i].fZ );
        
        Matrix44Multiply( &rotMatZY, &rotMatZ, &rotMatY );
        Matrix44Multiply( &rotMatrix, &rotMatZY, &rotMatX );
        
        
        Matrix44Scale( &scaleMatrix, aScalings[i].fX, aScalings[i].fY, aScalings[i].fZ );
        Matrix44Translate( &posMatrix, &aPositions[i] );
        Matrix44Multiply( &posRotMatrix, &posMatrix, &rotMatrix );
        
        Matrix44Multiply( &aAnimMatrices[i], &posRotMatrix, &scaleMatrix );
        
#if 0
        // concat for animation matrix
        tMatrix44 posMatrix, scaleMatrix, rotMatrix, posRotMatrix;
        quaternionToMatrix( &rotMatrix, &aRotations[i] );
        Matrix44Scale( &scaleMatrix, pScale->fX, pScale->fY, pScale->fZ );
        Matrix44Translate( &posMatrix, pPosition );
        Matrix44Multiply( &posRotMatrix, &posMatrix, &rotMatrix );
        
        tMatrix44* pAnimMatrix = &aAnimMatrices[i];
        Matrix44Multiply( pAnimMatrix, &posRotMatrix, &scaleMatrix );
#endif // #if 0
        
    }   // for i = 0 to num joints
    
    jobManagerWait( gpJobManager );
}
void main(void)\n\
{  \n\
   float fTime0_X = parameters[0][0];\n\
   vec4 coreSeed = parameters[1];\n\
\n\
   vec3 rayDir = normalize(objectPosition * vec3(1.0, 0.6, 1.0));\n\
   vec3 camPos = vec3(0.0, 0.0, -parameters[0][1]);\n\
   \n\
   // rotate camera around y axis\n\
   float alpha = parameters[0][2] * 4.5f;\n\
   camPos.xz = vec2(cos(alpha)*camPos.x - sin(alpha)*camPos.z,\n\
                    sin(alpha)*camPos.x + cos(alpha)*camPos.z);\n\
   rayDir.xz = vec2(cos(alpha)*rayDir.x - sin(alpha)*rayDir.z,\n\
                    sin(alpha)*rayDir.x + cos(alpha)*rayDir.z);\n\
   \n\
   vec3 rayPos = camPos;\n\
   float sceneSize = 8.0;\n\
   vec3 totalColor = vec3(0.);\n\
   float stepSize;\n\
   float totalDensity = 0.0;\n\
   float stepDepth = 0.0; // how far I went already.\n\
   \n\
   for(int step = 0; length(rayPos)<sceneSize && totalDensity < 0.9 && step < 50; step++)\n\
   {      \n\
      float implicitVal;\n\
      \n\
      // This stuff is the transformation information from previous stuff\n\
	  float transer = parameters[0][3];\n\
      vec4 prevQuaternion = vec4(cos(transer), sin(transer), sin(transer * 1.3), sin(transer * 2.7));\n\
      prevQuaternion = normalize(prevQuaternion);\n\
      float prevLength = 1.0;\n\
      vec3 prevMover = vec3(0.0);\n\
      vec3 prevColor = vec3(1.0, 0.4, 0.2);\n\
      \n\
      // Multiple boxes\n\
      implicitVal = 1.0e10;\n\
      \n\
      for (int loop = 0; loop < 12; loop++)\n\
      {\n\
         vec4 newQuaternion;\n\
         float newLength;\n\
         vec3 newMover;\n\
         vec3 newColor;\n\
         \n\
         mat3 prevRotationMatrix = quaternionToMatrix(prevQuaternion);\n\
\n\
         // Loop for solid stuff\n\
         vec4 seed = coreSeed;\n\
         for (int k = 0; k < 4; k++)\n\
         {\n\
            seed = randomIteration(seed);\n\
            vec4 quaternion = normalize(seed - vec4(0.5));\n\
            mat3 rotationMatrix = quaternionToMatrix(quatMult(quaternion, prevQuaternion));\n\
            vec3 lengthes = seed.xyz * seed.xyz * seed.xyz * seed.xyz * vec3(0.2) + vec3(0.05);\n\
            lengthes *= prevLength;\n\
            vec3 mover = 0.5*seed.wzx - vec3(0.25);\n\
            mover = (mover * prevRotationMatrix * prevLength) + prevMover;\n\
            float curImplicitVal = getDistance(rotationMatrix, lengthes, mover, rayPos);\n\
            implicitVal = min(implicitVal, curImplicitVal);\n\
         }\n\
         \n\
         // Non-solid:\n\
         float nonSolidDist = 1.0e10;\n\
         for (int k = 0; k < 2; k++)\n\
         {\n\
            seed = randomIteration(seed);\n\
            vec4 quaternion = normalize(seed - vec4(0.5));\n\
            quaternion = quatMult(quaternion, prevQuaternion);\n\
            vec3 lengthes = seed.xyz * vec3(0.3) + vec3(0.25);\n\
            lengthes *= prevLength;\n\
            vec3 mover = 0.5*seed.wzx - vec3(0.25);\n\
            mover = (mover * prevRotationMatrix * prevLength) + prevMover;\n\
            float curImplicitVal = getSphereDistance(lengthes.x, mover, rayPos);\n\
            if (curImplicitVal < nonSolidDist)\n\
            {\n\
               nonSolidDist = curImplicitVal;\n\
               newQuaternion = quaternion;\n\
               newLength = lengthes.x;\n\
               newMover = mover;\n\
               newColor = seed.xyz;\n\
            }\n\
         }\n\
         \n\
         if (nonSolidDist > implicitVal)\n\
         {\n\
            // I will not get closer than where I am now.\n\
            break;\n\
         }\n\
         else\n\
         {\n\
            prevQuaternion = newQuaternion;\n\
            prevLength = newLength;\n\
            prevMover = newMover;\n\
            prevColor = 0.5 * prevColor + 0.5 * newColor;      \n\
         }\n\
      }\n\
      \n\
      // I need to do this distance related to for the DOF!      \n\
      totalColor += vec3(1./50., 1./70., 1./90.) *\n\
                    1.7 / exp(abs(implicitVal*5.) + 0.0) * 1.8;\n\
      totalDensity += 1./ 15. / exp(abs(implicitVal*10.0) + 0.5);\n\
                      // *(1.0 - cos(fTime0_X*3.)*0.5);\n\
      //if (implicitVal < 0.0)\n\
      stepDepth += abs(implicitVal) * 0.95;      \n\
      {\n\
         // TODO: I could make this distance-related, with offset to get the size right?\n\
         float localDensity = implicitVal < 0.0 ? 1.0 : 0.0;\n\
         totalColor = totalColor + (1.-totalDensity) * prevColor * localDensity;\n\
         totalDensity = totalDensity + (1.05-totalDensity) * localDensity;\n\
      }\n\
      \n\
      stepSize = abs(implicitVal) * 0.99;\n\
      stepSize = max(0.005 * stepDepth, stepSize);\n\
      rayPos += rayDir * stepSize;\n\
   }\n\
   \n\
   float grad = normalize(rayDir).y;\n\
   totalColor += (1.-totalDensity) * (grad * vec3(0.0,-0.4,-0.3) + (1.-grad)*vec3(0.0,0.4,0.6));\n\
   \n\
   gl_FragColor = vec4(totalColor-vec3(0.0), 1.0);\n\
}\n\