TextureDataSource* DynamicTerrain::getTextureSource() { if( getTextureData() != NullFC ) { return &imageTextureSource_; } else { return 0; } }
SWIGEXPORT jobject JNICALL Java_org_scilab_modules_graphic_1objects_DataLoaderJNI_getTextureData(JNIEnv *jenv, jclass jcls, jint jarg1) { jobject jresult = 0 ; int arg1 ; JavaDirectBuffer result; (void)jenv; (void)jcls; arg1 = (int)jarg1; result = getTextureData(arg1); { if ((&result)->address) { jresult = (*jenv)->NewDirectByteBuffer(jenv, (&result)->address, (&result)->size); } } return jresult; }
// 导出DragonBones的骨骼数据(skeleton.xml) void DotaAnimParser::exportDBSkeletonData(const std::string &savePath, Dota_Skeleton_Data& dotaSkeletonData, ITextureAtlas& textureAtlas) { std::string strXml = "<dragonBones name=\""; strXml += dotaSkeletonData.name; strXml += "\" frameRate=\"24\" version=\"2.3\">\n"; strXml += " <armature name=\""; strXml += dotaSkeletonData.name; strXml += "\">\n"; for (int i = 0; i < (int)dotaSkeletonData.boneDataList.size(); i++) { Dota_Bone_Data * boneData = dotaSkeletonData.boneDataList[i]; strXml += " <bone name=\""; strXml += boneData->name; strXml += "\">\n"; Dota_Slot_Data * slotData = nullptr; Dota_First_Frame_Data::iterator iter; iter = dotaSkeletonData.firstFrameOfBoneMap.find(boneData->name); if (iter != dotaSkeletonData.firstFrameOfBoneMap.end()) slotData = iter->second; float x, y, skX, skY, scX, scY; if (slotData != nullptr) { x = slotData->x; y = slotData->y; skX = slotData->skX; skY = slotData->skY; scX = slotData->scX; scY = slotData->scY; } else { x = 0.f; y = 0.f; skX = 0.f; skY = 0.f; scX = 1.f; scY = 1.f; } strXml += " <transform x=\""; strXml += toString(x); strXml += "\" y=\""; strXml += toString(y); strXml += "\" skX=\""; strXml += toString(skX); strXml += "\" skY=\""; strXml += toString(skY); strXml += "\" scX=\""; strXml += toString(scX); strXml += "\" scY=\""; strXml += toString(scY); strXml += "\"/>\n"; strXml += " </bone>\n"; } strXml += " <skin name=\"default\">\n"; for (int i = 0; i < (int)dotaSkeletonData.boneDataList.size(); i++) { Dota_Bone_Data * boneData = dotaSkeletonData.boneDataList[i]; strXml += " <slot name=\""; strXml += boneData->name; strXml += "\" parent=\""; strXml += boneData->name; strXml += "\" z=\""; strXml += toString(boneData->index); strXml += "\">\n"; strXml += " <display name=\""; strXml += boneData->textureName+".png"; strXml += "\" type=\"image\">\n"; float width = 0, height = 0; TextureData * textureData = getTextureData(textureAtlas, boneData->textureName+".png"); if (textureData != nullptr) { if (textureData->rotated) { width = textureData->region.height; height = textureData->region.width; } else { width = textureData->region.width; height = textureData->region.height; } } else { int xxx = 0; xxx++; } strXml += " <transform x=\""; strXml += toString(0); strXml += "\" y=\""; strXml += toString(0); strXml += "\" skX=\""; strXml += toString(0); strXml += "\" skY=\""; strXml += toString(0); strXml += "\" scX=\""; strXml += toString(1); strXml += "\" scY=\""; strXml += toString(1); strXml += "\" pX=\""; strXml += toString(width/2); strXml += "\" pY=\""; strXml += toString(height/2); strXml += "\"/>\n"; strXml += " </display>\n"; strXml += " </slot>\n"; } strXml += " </skin>\n"; for (int i = 0; i < (int)dotaSkeletonData.animDataList.size(); i++) { Dota_Anim_Data * animData = dotaSkeletonData.animDataList[i]; std::map<std::string, Dota_Anim_Data2 *>::iterator iter; iter = dotaSkeletonData.animDataMap.find(animData->name); if (iter == dotaSkeletonData.animDataMap.end()) continue; Dota_Anim_Data2 * animData2 = iter->second; int frameCount = (int)animData->frameDataList.size(); strXml += " <animation name=\""; strXml += iter->first; strXml += "\" duration=\""; strXml += toString(frameCount); strXml += "\" fadeInTime=\"0.3\" scale=\"1\" loop=\"0\" autoTween=\"1\" tweenEasing=\"NaN\">\n"; Dota_Anim_Data2::iterator iter2; for (iter2 = animData2->begin(); iter2 != animData2->end(); iter2++) { strXml += " <timeline name=\""; strXml += iter2->first; strXml += "\" scale=\"1\" offset=\"0\">\n"; Dota_Timeline_Data * timelineData = iter2->second; int nBlankKeyframes = 0; for (int j = 0; j < frameCount; j++) { Dota_Timeline_Data::iterator iter3 = timelineData->find(toString(j)); if (iter3 != timelineData->end()) { Dota_Slot_Data * slotData = iter3->second; if (nBlankKeyframes > 0) { strXml += " <frame duration=\""; strXml += toString(nBlankKeyframes); if (!slotData->soundName.empty()) { strXml += "\" sound=\""; strXml += slotData->soundName; } strXml += "\" displayIndex=\"-1\"/>\n"; nBlankKeyframes = 0; } strXml += " <frame z=\""; strXml += toString(slotData->zOrder); if (!slotData->soundName.empty()) { strXml += "\" sound=\""; strXml += slotData->soundName; } strXml += "\" duration=\"1\">\n"; strXml += " <transform x=\""; strXml += toString(slotData->x); strXml += "\" y=\""; strXml += toString(slotData->y); strXml += "\" skX=\""; strXml += toString(slotData->skX); strXml += "\" skY=\""; strXml += toString(slotData->skY); strXml += "\" scX=\""; strXml += toString(slotData->scX); strXml += "\" scY=\""; strXml += toString(slotData->scY); strXml += "\" pX=\""; strXml += toString(0); strXml += "\" pY=\""; strXml += toString(0); strXml += "\"/>\n"; if (slotData->opacity != 255) { strXml += " <colorTransform aO=\"0\" rO=\"0\" gO=\"0\" bO=\"0\" aM=\""; strXml += toString((int)((float)slotData->opacity/255*100)); strXml += "\" rM=\"100\" gM=\"100\" bM=\"100\"/>\n"; } strXml += " </frame>\n"; } else { nBlankKeyframes++; } } if (nBlankKeyframes > 0) { strXml += " <frame duration=\""; strXml += toString(nBlankKeyframes); strXml += "\" displayIndex=\"-1\"/>\n"; nBlankKeyframes = 0; } strXml += " </timeline>\n"; } strXml += " </animation>\n"; } strXml += " </armature>\n"; strXml += "</dragonBones>\n"; std::string fileName = savePath + "/skeleton.xml"; FILE* fp = fopen(fileName.c_str(), "wb"); if (fp) { fwrite(strXml.c_str(), strXml.size(), 1, fp); fclose(fp); } }
// 解析出DB骨骼数据 DragonBonesData* DotaAnimParser::parseDragonBonesData( Dota_Skeleton_Data& dotaSkeletonData, ITextureAtlas& textureAtlas, float scale/* = 1.f*/) { _armatureScale = scale; _frameRate = 24; DragonBonesData *dragonBonesData = new DragonBonesData(); dragonBonesData->name = dotaSkeletonData.name; ArmatureData *armatureData = new ArmatureData(); armatureData->name = dotaSkeletonData.name; for (int i = 0; i < (int)dotaSkeletonData.boneDataList.size(); i++) { Dota_Bone_Data * dotaBoneData = dotaSkeletonData.boneDataList[i]; BoneData *boneData = new BoneData(); boneData->name = dotaBoneData->name; boneData->length = 0; boneData->inheritRotation = true; boneData->inheritScale = false; Dota_Slot_Data * slotData = nullptr; Dota_First_Frame_Data::iterator iter; iter = dotaSkeletonData.firstFrameOfBoneMap.find(dotaBoneData->name); if (iter != dotaSkeletonData.firstFrameOfBoneMap.end()) slotData = iter->second; if (slotData != nullptr) setTransform(boneData->global, slotData->x, slotData->y, slotData->skX, slotData->skY, slotData->scX, slotData->scY); else setTransform(boneData->global, 0, 0, 0, 0, 1, 1); boneData->transform = boneData->global; armatureData->boneDataList.push_back(boneData); } SkinData *skinData = new SkinData(); skinData->name = "default"; for (int i = 0; i < (int)dotaSkeletonData.boneDataList.size(); i++) { Dota_Bone_Data * dotaBoneData = dotaSkeletonData.boneDataList[i]; SlotData *slotData = new SlotData(); slotData->name = dotaBoneData->name; slotData->parent = dotaBoneData->name; slotData->zOrder = dotaBoneData->index; DisplayData *displayData = new DisplayData(); displayData->name = dotaBoneData->textureName + ".png"; displayData->type = DisplayType::DT_IMAGE; displayData->scalingGrid = false; setTransform(displayData->transform, 0, 0, 0, 0, 1, 1); TextureData * textureData = getTextureData(textureAtlas, displayData->name); if (textureData->rotated) { displayData->pivot.x = textureData->region.height / 2 / _armatureScale; displayData->pivot.y = textureData->region.width / 2 / _armatureScale; } else { displayData->pivot.x = textureData->region.width / 2 / _armatureScale; displayData->pivot.y = textureData->region.height / 2 / _armatureScale; } slotData->displayDataList.push_back(displayData); skinData->slotDataList.push_back(slotData); } armatureData->skinDataList.push_back(skinData); transformArmatureData(armatureData); armatureData->sortBoneDataList(); for (int i = 0; i < (int)dotaSkeletonData.animDataList.size(); i++) { Dota_Anim_Data * dotaAnimData = dotaSkeletonData.animDataList[i]; AnimationData *animationData = new AnimationData(); animationData->name = dotaAnimData->name; animationData->frameRate = _frameRate; animationData->duration = (int)(round((int)dotaAnimData->frameDataList.size() * 1000.f / _frameRate)); animationData->playTimes = 0; animationData->fadeTime = 0.f; //0.3f; animationData->scale = 1; // use frame tweenEase, NaN // overwrite frame tweenEase, [-1, 0):ease in, 0:line easing, (0, 1]:ease out, (1, 2]:ease in out animationData->tweenEasing = USE_FRAME_TWEEN_EASING; animationData->autoTween = true; parseTimeline(*animationData); std::map<std::string, Dota_Anim_Data2 *>::iterator iter; iter = dotaSkeletonData.animDataMap.find(dotaAnimData->name); if (iter == dotaSkeletonData.animDataMap.end()) continue; Dota_Anim_Data2 * dotaAnimData2 = iter->second; Dota_Anim_Data2::iterator iter2; for (iter2 = dotaAnimData2->begin(); iter2 != dotaAnimData2->end(); iter2++) { Dota_Timeline_Data * dataTimelineData2 = iter2->second; TransformTimeline *timeline = new TransformTimeline(); timeline->name = iter2->first; timeline->scale = 1; timeline->offset = 0; timeline->duration = animationData->duration; int nBlankKeyframes = 0; for (int j = 0; j < (int)dotaAnimData->frameDataList.size(); j++) { Dota_Timeline_Data::iterator iter3 = dataTimelineData2->find(toString(j)); if (iter3 != dataTimelineData2->end()) { Dota_Slot_Data * slotData = iter3->second; if (nBlankKeyframes > 0) { TransformFrame *frame = newBlankKeyframes(nBlankKeyframes, slotData->soundName); timeline->frameList.push_back(frame); nBlankKeyframes = 0; } TransformFrame *frame = newKeyframes(slotData->zOrder, slotData->opacity, slotData->x, slotData->y, slotData->skX, slotData->skY, slotData->scX, slotData->scY, slotData->soundName); timeline->frameList.push_back(frame); } else { nBlankKeyframes++; } } if (nBlankKeyframes > 0) { TransformFrame *frame = newBlankKeyframes(nBlankKeyframes, ""); timeline->frameList.push_back(frame); nBlankKeyframes = 0; } parseTimeline(*timeline); animationData->timelineList.push_back(timeline); } addHideTimeline(animationData, armatureData); transformAnimationData(animationData, armatureData); armatureData->animationDataList.push_back(animationData); } dragonBonesData->armatureDataList.push_back(armatureData); return dragonBonesData; }
void DynamicTerrain::changed( BitVector whichField, UInt32 origin ) { Inherited::changed( whichField, origin ); // todo: prevent multiple initializations: (how?) if( ( whichField & DynamicTerrain::HeightDataFieldMask ) ) { // heightdata image changed: use the image as data source and reinitialize the data structures: imageHeightSource_.setImage( getHeightData() ); std::cerr << "HeightDataField changed" << std::endl; needInitialize_ = true; } if( ( whichField & DynamicTerrain::TextureDataFieldMask ) ) { imageTextureSource_.setImage( getTextureData() ); needInitialize_ = true; } if( ( whichField & DynamicTerrain::LevelSizeFieldMask ) ) { // the level size has changed: we need to reinitialize: needInitialize_ = true; } if( whichField & DynamicTerrain::UseGpuRendererFieldMask ) { // todo: change the used renderer } if( ( whichField & DynamicTerrain::HeightDataOffsetFieldMask ) || ( whichField & DynamicTerrain::HeightDataScaleFieldMask ) ) { invalidateVolume(); } if( whichField & DynamicTerrain::CpuVertexProgramFieldId ) { geoClipmaps_.setCpuVertexProgramText( getCpuVertexProgram() ); } if( whichField & DynamicTerrain::CpuFragmentProgramFieldId ) { geoClipmaps_.setCpuFragmentProgramText( getCpuFragmentProgram() ); } if( whichField & DynamicTerrain::TextureDataFieldId ) { // create a texture chunk: ImagePtr textureImage = getTextureData(); if( textureImage != NullFC ) { globalTexture_ = TextureChunk::create(); beginEditCP( globalTexture_ ); globalTexture_->setImage( textureImage ); globalTexture_->setWrapS( GL_CLAMP ); globalTexture_->setWrapT( GL_CLAMP ); globalTexture_->setWrapR( GL_CLAMP ); globalTexture_->setMinFilter( GL_LINEAR ); globalTexture_->setMagFilter( GL_LINEAR ); globalTexture_->setEnvMode( GL_MODULATE ); endEditCP( globalTexture_ ); } else { globalTexture_ = NullFC; } } }