Exemple #1
0
void* ImageSequenceMovieSaver::frameSavingThreadMethod(void)
	{
	unsigned int frameIndex=0;
	while(true)
		{
		/* Wait for the next frame: */
		FrameBuffer frame;
		{
		Threads::MutexCond::Lock captureLock(captureCond);
		while(!done&&capturedFrames.empty())
			captureCond.wait(captureLock);
		if(capturedFrames.empty()) // Bail out if there will be no more frames
			break;
		frame=capturedFrames.front();
		capturedFrames.pop_front();
		}
		
		/* Open the next frame image file: */
		char frameName[1024];
		snprintf(frameName,sizeof(frameName),frameNameTemplate.c_str(),frameIndex);
		++frameIndex;
		Misc::File frameFile(frameName,"wb");
		
		/* Get the image from the frame buffer: */
		int width=frame.getFrameSize()[0];
		int height=frame.getFrameSize()[1];
		const unsigned char* buffer=frame.getBuffer();
		
		/* Write the PPM header: */
		fprintf(frameFile.getFilePtr(),"P6\n");
		fprintf(frameFile.getFilePtr(),"%d %d\n",width,height);
		fprintf(frameFile.getFilePtr(),"255\n");
		
		/* Write each row of the frame buffer: */
		for(int y=height-1;y>=0;--y)
			frameFile.write(buffer+y*width*3,width*3);
		}
	
	return 0;
	}
// Returns true if there was an error preloading this asset, false otherwise
bool ulAssetManager::preload(std::string character, std::string expression)
{
    if (character == "" || expression == "")
    {
        // There's nothing to preload so who cares
        return false;
    }

    std::pair<std::string, std::string> key(character, expression);
    if (assets.find(key) != assets.end())
    {
        // We already preloaded this
        return true;
    }

    if (!doc.HasMember(character.c_str()))
    {
        std::cerr<<"Invalid character name: "<<character<<std::endl;
        return true;
    }
    rapidjson::Value& charValue = doc[character.c_str()];

    if (!charValue.HasMember(expression.c_str()))
    {
        std::cerr<<"Invalid expression name: "<<expression<<std::endl;
        return true;
    }
    rapidjson::Value& exprValue = charValue[expression.c_str()];

    // If we've gotten this far then let's assume there's a valid asset
    lineAsset asset;

    if (!exprValue.HasMember("sprites") || !exprValue["sprites"].IsArray())
    {
        std::cerr<<"No sprites available for character "<<character
                 <<" expressing "<<expression<<std::endl;
    }
    else
    {
        rapidjson::Value& spriteArray = exprValue["sprites"];

        if (spriteArray.Size() == 0)
        {
            asset.avatar.push_back("");
        }
        else
        {
            for (int i = 0; i < (int)spriteArray.Size(); ++i)
            {
                if (spriteArray[i].IsString())
                {
                    std::string filePath = spriteArray[i].GetString();
                    std::ifstream frameFile(progDir + filePath);
                    if (!frameFile.is_open())
                    {
                        std::cerr<<"Could not open frame "<<progDir + filePath<<std::endl;
                    }
                    else
                    {
                        std::string frame((std::istreambuf_iterator<char>(frameFile)),
                                                std::istreambuf_iterator<char>());
                        asset.avatar.push_back(frame);
                    }
                }
            }
        }
    }


    if (!exprValue.HasMember("speed"))
    {
        std::cerr<<"Invalid print speed for character "<<character
                 <<" expressing "<<expression<<std::endl;
        asset.printSpeed = 1.0f;
    }
    else
    {
        rapidjson::Value& speed = exprValue["speed"];
        asset.printSpeed = speed.GetDouble();
    }

    // No sounds for now so who cares
    asset.sound = "";

    //std::pair<std::string, std::string> key(character, expression);
    assets[key] = asset;
    return false;
}