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; }