示例#1
0
	TextureDataSource* DynamicTerrain::getTextureSource()
	{
		if( getTextureData() != NullFC )
		{
			return &imageTextureSource_;
		}
		else
		{
			return 0;
		}
	}
示例#2
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;
}
示例#5
0
	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;
			}
		}
	}