Beispiel #1
0
bool Mesh::loadMesh( const char * objectFilename )
{
  Assimp::Importer importer;
  unsigned int index, vertexNum;

  //read from file
  const aiScene* pScene = importer.ReadFile( objectFilename, aiProcess_Triangulate );

  // if scene is not good
  if( !pScene )
  {
    // print erorr
    printf("Error parsing '%s'\n", objectFilename);
    return false;
  }

  // create aiMesh
  aiMesh* mesh = pScene -> mMeshes[0];

  // loop through each face
  for( index = 0; index < mesh-> mNumFaces; index++ )
  {
    // create aiFace
    const aiFace& face = mesh -> mFaces[index];

    // loop through each face in each vertex
    for( vertexNum = 0; vertexNum < 3; vertexNum++ )
    {
      aiVector3D tempPos = mesh -> mVertices[face.mIndices[vertexNum]];
      Vertex tempVertex;

      // save x y and z for each vertex
      tempVertex.position[0] = tempPos.x;
      tempVertex.position[1] = tempPos.y;
      tempVertex.position[2] = tempPos.z;

      // if has texture, save uv values
      if( mesh->HasTextureCoords(0) )
      {
        aiVector3D tempTex = mesh -> mTextureCoords[0][face.mIndices[vertexNum]];
        tempVertex.uv[0] = tempTex.x;
        tempVertex.uv[1] = tempTex.y;
      }
      // if no texture, save 0 for uv values
      else 
      {
        aiVector3D tempTex(0.0f, 0.0f, 0.0f);
        tempVertex.uv[0] = tempTex.x;
        tempVertex.uv[1] = tempTex.y;
      }

      // push vertex to geometry
      geometry.push_back(tempVertex);      
    }
  }

  // return success
  return true;
}
void GrConfigConversionEffect::TestForPreservingPMConversions(GrContext* context,
                                                              PMConversion* pmToUPMRule,
                                                              PMConversion* upmToPMRule) {
    *pmToUPMRule = kNone_PMConversion;
    *upmToPMRule = kNone_PMConversion;
    SkAutoTMalloc<uint32_t> data(256 * 256 * 3);
    uint32_t* srcData = data.get();
    uint32_t* firstRead = data.get() + 256 * 256;
    uint32_t* secondRead = data.get() + 2 * 256 * 256;

    // Fill with every possible premultiplied A, color channel value. There will be 256-y duplicate
    // values in row y. We set r,g, and b to the same value since they are handled identically.
    for (int y = 0; y < 256; ++y) {
        for (int x = 0; x < 256; ++x) {
            uint8_t* color = reinterpret_cast<uint8_t*>(&srcData[256*y + x]);
            color[3] = y;
            color[2] = SkTMin(x, y);
            color[1] = SkTMin(x, y);
            color[0] = SkTMin(x, y);
        }
    }

    GrSurfaceDesc desc;
    desc.fFlags = kRenderTarget_GrSurfaceFlag;
    desc.fWidth = 256;
    desc.fHeight = 256;
    desc.fConfig = kRGBA_8888_GrPixelConfig;

    SkAutoTUnref<GrTexture> readTex(context->textureProvider()->createTexture(desc, true, nullptr, 0));
    if (!readTex.get()) {
        return;
    }
    SkAutoTUnref<GrTexture> tempTex(context->textureProvider()->createTexture(desc, true, nullptr, 0));
    if (!tempTex.get()) {
        return;
    }
    desc.fFlags = kNone_GrSurfaceFlags;
    SkAutoTUnref<GrTexture> dataTex(context->textureProvider()->createTexture(desc, true, data, 0));
    if (!dataTex.get()) {
        return;
    }

    static const PMConversion kConversionRules[][2] = {
        {kDivByAlpha_RoundDown_PMConversion, kMulByAlpha_RoundUp_PMConversion},
        {kDivByAlpha_RoundUp_PMConversion, kMulByAlpha_RoundDown_PMConversion},
    };

    bool failed = true;

    for (size_t i = 0; i < SK_ARRAY_COUNT(kConversionRules) && failed; ++i) {
        *pmToUPMRule = kConversionRules[i][0];
        *upmToPMRule = kConversionRules[i][1];

        static const SkRect kDstRect = SkRect::MakeWH(SkIntToScalar(256), SkIntToScalar(256));
        static const SkRect kSrcRect = SkRect::MakeWH(SK_Scalar1, SK_Scalar1);
        // We do a PM->UPM draw from dataTex to readTex and read the data. Then we do a UPM->PM draw
        // from readTex to tempTex followed by a PM->UPM draw to readTex and finally read the data.
        // We then verify that two reads produced the same values.

        GrPaint paint1;
        GrPaint paint2;
        GrPaint paint3;
        SkAutoTUnref<GrFragmentProcessor> pmToUPM1(new GrConfigConversionEffect(
                paint1.getProcessorDataManager(), dataTex, false, *pmToUPMRule, SkMatrix::I()));
        SkAutoTUnref<GrFragmentProcessor> upmToPM(new GrConfigConversionEffect(
                paint2.getProcessorDataManager(), readTex, false, *upmToPMRule, SkMatrix::I()));
        SkAutoTUnref<GrFragmentProcessor> pmToUPM2(new GrConfigConversionEffect(
                paint3.getProcessorDataManager(), tempTex, false, *pmToUPMRule, SkMatrix::I()));

        paint1.addColorFragmentProcessor(pmToUPM1);


        SkAutoTUnref<GrDrawContext> readDrawContext(context->drawContext());
        if (!readDrawContext) {
            failed = true;
            break;
        }

        readDrawContext->drawNonAARectToRect(readTex->asRenderTarget(),
                                             GrClip::WideOpen(),
                                             paint1,
                                             SkMatrix::I(),
                                             kDstRect,
                                             kSrcRect);

        readTex->readPixels(0, 0, 256, 256, kRGBA_8888_GrPixelConfig, firstRead);

        paint2.addColorFragmentProcessor(upmToPM);

        SkAutoTUnref<GrDrawContext> tempDrawContext(context->drawContext());
        if (!tempDrawContext) {
            failed = true;
            break;
        }
        tempDrawContext->drawNonAARectToRect(tempTex->asRenderTarget(),
                                             GrClip::WideOpen(),
                                             paint2,
                                             SkMatrix::I(),
                                             kDstRect,
                                             kSrcRect);

        paint3.addColorFragmentProcessor(pmToUPM2);

        readDrawContext.reset(context->drawContext());
        if (!readDrawContext) {
            failed = true;
            break;
        }

        readDrawContext->drawNonAARectToRect(readTex->asRenderTarget(),
                                             GrClip::WideOpen(),
                                             paint3,
                                             SkMatrix::I(),
                                             kDstRect,
                                             kSrcRect);

        readTex->readPixels(0, 0, 256, 256, kRGBA_8888_GrPixelConfig, secondRead);

        failed = false;
        for (int y = 0; y < 256 && !failed; ++y) {
            for (int x = 0; x <= y; ++x) {
                if (firstRead[256 * y + x] != secondRead[256 * y + x]) {
                    failed = true;
                    break;
                }
            }
        }
    }
    if (failed) {
        *pmToUPMRule = kNone_PMConversion;
        *upmToPMRule = kNone_PMConversion;
    }
}