Merge topic 'vs-windows-apps'
39fefde2
VS: Add test case for Windows Phone and Windows Store89da8465
MSVC: Define 'WIN32' for Windows Store and Windows Phoneed7f085f
Help: Add notes for topic 'vs-windows-apps'dd11ae8f
VS: Do not compile C sources as WinRT (#15100)b8e40538
VS: Mark Windows Phone and Store targets as App Containers0432f062
VS: Always ignore ole32 on Windows Phone 8.0e6ff2f8b
VS: Generate Windows Metadata for WinRT componentsee48f4c7
VS: Generate Windows Phone and Windows Store projects as Unicodecb1aceed
VS: Add VS_WINRT_COMPONENT property to enable CompileAsWinRT401269e4
VS: Handle .pfx files explicitly in generator23782171
VS: Handle AppxManifest sources explicitly in generatorbc373c6d
VS: Set Window Phone/Store app type in CMake-generated targetsd89b2889
VS: Mark CMake-generated targets as Utility in .vcxproj files03ad8f28
CMakeDetermineCompilerABI: Link with standard libraries on MSVC
|
@ -12,6 +12,8 @@ configure crlf=input
|
|||
*.dsp -crlf
|
||||
*.dsptemplate -crlf
|
||||
*.dsw -crlf
|
||||
*.pfx -crlf
|
||||
*.png -crlf
|
||||
*.sln -crlf
|
||||
*.vcproj -crlf
|
||||
|
||||
|
|
|
@ -235,6 +235,7 @@ Properties on Targets
|
|||
/prop_tgt/VS_SCC_LOCALPATH
|
||||
/prop_tgt/VS_SCC_PROJECTNAME
|
||||
/prop_tgt/VS_SCC_PROVIDER
|
||||
/prop_tgt/VS_WINRT_COMPONENT
|
||||
/prop_tgt/VS_WINRT_EXTENSIONS
|
||||
/prop_tgt/VS_WINRT_REFERENCES
|
||||
/prop_tgt/WIN32_EXECUTABLE
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
VS_WINRT_COMPONENT
|
||||
------------------
|
||||
|
||||
Mark a target as a Windows Runtime component for the Visual Studio generator.
|
||||
Compile the target with ``C++/CX`` language extensions for Windows Runtime.
|
||||
For ``SHARED`` and ``MODULE`` libraries, this also defines the
|
||||
``_WINRT_DLL`` preprocessor macro.
|
||||
|
||||
.. note::
|
||||
Currently this is implemented only by Visual Studio generators.
|
||||
Support may be added to other generators in the future.
|
|
@ -1,6 +1,5 @@
|
|||
VS_WINRT_EXTENSIONS
|
||||
-------------------
|
||||
|
||||
Visual Studio project C++/CX language extensions for Windows Runtime
|
||||
|
||||
Can be set to enable C++/CX language extensions.
|
||||
Deprecated. Use :prop_tgt:`VS_WINRT_COMPONENT` instead.
|
||||
This property was an experimental partial implementation of that one.
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
vs-windows-apps
|
||||
---------------
|
||||
|
||||
* The :prop_tgt:`VS_WINRT_COMPONENT` target property was created to
|
||||
tell Visual Studio generators to compile a shared library as a
|
||||
Windows Runtime (WinRT) component.
|
|
@ -28,13 +28,15 @@ function(CMAKE_DETERMINE_COMPILER_ABI lang src)
|
|||
if(DEFINED CMAKE_${lang}_VERBOSE_FLAG)
|
||||
set(CMAKE_FLAGS "-DCMAKE_EXE_LINKER_FLAGS=${CMAKE_${lang}_VERBOSE_FLAG}")
|
||||
endif()
|
||||
if(NOT "x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xMSVC")
|
||||
# Avoid adding our own platform standard libraries for compilers
|
||||
# from which we might detect implicit link libraries.
|
||||
list(APPEND CMAKE_FLAGS "-DCMAKE_${lang}_STANDARD_LIBRARIES=")
|
||||
endif()
|
||||
try_compile(CMAKE_${lang}_ABI_COMPILED
|
||||
${CMAKE_BINARY_DIR} ${src}
|
||||
CMAKE_FLAGS "${CMAKE_FLAGS}"
|
||||
"-DCMAKE_${lang}_STANDARD_LIBRARIES="
|
||||
# We need ignore these warnings because some platforms need
|
||||
# CMAKE_${lang}_STANDARD_LIBRARIES to link properly and we
|
||||
# don't care when we are just determining the ABI.
|
||||
CMAKE_FLAGS ${CMAKE_FLAGS}
|
||||
# Ignore unused flags when we are just determining the ABI.
|
||||
"--no-warn-unused-cli"
|
||||
OUTPUT_VARIABLE OUTPUT
|
||||
COPY_FILE "${BIN}"
|
||||
|
|
|
@ -163,6 +163,7 @@ if(WINCE)
|
|||
set(CMAKE_C_STANDARD_LIBRARIES_INIT "${CMAKE_C_STANDARD_LIBRARIES_INIT} corelibc.lib")
|
||||
endif ()
|
||||
elseif(WINDOWS_PHONE OR WINDOWS_STORE)
|
||||
set(_PLATFORM_DEFINES "/DWIN32")
|
||||
set(_FLAGS_C " /DUNICODE /D_UNICODE")
|
||||
set(_FLAGS_CXX " /DUNICODE /D_UNICODE /GR /EHsc")
|
||||
if(WINDOWS_PHONE)
|
||||
|
|
|
@ -53,6 +53,8 @@ struct ExternalObjectsTag {};
|
|||
struct IDLSourcesTag {};
|
||||
struct ResxTag {};
|
||||
struct ModuleDefinitionFileTag {};
|
||||
struct AppManifestTag{};
|
||||
struct CertificatesTag{};
|
||||
|
||||
#if !defined(_MSC_VER) || _MSC_VER >= 1310
|
||||
template<typename Tag, typename OtherTag>
|
||||
|
@ -195,6 +197,14 @@ struct TagVisitor
|
|||
{
|
||||
DoAccept<IsSameTag<Tag, ResxTag>::Result>::Do(this->Data, sf);
|
||||
}
|
||||
else if (ext == "appxmanifest")
|
||||
{
|
||||
DoAccept<IsSameTag<Tag, AppManifestTag>::Result>::Do(this->Data, sf);
|
||||
}
|
||||
else if (ext == "pfx")
|
||||
{
|
||||
DoAccept<IsSameTag<Tag, CertificatesTag>::Result>::Do(this->Data, sf);
|
||||
}
|
||||
else if(this->Header.find(sf->GetFullPath().c_str()))
|
||||
{
|
||||
DoAccept<IsSameTag<Tag, HeaderSourcesTag>::Result>::Do(this->Data, sf);
|
||||
|
@ -428,6 +438,24 @@ void cmGeneratorTarget
|
|||
srcs = data.ResxSources;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void
|
||||
cmGeneratorTarget
|
||||
::GetAppManifest(std::vector<cmSourceFile const*>& data,
|
||||
const std::string& config) const
|
||||
{
|
||||
IMPLEMENT_VISIT(AppManifest);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void
|
||||
cmGeneratorTarget
|
||||
::GetCertificates(std::vector<cmSourceFile const*>& data,
|
||||
const std::string& config) const
|
||||
{
|
||||
IMPLEMENT_VISIT(Certificates);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool cmGeneratorTarget::IsSystemIncludeDirectory(const std::string& dir,
|
||||
const std::string& config) const
|
||||
|
|
|
@ -54,6 +54,10 @@ public:
|
|||
const std::string& config) const;
|
||||
void GetExpectedResxHeaders(std::set<std::string>&,
|
||||
const std::string& config) const;
|
||||
void GetAppManifest(std::vector<cmSourceFile const*>&,
|
||||
const std::string& config) const;
|
||||
void GetCertificates(std::vector<cmSourceFile const*>&,
|
||||
const std::string& config) const;
|
||||
|
||||
void ComputeObjectMapping();
|
||||
|
||||
|
|
|
@ -181,7 +181,12 @@ cmVisualStudio10TargetGenerator(cmTarget* target,
|
|||
this->GUID = this->GlobalGenerator->GetGUID(this->Name.c_str());
|
||||
this->Platform = gg->GetPlatformName();
|
||||
this->MSTools = true;
|
||||
this->TargetCompileAsWinRT = false;
|
||||
this->BuildFileStream = 0;
|
||||
this->IsMissingFiles = false;
|
||||
this->DefaultArtifactDir =
|
||||
this->Makefile->GetStartOutputDirectory() + std::string("/") +
|
||||
this->LocalGenerator->GetTargetDirectory(*this->Target);
|
||||
}
|
||||
|
||||
cmVisualStudio10TargetGenerator::~cmVisualStudio10TargetGenerator()
|
||||
|
@ -312,9 +317,10 @@ void cmVisualStudio10TargetGenerator::Generate()
|
|||
this->WriteString("<ProjectGUID>", 2);
|
||||
(*this->BuildFileStream) << "{" << this->GUID << "}</ProjectGUID>\n";
|
||||
|
||||
if(this->MSTools && this->Target->GetType() <= cmTarget::UTILITY)
|
||||
if(this->MSTools && this->Target->GetType() <= cmTarget::GLOBAL_TARGET)
|
||||
{
|
||||
this->WriteApplicationTypeSettings();
|
||||
this->VerifyNecessaryFiles();
|
||||
}
|
||||
|
||||
const char* vsProjectTypes =
|
||||
|
@ -351,6 +357,11 @@ void cmVisualStudio10TargetGenerator::Generate()
|
|||
}
|
||||
}
|
||||
|
||||
if(this->Target->GetPropertyAsBool("VS_WINRT_COMPONENT"))
|
||||
{
|
||||
this->WriteString("<WinMDAssembly>true</WinMDAssembly>\n", 2);
|
||||
}
|
||||
|
||||
const char* vsGlobalKeyword =
|
||||
this->Target->GetProperty("VS_GLOBAL_KEYWORD");
|
||||
if(!vsGlobalKeyword)
|
||||
|
@ -410,6 +421,7 @@ void cmVisualStudio10TargetGenerator::Generate()
|
|||
" Label=\"LocalAppDataPlatform\" />\n", 2);
|
||||
this->WriteString("</ImportGroup>\n", 1);
|
||||
this->WriteString("<PropertyGroup Label=\"UserMacros\" />\n", 1);
|
||||
this->WriteWinRTPackageCertificateKeyFile();
|
||||
this->WritePathAndIncrementalLinkOptions();
|
||||
this->WriteItemDefinitionGroups();
|
||||
this->WriteCustomCommands();
|
||||
|
@ -421,6 +433,7 @@ void cmVisualStudio10TargetGenerator::Generate()
|
|||
this->WriteString(
|
||||
"<Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\""
|
||||
" />\n", 1);
|
||||
this->WriteTargetSpecificReferences();
|
||||
this->WriteString("<ImportGroup Label=\"ExtensionTargets\">\n", 1);
|
||||
if (this->GlobalGenerator->IsMasmEnabled())
|
||||
{
|
||||
|
@ -500,6 +513,22 @@ void cmVisualStudio10TargetGenerator::WriteEmbeddedResourceGroup()
|
|||
}
|
||||
}
|
||||
|
||||
void cmVisualStudio10TargetGenerator::WriteTargetSpecificReferences()
|
||||
{
|
||||
if(this->MSTools)
|
||||
{
|
||||
if(this->GlobalGenerator->TargetsWindowsPhone() &&
|
||||
this->GlobalGenerator->GetSystemVersion() == "8.0")
|
||||
{
|
||||
this->WriteString(
|
||||
"<Import Project=\""
|
||||
"$(MSBuildExtensionsPath)\\Microsoft\\WindowsPhone\\v"
|
||||
"$(TargetPlatformVersion)\\Microsoft.Cpp.WindowsPhone."
|
||||
"$(TargetPlatformVersion).targets\" />\n", 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cmVisualStudio10TargetGenerator::WriteWinRTReferences()
|
||||
{
|
||||
std::vector<std::string> references;
|
||||
|
@ -508,6 +537,13 @@ void cmVisualStudio10TargetGenerator::WriteWinRTReferences()
|
|||
{
|
||||
cmSystemTools::ExpandListArgument(vsWinRTReferences, references);
|
||||
}
|
||||
|
||||
if(this->GlobalGenerator->TargetsWindowsPhone() &&
|
||||
this->GlobalGenerator->GetSystemVersion() == "8.0" &&
|
||||
references.empty())
|
||||
{
|
||||
references.push_back("platform.winmd");
|
||||
}
|
||||
if(!references.empty())
|
||||
{
|
||||
this->WriteString("<ItemGroup>\n", 1);
|
||||
|
@ -572,9 +608,9 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues()
|
|||
configType += "Application";
|
||||
break;
|
||||
case cmTarget::UTILITY:
|
||||
case cmTarget::GLOBAL_TARGET:
|
||||
configType += "Utility";
|
||||
break;
|
||||
case cmTarget::GLOBAL_TARGET:
|
||||
case cmTarget::UNKNOWN_LIBRARY:
|
||||
case cmTarget::INTERFACE_LIBRARY:
|
||||
break;
|
||||
|
@ -616,6 +652,9 @@ void cmVisualStudio10TargetGenerator
|
|||
|
||||
if((this->Target->GetType() <= cmTarget::OBJECT_LIBRARY &&
|
||||
this->ClOptions[config]->UsingUnicode()) ||
|
||||
this->Target->GetPropertyAsBool("VS_WINRT_COMPONENT") ||
|
||||
this->GlobalGenerator->TargetsWindowsPhone() ||
|
||||
this->GlobalGenerator->TargetsWindowsStore() ||
|
||||
this->Target->GetPropertyAsBool("VS_WINRT_EXTENSIONS"))
|
||||
{
|
||||
this->WriteString("<CharacterSet>Unicode</CharacterSet>\n", 2);
|
||||
|
@ -636,7 +675,8 @@ void cmVisualStudio10TargetGenerator
|
|||
pts += "</PlatformToolset>\n";
|
||||
this->WriteString(pts.c_str(), 2);
|
||||
}
|
||||
if(this->Target->GetPropertyAsBool("VS_WINRT_EXTENSIONS"))
|
||||
if(this->Target->GetPropertyAsBool("VS_WINRT_COMPONENT") ||
|
||||
this->Target->GetPropertyAsBool("VS_WINRT_EXTENSIONS"))
|
||||
{
|
||||
this->WriteString("<WindowsAppContainer>true"
|
||||
"</WindowsAppContainer>\n", 2);
|
||||
|
@ -846,6 +886,49 @@ void cmVisualStudio10TargetGenerator::WriteGroups()
|
|||
this->WriteGroupSources(ti->first.c_str(), ti->second, sourceGroups);
|
||||
}
|
||||
|
||||
// Added files are images and the manifest.
|
||||
if (!this->AddedFiles.empty())
|
||||
{
|
||||
this->WriteString("<ItemGroup>\n", 1);
|
||||
for(std::vector<std::string>::const_iterator
|
||||
oi = this->AddedFiles.begin(); oi != this->AddedFiles.end(); ++oi)
|
||||
{
|
||||
std::string fileName = cmSystemTools::LowerCase(
|
||||
cmSystemTools::GetFilenameName(*oi));
|
||||
if (fileName == "wmappmanifest.xml")
|
||||
{
|
||||
this->WriteString("<XML Include=\"", 2);
|
||||
(*this->BuildFileStream) << *oi << "\">\n";
|
||||
this->WriteString("<Filter>Resource Files</Filter>\n", 3);
|
||||
this->WriteString("</XML>\n", 2);
|
||||
}
|
||||
else if(cmSystemTools::GetFilenameExtension(fileName) ==
|
||||
".appxmanifest")
|
||||
{
|
||||
this->WriteString("<AppxManifest Include=\"", 2);
|
||||
(*this->BuildFileStream) << *oi << "\">\n";
|
||||
this->WriteString("<Filter>Resource Files</Filter>\n", 3);
|
||||
this->WriteString("</AppxManifest>\n", 2);
|
||||
}
|
||||
else if(cmSystemTools::GetFilenameExtension(fileName) ==
|
||||
".pfx")
|
||||
{
|
||||
this->WriteString("<None Include=\"", 2);
|
||||
(*this->BuildFileStream) << *oi << "\">\n";
|
||||
this->WriteString("<Filter>Resource Files</Filter>\n", 3);
|
||||
this->WriteString("</None>\n", 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
this->WriteString("<Image Include=\"", 2);
|
||||
(*this->BuildFileStream) << *oi << "\">\n";
|
||||
this->WriteString("<Filter>Resource Files</Filter>\n", 3);
|
||||
this->WriteString("</Image>\n", 2);
|
||||
}
|
||||
}
|
||||
this->WriteString("</ItemGroup>\n", 1);
|
||||
}
|
||||
|
||||
std::vector<cmSourceFile const*> resxObjs;
|
||||
this->GeneratorTarget->GetResxSources(resxObjs, "");
|
||||
if(!resxObjs.empty())
|
||||
|
@ -919,7 +1002,7 @@ void cmVisualStudio10TargetGenerator::WriteGroups()
|
|||
this->WriteString("</Filter>\n", 2);
|
||||
}
|
||||
|
||||
if(!resxObjs.empty())
|
||||
if(!resxObjs.empty() || !this->AddedFiles.empty())
|
||||
{
|
||||
this->WriteString("<Filter Include=\"Resource Files\">\n", 2);
|
||||
std::string guidName = "SG_Filter_Resource Files";
|
||||
|
@ -1048,11 +1131,7 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(cmSourceFile const* sf)
|
|||
std::string tool = "None";
|
||||
std::string shaderType;
|
||||
std::string const& ext = sf->GetExtension();
|
||||
if(ext == "appxmanifest")
|
||||
{
|
||||
tool = "AppxManifest";
|
||||
}
|
||||
else if(ext == "hlsl")
|
||||
if(ext == "hlsl")
|
||||
{
|
||||
tool = "FXCompile";
|
||||
// Figure out the type of shader compiler to use.
|
||||
|
@ -1247,6 +1326,10 @@ void cmVisualStudio10TargetGenerator::WriteAllSources()
|
|||
}
|
||||
}
|
||||
|
||||
std::vector<cmSourceFile const*> manifestSources;
|
||||
this->GeneratorTarget->GetAppManifest(manifestSources, "");
|
||||
this->WriteSources("AppxManifest", manifestSources);
|
||||
|
||||
std::vector<cmSourceFile const*> externalObjects;
|
||||
this->GeneratorTarget->GetExternalObjects(externalObjects, "");
|
||||
for(std::vector<cmSourceFile const*>::iterator
|
||||
|
@ -1302,6 +1385,11 @@ void cmVisualStudio10TargetGenerator::WriteAllSources()
|
|||
(*this->BuildFileStream ) << cmVS10EscapeXML(obj) << "\" />\n";
|
||||
}
|
||||
|
||||
if (this->IsMissingFiles)
|
||||
{
|
||||
this->WriteMissingFiles();
|
||||
}
|
||||
|
||||
this->WriteString("</ItemGroup>\n", 1);
|
||||
}
|
||||
|
||||
|
@ -1353,6 +1441,7 @@ bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
|
|||
compileAs = "CompileAsC";
|
||||
}
|
||||
}
|
||||
bool noWinRT = this->TargetCompileAsWinRT && lang == "C";
|
||||
bool hasFlags = false;
|
||||
// for the first time we need a new line if there is something
|
||||
// produced here.
|
||||
|
@ -1386,7 +1475,7 @@ bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
|
|||
}
|
||||
// if we have flags or defines for this config then
|
||||
// use them
|
||||
if(!flags.empty() || !configDefines.empty() || compileAs)
|
||||
if(!flags.empty() || !configDefines.empty() || compileAs || noWinRT)
|
||||
{
|
||||
(*this->BuildFileStream ) << firstString;
|
||||
firstString = ""; // only do firstString once
|
||||
|
@ -1399,6 +1488,10 @@ bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
|
|||
{
|
||||
clOptions.AddFlag("CompileAs", compileAs);
|
||||
}
|
||||
if(noWinRT)
|
||||
{
|
||||
clOptions.AddFlag("CompileAsWinRT", "false");
|
||||
}
|
||||
clOptions.Parse(flags.c_str());
|
||||
if(clOptions.HasFlag("AdditionalIncludeDirectories"))
|
||||
{
|
||||
|
@ -1634,6 +1727,36 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
|
|||
clOptions.AddDefine(exportMacro);
|
||||
}
|
||||
|
||||
if (this->MSTools)
|
||||
{
|
||||
// If we have the VS_WINRT_COMPONENT set then force Compile as WinRT.
|
||||
if (this->Target->GetPropertyAsBool("VS_WINRT_COMPONENT"))
|
||||
{
|
||||
clOptions.AddFlag("CompileAsWinRT", "true");
|
||||
// For WinRT components, add the _WINRT_DLL define to produce a lib
|
||||
if (this->Target->GetType() == cmTarget::SHARED_LIBRARY ||
|
||||
this->Target->GetType() == cmTarget::MODULE_LIBRARY )
|
||||
{
|
||||
clOptions.AddDefine("_WINRT_DLL");
|
||||
}
|
||||
}
|
||||
else if (this->GlobalGenerator->TargetsWindowsStore() ||
|
||||
this->GlobalGenerator->TargetsWindowsPhone())
|
||||
{
|
||||
if (!clOptions.IsWinRt())
|
||||
{
|
||||
clOptions.AddFlag("CompileAsWinRT", "false");
|
||||
}
|
||||
}
|
||||
if(const char* winRT = clOptions.GetFlag("CompileAsWinRT"))
|
||||
{
|
||||
if(cmSystemTools::IsOn(winRT))
|
||||
{
|
||||
this->TargetCompileAsWinRT = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this->ClOptions[configName] = pOptions.release();
|
||||
return true;
|
||||
}
|
||||
|
@ -1829,6 +1952,18 @@ cmVisualStudio10TargetGenerator::WriteLibOptions(std::string const& config)
|
|||
libOptions.OutputFlagMap(*this->BuildFileStream, " ");
|
||||
this->WriteString("</Lib>\n", 2);
|
||||
}
|
||||
|
||||
// We cannot generate metadata for static libraries. WindowsPhone
|
||||
// and WindowsStore tools look at GenerateWindowsMetadata in the
|
||||
// Link tool options even for static libraries.
|
||||
if(this->GlobalGenerator->TargetsWindowsPhone() ||
|
||||
this->GlobalGenerator->TargetsWindowsStore())
|
||||
{
|
||||
this->WriteString("<Link>\n", 2);
|
||||
this->WriteString("<GenerateWindowsMetadata>false"
|
||||
"</GenerateWindowsMetadata>\n", 3);
|
||||
this->WriteString("</Link>\n", 2);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
@ -2010,6 +2145,28 @@ cmVisualStudio10TargetGenerator::ComputeLinkOptions(std::string const& config)
|
|||
|
||||
linkOptions.AddFlag("ImportLibrary", imLib.c_str());
|
||||
linkOptions.AddFlag("ProgramDataBaseFile", pdb.c_str());
|
||||
|
||||
// A Windows Runtime component uses internal .NET metadata,
|
||||
// so does not have an import library.
|
||||
if(this->Target->GetPropertyAsBool("VS_WINRT_COMPONENT"))
|
||||
{
|
||||
linkOptions.AddFlag("GenerateWindowsMetadata", "true");
|
||||
}
|
||||
else if (this->GlobalGenerator->TargetsWindowsPhone() ||
|
||||
this->GlobalGenerator->TargetsWindowsStore())
|
||||
{
|
||||
// WindowsPhone and WindowsStore components are in an app container
|
||||
// and produce WindowsMetadata. If we are not producing a WINRT
|
||||
// component, then do not generate the metadata here.
|
||||
linkOptions.AddFlag("GenerateWindowsMetadata", "false");
|
||||
}
|
||||
|
||||
if (this->GlobalGenerator->TargetsWindowsPhone() &&
|
||||
this->GlobalGenerator->GetSystemVersion() == "8.0")
|
||||
{
|
||||
// WindowsPhone 8.0 does not have ole32.
|
||||
linkOptions.AppendFlag("IgnoreSpecificDefaultLibraries", "ole32.lib");
|
||||
}
|
||||
}
|
||||
|
||||
linkOptions.Parse(flags.c_str());
|
||||
|
@ -2260,6 +2417,67 @@ void cmVisualStudio10TargetGenerator::WriteProjectReferences()
|
|||
this->WriteString("</ItemGroup>\n", 1);
|
||||
}
|
||||
|
||||
void cmVisualStudio10TargetGenerator::WriteWinRTPackageCertificateKeyFile()
|
||||
{
|
||||
if((this->GlobalGenerator->TargetsWindowsStore() ||
|
||||
this->GlobalGenerator->TargetsWindowsPhone())
|
||||
&& (cmTarget::EXECUTABLE == this->Target->GetType()))
|
||||
{
|
||||
std::string pfxFile;
|
||||
std::vector<cmSourceFile const*> certificates;
|
||||
this->GeneratorTarget->GetCertificates(certificates, "");
|
||||
for(std::vector<cmSourceFile const*>::const_iterator si =
|
||||
certificates.begin(); si != certificates.end(); ++si)
|
||||
{
|
||||
pfxFile = this->ConvertPath((*si)->GetFullPath(), false);
|
||||
this->ConvertToWindowsSlash(pfxFile);
|
||||
break;
|
||||
}
|
||||
|
||||
if(this->IsMissingFiles &&
|
||||
!(this->GlobalGenerator->TargetsWindowsPhone() &&
|
||||
this->GlobalGenerator->GetSystemVersion() == "8.0"))
|
||||
{
|
||||
// Move the manifest to a project directory to avoid clashes
|
||||
std::string artifactDir =
|
||||
this->LocalGenerator->GetTargetDirectory(*this->Target);
|
||||
this->ConvertToWindowsSlash(artifactDir);
|
||||
this->WriteString("<PropertyGroup>\n", 1);
|
||||
this->WriteString("<AppxPackageArtifactsDir>", 2);
|
||||
(*this->BuildFileStream) << cmVS10EscapeXML(artifactDir) <<
|
||||
"\\</AppxPackageArtifactsDir>\n";
|
||||
this->WriteString("<ProjectPriFullPath>"
|
||||
"$(TargetDir)resources.pri</ProjectPriFullPath>", 2);
|
||||
|
||||
// If we are missing files and we don't have a certificate and
|
||||
// aren't targeting WP8.0, add a default certificate
|
||||
if(pfxFile.empty())
|
||||
{
|
||||
std::string templateFolder = cmSystemTools::GetCMakeRoot() +
|
||||
"/Templates/Windows";
|
||||
pfxFile = this->DefaultArtifactDir + "/Windows_TemporaryKey.pfx";
|
||||
cmSystemTools::CopyAFile(templateFolder + "/Windows_TemporaryKey.pfx",
|
||||
pfxFile, false);
|
||||
this->ConvertToWindowsSlash(pfxFile);
|
||||
this->AddedFiles.push_back(pfxFile);
|
||||
}
|
||||
|
||||
this->WriteString("<", 2);
|
||||
(*this->BuildFileStream) << "PackageCertificateKeyFile>"
|
||||
<< pfxFile << "</PackageCertificateKeyFile>\n";
|
||||
this->WriteString("</PropertyGroup>\n", 1);
|
||||
}
|
||||
else if(!pfxFile.empty())
|
||||
{
|
||||
this->WriteString("<PropertyGroup>\n", 1);
|
||||
this->WriteString("<", 2);
|
||||
(*this->BuildFileStream) << "PackageCertificateKeyFile>"
|
||||
<< pfxFile << "</PackageCertificateKeyFile>\n";
|
||||
this->WriteString("</PropertyGroup>\n", 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool cmVisualStudio10TargetGenerator::
|
||||
IsResxHeader(const std::string& headerFile)
|
||||
{
|
||||
|
@ -2273,6 +2491,7 @@ bool cmVisualStudio10TargetGenerator::
|
|||
|
||||
void cmVisualStudio10TargetGenerator::WriteApplicationTypeSettings()
|
||||
{
|
||||
bool isAppContainer = false;
|
||||
bool const isWindowsPhone = this->GlobalGenerator->TargetsWindowsPhone();
|
||||
bool const isWindowsStore = this->GlobalGenerator->TargetsWindowsStore();
|
||||
std::string const& v = this->GlobalGenerator->GetSystemVersion();
|
||||
|
@ -2290,17 +2509,439 @@ void cmVisualStudio10TargetGenerator::WriteApplicationTypeSettings()
|
|||
// Visual Studio 12.0 is necessary for building 8.1 apps
|
||||
this->WriteString("<MinimumVisualStudioVersion>12.0"
|
||||
"</MinimumVisualStudioVersion>\n", 2);
|
||||
|
||||
if (this->Target->GetType() < cmTarget::UTILITY)
|
||||
{
|
||||
isAppContainer = true;
|
||||
}
|
||||
}
|
||||
else if (v == "8.0")
|
||||
{
|
||||
// Visual Studio 11.0 is necessary for building 8.0 apps
|
||||
this->WriteString("<MinimumVisualStudioVersion>11.0"
|
||||
"</MinimumVisualStudioVersion>\n", 2);
|
||||
|
||||
if (isWindowsStore && this->Target->GetType() < cmTarget::UTILITY)
|
||||
{
|
||||
isAppContainer = true;
|
||||
}
|
||||
else if (isWindowsPhone &&
|
||||
this->Target->GetType() == cmTarget::EXECUTABLE)
|
||||
{
|
||||
this->WriteString("<XapOutputs>true</XapOutputs>\n", 2);
|
||||
this->WriteString("<XapFilename>", 2);
|
||||
(*this->BuildFileStream) << cmVS10EscapeXML(this->Name.c_str()) <<
|
||||
"_$(Configuration)_$(Platform).xap</XapFilename>\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this->Platform == "ARM")
|
||||
if(isAppContainer)
|
||||
{
|
||||
this->WriteString("<AppContainerApplication>true"
|
||||
"</AppContainerApplication>", 2);
|
||||
}
|
||||
else if (this->Platform == "ARM")
|
||||
{
|
||||
this->WriteString("<WindowsSDKDesktopARMSupport>true"
|
||||
"</WindowsSDKDesktopARMSupport>", 2);
|
||||
}
|
||||
}
|
||||
|
||||
void cmVisualStudio10TargetGenerator::VerifyNecessaryFiles()
|
||||
{
|
||||
// For Windows and Windows Phone executables, we will assume that if a
|
||||
// manifest is not present that we need to add all the necessary files
|
||||
if (this->Target->GetType() == cmTarget::EXECUTABLE)
|
||||
{
|
||||
std::vector<cmSourceFile const*> manifestSources;
|
||||
this->GeneratorTarget->GetAppManifest(manifestSources, "");
|
||||
{
|
||||
std::string const& v = this->GlobalGenerator->GetSystemVersion();
|
||||
if(this->GlobalGenerator->TargetsWindowsPhone())
|
||||
{
|
||||
if (v == "8.0")
|
||||
{
|
||||
// Look through the sources for WMAppManifest.xml
|
||||
std::vector<cmSourceFile const*> extraSources;
|
||||
this->GeneratorTarget->GetExtraSources(extraSources, "");
|
||||
bool foundManifest = false;
|
||||
for(std::vector<cmSourceFile const*>::const_iterator si =
|
||||
extraSources.begin(); si != extraSources.end(); ++si)
|
||||
{
|
||||
// Need to do a lowercase comparison on the filename
|
||||
if("wmappmanifest.xml" == cmSystemTools::LowerCase(
|
||||
(*si)->GetLocation().GetName()))
|
||||
{
|
||||
foundManifest = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!foundManifest)
|
||||
{
|
||||
this->IsMissingFiles = true;
|
||||
}
|
||||
}
|
||||
else if (v == "8.1")
|
||||
{
|
||||
if(manifestSources.empty())
|
||||
{
|
||||
this->IsMissingFiles = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (this->GlobalGenerator->TargetsWindowsStore())
|
||||
{
|
||||
if (manifestSources.empty())
|
||||
{
|
||||
if (v == "8.0")
|
||||
{
|
||||
this->IsMissingFiles = true;
|
||||
}
|
||||
else if (v == "8.1")
|
||||
{
|
||||
this->IsMissingFiles = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cmVisualStudio10TargetGenerator::WriteMissingFiles()
|
||||
{
|
||||
std::string const& v = this->GlobalGenerator->GetSystemVersion();
|
||||
if(this->GlobalGenerator->TargetsWindowsPhone())
|
||||
{
|
||||
if (v == "8.0")
|
||||
{
|
||||
this->WriteMissingFilesWP80();
|
||||
}
|
||||
else if (v == "8.1")
|
||||
{
|
||||
this->WriteMissingFilesWP81();
|
||||
}
|
||||
}
|
||||
else if (this->GlobalGenerator->TargetsWindowsStore())
|
||||
{
|
||||
if (v == "8.0")
|
||||
{
|
||||
this->WriteMissingFilesWS80();
|
||||
}
|
||||
else if (v == "8.1")
|
||||
{
|
||||
this->WriteMissingFilesWS81();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cmVisualStudio10TargetGenerator::WriteMissingFilesWP80()
|
||||
{
|
||||
std::string templateFolder = cmSystemTools::GetCMakeRoot() +
|
||||
"/Templates/Windows";
|
||||
|
||||
// For WP80, the manifest needs to be in the same folder as the project
|
||||
// this can cause an overwrite problem if projects aren't organized in
|
||||
// folders
|
||||
std::string manifestFile = this->Makefile->GetStartOutputDirectory() +
|
||||
std::string("/WMAppManifest.xml");
|
||||
std::string artifactDir =
|
||||
this->LocalGenerator->GetTargetDirectory(*this->Target);
|
||||
this->ConvertToWindowsSlash(artifactDir);
|
||||
std::string artifactDirXML = cmVS10EscapeXML(artifactDir);
|
||||
std::string targetNameXML = cmVS10EscapeXML(this->Target->GetName());
|
||||
|
||||
cmGeneratedFileStream fout(manifestFile.c_str());
|
||||
fout.SetCopyIfDifferent(true);
|
||||
|
||||
fout <<
|
||||
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
|
||||
"<Deployment"
|
||||
" xmlns=\"http://schemas.microsoft.com/windowsphone/2012/deployment\""
|
||||
" AppPlatformVersion=\"8.0\">\n"
|
||||
"\t<DefaultLanguage xmlns=\"\" code=\"en-US\"/>\n"
|
||||
"\t<App xmlns=\"\" ProductID=\"{" << this->GUID << "}\""
|
||||
" Title=\"CMake Test Program\" RuntimeType=\"Modern Native\""
|
||||
" Version=\"1.0.0.0\" Genre=\"apps.normal\" Author=\"CMake\""
|
||||
" Description=\"Default CMake App\" Publisher=\"CMake\""
|
||||
" PublisherID=\"{" << this->GUID << "}\">\n"
|
||||
"\t\t<IconPath IsRelative=\"true\" IsResource=\"false\">"
|
||||
<< artifactDirXML << "\\ApplicationIcon.png</IconPath>\n"
|
||||
"\t\t<Capabilities/>\n"
|
||||
"\t\t<Tasks>\n"
|
||||
"\t\t\t<DefaultTask Name=\"_default\""
|
||||
" ImagePath=\"" << targetNameXML << ".exe\" ImageParams=\"\" />\n"
|
||||
"\t\t</Tasks>\n"
|
||||
"\t\t<Tokens>\n"
|
||||
"\t\t\t<PrimaryToken TokenID=\"" << targetNameXML << "Token\""
|
||||
" TaskName=\"_default\">\n"
|
||||
"\t\t\t\t<TemplateFlip>\n"
|
||||
"\t\t\t\t\t<SmallImageURI IsRelative=\"true\" IsResource=\"false\">"
|
||||
<< artifactDirXML << "\\SmallLogo.png</SmallImageURI>\n"
|
||||
"\t\t\t\t\t<Count>0</Count>\n"
|
||||
"\t\t\t\t\t<BackgroundImageURI IsRelative=\"true\" IsResource=\"false\">"
|
||||
<< artifactDirXML << "\\Logo.png</BackgroundImageURI>\n"
|
||||
"\t\t\t\t</TemplateFlip>\n"
|
||||
"\t\t\t</PrimaryToken>\n"
|
||||
"\t\t</Tokens>\n"
|
||||
"\t\t<ScreenResolutions>\n"
|
||||
"\t\t\t<ScreenResolution Name=\"ID_RESOLUTION_WVGA\" />\n"
|
||||
"\t\t</ScreenResolutions>\n"
|
||||
"\t</App>\n"
|
||||
"</Deployment>\n";
|
||||
|
||||
std::string sourceFile = this->ConvertPath(manifestFile, false);
|
||||
this->ConvertToWindowsSlash(sourceFile);
|
||||
this->WriteString("<Xml Include=\"", 2);
|
||||
(*this->BuildFileStream) << cmVS10EscapeXML(sourceFile) << "\">\n";
|
||||
this->WriteString("<SubType>Designer</SubType>\n", 3);
|
||||
this->WriteString("</Xml>\n", 2);
|
||||
this->AddedFiles.push_back(sourceFile);
|
||||
|
||||
std::string smallLogo = this->DefaultArtifactDir + "/SmallLogo.png";
|
||||
cmSystemTools::CopyAFile(templateFolder + "/SmallLogo.png",
|
||||
smallLogo, false);
|
||||
this->ConvertToWindowsSlash(smallLogo);
|
||||
this->WriteString("<Image Include=\"", 2);
|
||||
(*this->BuildFileStream) << cmVS10EscapeXML(smallLogo) << "\" />\n";
|
||||
this->AddedFiles.push_back(smallLogo);
|
||||
|
||||
std::string logo = this->DefaultArtifactDir + "/Logo.png";
|
||||
cmSystemTools::CopyAFile(templateFolder + "/Logo.png",
|
||||
logo, false);
|
||||
this->ConvertToWindowsSlash(logo);
|
||||
this->WriteString("<Image Include=\"", 2);
|
||||
(*this->BuildFileStream) << cmVS10EscapeXML(logo) << "\" />\n";
|
||||
this->AddedFiles.push_back(logo);
|
||||
|
||||
std::string applicationIcon =
|
||||
this->DefaultArtifactDir + "/ApplicationIcon.png";
|
||||
cmSystemTools::CopyAFile(templateFolder + "/ApplicationIcon.png",
|
||||
applicationIcon, false);
|
||||
this->ConvertToWindowsSlash(applicationIcon);
|
||||
this->WriteString("<Image Include=\"", 2);
|
||||
(*this->BuildFileStream) << cmVS10EscapeXML(applicationIcon) << "\" />\n";
|
||||
this->AddedFiles.push_back(applicationIcon);
|
||||
}
|
||||
|
||||
void cmVisualStudio10TargetGenerator::WriteMissingFilesWP81()
|
||||
{
|
||||
std::string manifestFile =
|
||||
this->DefaultArtifactDir + "/package.appxManifest";
|
||||
std::string artifactDir =
|
||||
this->LocalGenerator->GetTargetDirectory(*this->Target);
|
||||
this->ConvertToWindowsSlash(artifactDir);
|
||||
std::string artifactDirXML = cmVS10EscapeXML(artifactDir);
|
||||
std::string targetNameXML = cmVS10EscapeXML(this->Target->GetName());
|
||||
|
||||
cmGeneratedFileStream fout(manifestFile.c_str());
|
||||
fout.SetCopyIfDifferent(true);
|
||||
|
||||
fout <<
|
||||
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
|
||||
"<Package xmlns=\"http://schemas.microsoft.com/appx/2010/manifest\""
|
||||
" xmlns:m2=\"http://schemas.microsoft.com/appx/2013/manifest\""
|
||||
" xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\">\n"
|
||||
"\t<Identity Name=\"" << this->GUID << "\" Publisher=\"CN=CMake\""
|
||||
" Version=\"1.0.0.0\" />\n"
|
||||
"\t<mp:PhoneIdentity PhoneProductId=\"" << this->GUID << "\""
|
||||
" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\"/>\n"
|
||||
"\t<Properties>\n"
|
||||
"\t\t<DisplayName>" << targetNameXML << "</DisplayName>\n"
|
||||
"\t\t<PublisherDisplayName>CMake</PublisherDisplayName>\n"
|
||||
"\t\t<Logo>" << artifactDirXML << "\\StoreLogo.png</Logo>\n"
|
||||
"\t</Properties>\n"
|
||||
"\t<Prerequisites>\n"
|
||||
"\t\t<OSMinVersion>6.3.1</OSMinVersion>\n"
|
||||
"\t\t<OSMaxVersionTested>6.3.1</OSMaxVersionTested>\n"
|
||||
"\t</Prerequisites>\n"
|
||||
"\t<Resources>\n"
|
||||
"\t\t<Resource Language=\"x-generate\" />\n"
|
||||
"\t</Resources>\n"
|
||||
"\t<Applications>\n"
|
||||
"\t\t<Application Id=\"App\""
|
||||
" Executable=\"" << targetNameXML << ".exe\""
|
||||
" EntryPoint=\"" << targetNameXML << ".App\">\n"
|
||||
"\t\t\t<m2:VisualElements\n"
|
||||
"\t\t\t\tDisplayName=\"" << targetNameXML << "\"\n"
|
||||
"\t\t\t\tDescription=\"" << targetNameXML << "\"\n"
|
||||
"\t\t\t\tBackgroundColor=\"#336699\"\n"
|
||||
"\t\t\t\tForegroundText=\"light\"\n"
|
||||
"\t\t\t\tSquare150x150Logo=\"" << artifactDirXML << "\\Logo.png\"\n"
|
||||
"\t\t\t\tSquare30x30Logo=\"" << artifactDirXML << "\\SmallLogo.png\">\n"
|
||||
"\t\t\t\t<m2:DefaultTile ShortName=\"" << targetNameXML << "\">\n"
|
||||
"\t\t\t\t\t<m2:ShowNameOnTiles>\n"
|
||||
"\t\t\t\t\t\t<m2:ShowOn Tile=\"square150x150Logo\" />\n"
|
||||
"\t\t\t\t\t</m2:ShowNameOnTiles>\n"
|
||||
"\t\t\t\t</m2:DefaultTile>\n"
|
||||
"\t\t\t\t<m2:SplashScreen"
|
||||
" Image=\"" << artifactDirXML << "\\SplashScreen.png\" />\n"
|
||||
"\t\t\t</m2:VisualElements>\n"
|
||||
"\t\t</Application>\n"
|
||||
"\t</Applications>\n"
|
||||
"</Package>\n";
|
||||
|
||||
this->WriteCommonMissingFiles(manifestFile);
|
||||
}
|
||||
|
||||
void cmVisualStudio10TargetGenerator::WriteMissingFilesWS80()
|
||||
{
|
||||
std::string manifestFile =
|
||||
this->DefaultArtifactDir + "/package.appxManifest";
|
||||
std::string artifactDir =
|
||||
this->LocalGenerator->GetTargetDirectory(*this->Target);
|
||||
this->ConvertToWindowsSlash(artifactDir);
|
||||
std::string artifactDirXML = cmVS10EscapeXML(artifactDir);
|
||||
std::string targetNameXML = cmVS10EscapeXML(this->Target->GetName());
|
||||
|
||||
cmGeneratedFileStream fout(manifestFile.c_str());
|
||||
fout.SetCopyIfDifferent(true);
|
||||
|
||||
fout <<
|
||||
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
|
||||
"<Package xmlns=\"http://schemas.microsoft.com/appx/2010/manifest\">\n"
|
||||
"\t<Identity Name=\"" << this->GUID << "\" Publisher=\"CN=CMake\""
|
||||
" Version=\"1.0.0.0\" />\n"
|
||||
"\t<Properties>\n"
|
||||
"\t\t<DisplayName>" << targetNameXML << "</DisplayName>\n"
|
||||
"\t\t<PublisherDisplayName>CMake</PublisherDisplayName>\n"
|
||||
"\t\t<Logo>" << artifactDirXML << "\\StoreLogo.png</Logo>\n"
|
||||
"\t</Properties>\n"
|
||||
"\t<Prerequisites>\n"
|
||||
"\t\t<OSMinVersion>6.2.1</OSMinVersion>\n"
|
||||
"\t\t<OSMaxVersionTested>6.2.1</OSMaxVersionTested>\n"
|
||||
"\t</Prerequisites>\n"
|
||||
"\t<Resources>\n"
|
||||
"\t\t<Resource Language=\"x-generate\" />\n"
|
||||
"\t</Resources>\n"
|
||||
"\t<Applications>\n"
|
||||
"\t\t<Application Id=\"App\""
|
||||
" Executable=\"" << targetNameXML << ".exe\""
|
||||
" EntryPoint=\"" << targetNameXML << ".App\">\n"
|
||||
"\t\t\t<VisualElements"
|
||||
" DisplayName=\"" << targetNameXML << "\""
|
||||
" Description=\"" << targetNameXML << "\""
|
||||
" BackgroundColor=\"#336699\" ForegroundText=\"light\""
|
||||
" Logo=\"" << artifactDirXML << "\\Logo.png\""
|
||||
" SmallLogo=\"" << artifactDirXML << "\\SmallLogo.png\">\n"
|
||||
"\t\t\t\t<DefaultTile ShowName=\"allLogos\""
|
||||
" ShortName=\"" << targetNameXML << "\" />\n"
|
||||
"\t\t\t\t<SplashScreen"
|
||||
" Image=\"" << artifactDirXML << "\\SplashScreen.png\" />\n"
|
||||
"\t\t\t</VisualElements>\n"
|
||||
"\t\t</Application>\n"
|
||||
"\t</Applications>\n"
|
||||
"</Package>\n";
|
||||
|
||||
this->WriteCommonMissingFiles(manifestFile);
|
||||
}
|
||||
|
||||
void cmVisualStudio10TargetGenerator::WriteMissingFilesWS81()
|
||||
{
|
||||
std::string manifestFile =
|
||||
this->DefaultArtifactDir + "/package.appxManifest";
|
||||
std::string artifactDir =
|
||||
this->LocalGenerator->GetTargetDirectory(*this->Target);
|
||||
this->ConvertToWindowsSlash(artifactDir);
|
||||
std::string artifactDirXML = cmVS10EscapeXML(artifactDir);
|
||||
std::string targetNameXML = cmVS10EscapeXML(this->Target->GetName());
|
||||
|
||||
cmGeneratedFileStream fout(manifestFile.c_str());
|
||||
fout.SetCopyIfDifferent(true);
|
||||
|
||||
fout <<
|
||||
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
|
||||
"<Package xmlns=\"http://schemas.microsoft.com/appx/2010/manifest\""
|
||||
" xmlns:m2=\"http://schemas.microsoft.com/appx/2013/manifest\">\n"
|
||||
"\t<Identity Name=\"" << this->GUID << "\" Publisher=\"CN=CMake\""
|
||||
" Version=\"1.0.0.0\" />\n"
|
||||
"\t<Properties>\n"
|
||||
"\t\t<DisplayName>" << targetNameXML << "</DisplayName>\n"
|
||||
"\t\t<PublisherDisplayName>CMake</PublisherDisplayName>\n"
|
||||
"\t\t<Logo>" << artifactDirXML << "\\StoreLogo.png</Logo>\n"
|
||||
"\t</Properties>\n"
|
||||
"\t<Prerequisites>\n"
|
||||
"\t\t<OSMinVersion>6.3</OSMinVersion>\n"
|
||||
"\t\t<OSMaxVersionTested>6.3</OSMaxVersionTested>\n"
|
||||
"\t</Prerequisites>\n"
|
||||
"\t<Resources>\n"
|
||||
"\t\t<Resource Language=\"x-generate\" />\n"
|
||||
"\t</Resources>\n"
|
||||
"\t<Applications>\n"
|
||||
"\t\t<Application Id=\"App\""
|
||||
" Executable=\"" << targetNameXML << ".exe\""
|
||||
" EntryPoint=\"" << targetNameXML << ".App\">\n"
|
||||
"\t\t\t<m2:VisualElements\n"
|
||||
"\t\t\t\tDisplayName=\"" << targetNameXML << "\"\n"
|
||||
"\t\t\t\tDescription=\"" << targetNameXML << "\"\n"
|
||||
"\t\t\t\tBackgroundColor=\"#336699\"\n"
|
||||
"\t\t\t\tForegroundText=\"light\"\n"
|
||||
"\t\t\t\tSquare150x150Logo=\"" << artifactDirXML << "\\Logo.png\"\n"
|
||||
"\t\t\t\tSquare30x30Logo=\"" << artifactDirXML << "\\SmallLogo.png\">\n"
|
||||
"\t\t\t\t<m2:DefaultTile ShortName=\"" << targetNameXML << "\">\n"
|
||||
"\t\t\t\t\t<m2:ShowNameOnTiles>\n"
|
||||
"\t\t\t\t\t\t<m2:ShowOn Tile=\"square150x150Logo\" />\n"
|
||||
"\t\t\t\t\t</m2:ShowNameOnTiles>\n"
|
||||
"\t\t\t\t</m2:DefaultTile>\n"
|
||||
"\t\t\t\t<m2:SplashScreen"
|
||||
" Image=\"" << artifactDirXML << "\\SplashScreen.png\" />\n"
|
||||
"\t\t\t</m2:VisualElements>\n"
|
||||
"\t\t</Application>\n"
|
||||
"\t</Applications>\n"
|
||||
"</Package>\n";
|
||||
|
||||
this->WriteCommonMissingFiles(manifestFile);
|
||||
}
|
||||
|
||||
void
|
||||
cmVisualStudio10TargetGenerator
|
||||
::WriteCommonMissingFiles(const std::string& manifestFile)
|
||||
{
|
||||
std::string templateFolder = cmSystemTools::GetCMakeRoot() +
|
||||
"/Templates/Windows";
|
||||
|
||||
std::string sourceFile = this->ConvertPath(manifestFile, false);
|
||||
this->ConvertToWindowsSlash(sourceFile);
|
||||
this->WriteString("<AppxManifest Include=\"", 2);
|
||||
(*this->BuildFileStream) << cmVS10EscapeXML(sourceFile) << "\">\n";
|
||||
this->WriteString("<SubType>Designer</SubType>\n", 3);
|
||||
this->WriteString("</AppxManifest>\n", 2);
|
||||
this->AddedFiles.push_back(sourceFile);
|
||||
|
||||
std::string smallLogo = this->DefaultArtifactDir + "/SmallLogo.png";
|
||||
cmSystemTools::CopyAFile(templateFolder + "/SmallLogo.png",
|
||||
smallLogo, false);
|
||||
this->ConvertToWindowsSlash(smallLogo);
|
||||
this->WriteString("<Image Include=\"", 2);
|
||||
(*this->BuildFileStream) << cmVS10EscapeXML(smallLogo) << "\" />\n";
|
||||
this->AddedFiles.push_back(smallLogo);
|
||||
|
||||
std::string logo = this->DefaultArtifactDir + "/Logo.png";
|
||||
cmSystemTools::CopyAFile(templateFolder + "/Logo.png",
|
||||
logo, false);
|
||||
this->ConvertToWindowsSlash(logo);
|
||||
this->WriteString("<Image Include=\"", 2);
|
||||
(*this->BuildFileStream) << cmVS10EscapeXML(logo) << "\" />\n";
|
||||
this->AddedFiles.push_back(logo);
|
||||
|
||||
std::string storeLogo = this->DefaultArtifactDir + "/StoreLogo.png";
|
||||
cmSystemTools::CopyAFile(templateFolder + "/StoreLogo.png",
|
||||
storeLogo, false);
|
||||
this->ConvertToWindowsSlash(storeLogo);
|
||||
this->WriteString("<Image Include=\"", 2);
|
||||
(*this->BuildFileStream) << cmVS10EscapeXML(storeLogo) << "\" />\n";
|
||||
this->AddedFiles.push_back(storeLogo);
|
||||
|
||||
std::string splashScreen = this->DefaultArtifactDir + "/SplashScreen.png";
|
||||
cmSystemTools::CopyAFile(templateFolder + "/SplashScreen.png",
|
||||
splashScreen, false);
|
||||
this->ConvertToWindowsSlash(splashScreen);
|
||||
this->WriteString("<Image Include=\"", 2);
|
||||
(*this->BuildFileStream) << cmVS10EscapeXML(splashScreen) << "\" />\n";
|
||||
this->AddedFiles.push_back(splashScreen);
|
||||
|
||||
// This file has already been added to the build so don't copy it
|
||||
std::string keyFile = this->DefaultArtifactDir + "/Windows_TemporaryKey.pfx";
|
||||
this->ConvertToWindowsSlash(keyFile);
|
||||
this->WriteString("<None Include=\"", 2);
|
||||
(*this->BuildFileStream) << cmVS10EscapeXML(keyFile) << "\" />\n";
|
||||
}
|
||||
|
|
|
@ -67,8 +67,17 @@ private:
|
|||
void WriteDotNetReferences();
|
||||
void WriteEmbeddedResourceGroup();
|
||||
void WriteWinRTReferences();
|
||||
void WriteWinRTPackageCertificateKeyFile();
|
||||
void WritePathAndIncrementalLinkOptions();
|
||||
void WriteItemDefinitionGroups();
|
||||
void VerifyNecessaryFiles();
|
||||
void WriteMissingFiles();
|
||||
void WriteMissingFilesWP80();
|
||||
void WriteMissingFilesWP81();
|
||||
void WriteMissingFilesWS80();
|
||||
void WriteMissingFilesWS81();
|
||||
void WriteCommonMissingFiles(const std::string& manifestFile);
|
||||
void WriteTargetSpecificReferences();
|
||||
|
||||
bool ComputeClOptions();
|
||||
bool ComputeClOptions(std::string const& configName);
|
||||
|
@ -130,10 +139,14 @@ private:
|
|||
std::string GUID;
|
||||
std::string Name;
|
||||
bool MSTools;
|
||||
bool TargetCompileAsWinRT;
|
||||
cmGlobalVisualStudio10Generator* GlobalGenerator;
|
||||
cmGeneratedFileStream* BuildFileStream;
|
||||
cmLocalVisualStudio7Generator* LocalGenerator;
|
||||
std::set<cmSourceFile const*> SourcesVisited;
|
||||
bool IsMissingFiles;
|
||||
std::vector<std::string> AddedFiles;
|
||||
std::string DefaultArtifactDir;
|
||||
|
||||
typedef std::map<std::string, ToolSources> ToolSourceMap;
|
||||
ToolSourceMap Tools;
|
||||
|
|
|
@ -106,6 +106,12 @@ bool cmVisualStudioGeneratorOptions::IsDebug() const
|
|||
return this->FlagMap.find("DebugInformationFormat") != this->FlagMap.end();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool cmVisualStudioGeneratorOptions::IsWinRt() const
|
||||
{
|
||||
return this->FlagMap.find("CompileAsWinRT") != this->FlagMap.end();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool cmVisualStudioGeneratorOptions::UsingUnicode() const
|
||||
{
|
||||
|
|
|
@ -53,6 +53,7 @@ public:
|
|||
bool UsingSBCS() const;
|
||||
|
||||
bool IsDebug() const;
|
||||
bool IsWinRt() const;
|
||||
// Write options to output.
|
||||
void OutputPreprocessorDefinitions(std::ostream& fout,
|
||||
const char* prefix,
|
||||
|
|
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 801 B |
After Width: | Height: | Size: 329 B |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 429 B |
|
@ -1764,6 +1764,56 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
|
|||
endif()
|
||||
endif()
|
||||
|
||||
get_filename_component(ntver "[HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion;CurrentVersion]" NAME)
|
||||
if(WIN32 AND ntver VERSION_GREATER 6.1) # Windows >= 8.0
|
||||
macro(add_test_VSWinStorePhone name generator systemName systemVersion)
|
||||
add_test(NAME VSWinStorePhone.${name} COMMAND ${CMAKE_CTEST_COMMAND}
|
||||
--build-and-test
|
||||
"${CMake_SOURCE_DIR}/Tests/VSWinStorePhone"
|
||||
"${CMake_BINARY_DIR}/Tests/VSWinStorePhone/${name}"
|
||||
--build-generator "${generator}"
|
||||
--build-project VSWinStorePhone
|
||||
--build-config $<CONFIGURATION>
|
||||
--build-options -DCMAKE_SYSTEM_NAME=${systemName}
|
||||
-DCMAKE_SYSTEM_VERSION=${systemVersion}
|
||||
)
|
||||
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/VSWinStorePhone/${name}")
|
||||
endmacro()
|
||||
|
||||
set(reg_vs11 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\11.0;InstallDir]")
|
||||
set(reg_vs12 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\12.0;InstallDir]")
|
||||
set(reg_ws80 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v8.0;InstallationFolder]")
|
||||
set(reg_ws81 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v8.1;InstallationFolder]")
|
||||
set(reg_wp80 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\WindowsPhone\\v8.0;InstallationFolder]")
|
||||
set(reg_wp81 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\WindowsPhone\\v8.1;InstallationFolder]")
|
||||
foreach(reg vs11 vs12 ws80 ws81 wp80 wp81)
|
||||
get_filename_component(r "${reg_${reg}}" ABSOLUTE)
|
||||
if(IS_DIRECTORY "${r}")
|
||||
set(${reg} 1)
|
||||
else()
|
||||
set(${reg} 0)
|
||||
endif()
|
||||
endforeach()
|
||||
if(vs11 AND ws80)
|
||||
add_test_VSWinStorePhone(vs11-store80-X86 "Visual Studio 11 2012" WindowsStore 8.0)
|
||||
add_test_VSWinStorePhone(vs11-store80-ARM "Visual Studio 11 2012 ARM" WindowsStore 8.0)
|
||||
add_test_VSWinStorePhone(vs11-store80-X64 "Visual Studio 11 2012 Win64" WindowsStore 8.0)
|
||||
endif()
|
||||
if(vs12 AND ws81)
|
||||
add_test_VSWinStorePhone(vs12-store81-X86 "Visual Studio 12 2013" WindowsStore 8.1)
|
||||
add_test_VSWinStorePhone(vs12-store81-ARM "Visual Studio 12 2013 ARM" WindowsStore 8.1)
|
||||
add_test_VSWinStorePhone(vs12-store81-X64 "Visual Studio 12 2013 Win64" WindowsStore 8.1)
|
||||
endif()
|
||||
if(vs11 AND wp80)
|
||||
add_test_VSWinStorePhone(vs11-phone80-X86 "Visual Studio 11 2012" WindowsPhone 8.0)
|
||||
add_test_VSWinStorePhone(vs11-phone80-ARM "Visual Studio 11 2012 ARM" WindowsPhone 8.0)
|
||||
endif()
|
||||
if(vs12 AND wp81)
|
||||
add_test_VSWinStorePhone(vs12-phone81-X86 "Visual Studio 12 2013" WindowsPhone 8.1)
|
||||
add_test_VSWinStorePhone(vs12-phone81-ARM "Visual Studio 12 2013 ARM" WindowsPhone 8.1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (APPLE)
|
||||
if (CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
||||
set(BundleTestInstallDir
|
||||
|
|
|
@ -0,0 +1,114 @@
|
|||
cmake_minimum_required(VERSION 3.0)
|
||||
project(VSWinStorePhone)
|
||||
|
||||
if(MSVC_VERSION GREATER 1700)
|
||||
set(COMPILER_VERSION "12")
|
||||
elseif(MSVC_VERSION GREATER 1600)
|
||||
set(COMPILER_VERSION "11")
|
||||
endif()
|
||||
|
||||
set (APP_MANIFEST_NAME Package.appxmanifest)
|
||||
if("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsPhone")
|
||||
set(PLATFORM WP)
|
||||
add_definitions("-DPHONE")
|
||||
if("${CMAKE_SYSTEM_VERSION}" STREQUAL "8.0")
|
||||
set(APP_MANIFEST_NAME WMAppManifest.xml)
|
||||
set(WINDOWS_PHONE8 1)
|
||||
endif()
|
||||
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore")
|
||||
set(PLATFORM STORE)
|
||||
else()
|
||||
set(PLATFORM DESKTOP)
|
||||
message(FATAL_ERROR "This app supports Store / Phone only. Please edit the target platform.")
|
||||
endif()
|
||||
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
set(EXE_NAME Direct3DApp1)
|
||||
set(SHORT_NAME ${EXE_NAME})
|
||||
set(PACKAGE_GUID "6514377e-dfd4-4cdb-80df-4e0366346efc")
|
||||
|
||||
if (NOT "${PLATFORM}" STREQUAL "DESKTOP")
|
||||
configure_file(
|
||||
cmake/Package_vc${COMPILER_VERSION}.${PLATFORM}.appxmanifest.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${APP_MANIFEST_NAME}
|
||||
@ONLY)
|
||||
endif()
|
||||
|
||||
set(SOURCE_FILES
|
||||
Direct3DApp1/CubeRenderer.cpp
|
||||
Direct3DApp1/Direct3DApp1.cpp
|
||||
Direct3DApp1/Direct3DBase.cpp
|
||||
Direct3DApp1/pch.cpp
|
||||
)
|
||||
|
||||
set(HEADER_FILES
|
||||
Direct3DApp1/BasicTimer.h
|
||||
Direct3DApp1/CubeRenderer.h
|
||||
Direct3DApp1/Direct3DApp1.h
|
||||
Direct3DApp1/Direct3DBase.h
|
||||
Direct3DApp1/DirectXHelper.h
|
||||
Direct3DApp1/pch.h
|
||||
)
|
||||
|
||||
set(PIXELSHADER_FILES
|
||||
Direct3DApp1/SimplePixelShader.hlsl
|
||||
)
|
||||
|
||||
set(VERTEXSHADER_FILES
|
||||
Direct3DApp1/SimpleVertexShader.hlsl
|
||||
)
|
||||
|
||||
set(CONTENT_FILES ${PIXELSHADER_FILES} ${VERTEXSHADER_FILES})
|
||||
|
||||
if (WINDOWS_PHONE8)
|
||||
set(CONTENT_FILES ${CONTENT_FILES}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${APP_MANIFEST_NAME}
|
||||
Direct3DApp1/Assets/Tiles/FlipCycleTileLarge.png
|
||||
Direct3DApp1/Assets/Tiles/FlipCycleTileMedium.png
|
||||
Direct3DApp1/Assets/Tiles/FlipCycleTileSmall.png
|
||||
Direct3DApp1/Assets/Tiles/IconicTileMediumLarge.png
|
||||
Direct3DApp1/Assets/Tiles/IconicTileSmall.png
|
||||
Direct3DApp1/Assets/ApplicationIcon.png
|
||||
)
|
||||
# Windows Phone 8.0 needs to copy all the images.
|
||||
# It doesn't know to use relative paths.
|
||||
file(COPY
|
||||
Direct3DApp1/Assets/Tiles/FlipCycleTileLarge.png
|
||||
Direct3DApp1/Assets/Tiles/FlipCycleTileMedium.png
|
||||
Direct3DApp1/Assets/Tiles/FlipCycleTileSmall.png
|
||||
Direct3DApp1/Assets/Tiles/IconicTileMediumLarge.png
|
||||
Direct3DApp1/Assets/Tiles/IconicTileSmall.png
|
||||
Direct3DApp1/Assets/ApplicationIcon.png
|
||||
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
|
||||
)
|
||||
|
||||
elseif (NOT "${PLATFORM}" STREQUAL "DESKTOP")
|
||||
set(CONTENT_FILES ${CONTENT_FILES}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${APP_MANIFEST_NAME}
|
||||
Direct3DApp1/Assets/Logo.png
|
||||
Direct3DApp1/Assets/SmallLogo.png
|
||||
Direct3DApp1/Assets/SplashScreen.png
|
||||
Direct3DApp1/Assets/StoreLogo.png
|
||||
)
|
||||
endif()
|
||||
|
||||
set(RESOURCE_FILES
|
||||
${CONTENT_FILES} ${DEBUG_CONTENT_FILES} ${RELEASE_CONTENT_FILES}
|
||||
Direct3DApp1/Direct3DApp1_TemporaryKey.pfx)
|
||||
|
||||
set_property(SOURCE ${CONTENT_FILES} PROPERTY VS_DEPLOYMENT_CONTENT 1)
|
||||
set_property(SOURCE ${DEBUG_CONTENT_FILES} PROPERTY VS_DEPLOYMENT_CONTENT $<CONFIG:Debug>)
|
||||
set_property(SOURCE ${RELEASE_CONTENT_FILES} PROPERTY
|
||||
VS_DEPLOYMENT_CONTENT $<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>,$<CONFIG:MinSizeRel>>)
|
||||
|
||||
set_property(SOURCE ${PIXELSHADER_FILES} PROPERTY VS_SHADER_TYPE Pixel)
|
||||
set_property(SOURCE ${VERTEXSHADER_FILES} PROPERTY VS_SHADER_TYPE Vertex)
|
||||
|
||||
source_group("Source Files" FILES ${SOURCE_FILES})
|
||||
source_group("Header Files" FILES ${HEADER_FILES})
|
||||
source_group("Resource Files" FILES ${RESOURCE_FILES})
|
||||
|
||||
add_executable(${EXE_NAME} WIN32 ${SOURCE_FILES} ${HEADER_FILES} ${RESOURCE_FILES})
|
||||
set_property(TARGET ${EXE_NAME} PROPERTY VS_WINRT_COMPONENT TRUE)
|
||||
target_link_libraries(${EXE_NAME} d3d11)
|
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 801 B |
After Width: | Height: | Size: 329 B |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 429 B |
After Width: | Height: | Size: 9.7 KiB |
After Width: | Height: | Size: 8.9 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 4.8 KiB |
After Width: | Height: | Size: 3.6 KiB |
|
@ -0,0 +1,76 @@
|
|||
#pragma once
|
||||
|
||||
#include <wrl.h>
|
||||
|
||||
// Helper class for basic timing.
|
||||
ref class BasicTimer sealed
|
||||
{
|
||||
public:
|
||||
// Initializes internal timer values.
|
||||
BasicTimer()
|
||||
{
|
||||
if (!QueryPerformanceFrequency(&m_frequency))
|
||||
{
|
||||
throw ref new Platform::FailureException();
|
||||
}
|
||||
Reset();
|
||||
}
|
||||
|
||||
// Reset the timer to initial values.
|
||||
void Reset()
|
||||
{
|
||||
Update();
|
||||
m_startTime = m_currentTime;
|
||||
m_total = 0.0f;
|
||||
m_delta = 1.0f / 60.0f;
|
||||
}
|
||||
|
||||
// Update the timer's internal values.
|
||||
void Update()
|
||||
{
|
||||
if (!QueryPerformanceCounter(&m_currentTime))
|
||||
{
|
||||
throw ref new Platform::FailureException();
|
||||
}
|
||||
|
||||
m_total = static_cast<float>(
|
||||
static_cast<double>(m_currentTime.QuadPart - m_startTime.QuadPart) /
|
||||
static_cast<double>(m_frequency.QuadPart)
|
||||
);
|
||||
|
||||
if (m_lastTime.QuadPart == m_startTime.QuadPart)
|
||||
{
|
||||
// If the timer was just reset, report a time delta equivalent to 60Hz frame time.
|
||||
m_delta = 1.0f / 60.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_delta = static_cast<float>(
|
||||
static_cast<double>(m_currentTime.QuadPart - m_lastTime.QuadPart) /
|
||||
static_cast<double>(m_frequency.QuadPart)
|
||||
);
|
||||
}
|
||||
|
||||
m_lastTime = m_currentTime;
|
||||
}
|
||||
|
||||
// Duration in seconds between the last call to Reset() and the last call to Update().
|
||||
property float Total
|
||||
{
|
||||
float get() { return m_total; }
|
||||
}
|
||||
|
||||
// Duration in seconds between the previous two calls to Update().
|
||||
property float Delta
|
||||
{
|
||||
float get() { return m_delta; }
|
||||
}
|
||||
|
||||
private:
|
||||
LARGE_INTEGER m_frequency;
|
||||
LARGE_INTEGER m_currentTime;
|
||||
LARGE_INTEGER m_startTime;
|
||||
LARGE_INTEGER m_lastTime;
|
||||
float m_total;
|
||||
float m_delta;
|
||||
};
|
|
@ -0,0 +1,260 @@
|
|||
#include "pch.h"
|
||||
#include "CubeRenderer.h"
|
||||
|
||||
using namespace DirectX;
|
||||
using namespace Microsoft::WRL;
|
||||
using namespace Windows::Foundation;
|
||||
using namespace Windows::UI::Core;
|
||||
|
||||
CubeRenderer::CubeRenderer() :
|
||||
m_loadingComplete(false),
|
||||
m_indexCount(0)
|
||||
{
|
||||
}
|
||||
|
||||
void CubeRenderer::CreateDeviceResources()
|
||||
{
|
||||
Direct3DBase::CreateDeviceResources();
|
||||
|
||||
auto loadVSTask = DX::ReadDataAsync("SimpleVertexShader.cso");
|
||||
auto loadPSTask = DX::ReadDataAsync("SimplePixelShader.cso");
|
||||
|
||||
auto createVSTask = loadVSTask.then([this](Platform::Array<byte>^ fileData) {
|
||||
DX::ThrowIfFailed(
|
||||
m_d3dDevice->CreateVertexShader(
|
||||
fileData->Data,
|
||||
fileData->Length,
|
||||
nullptr,
|
||||
&m_vertexShader
|
||||
)
|
||||
);
|
||||
|
||||
const D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
|
||||
{
|
||||
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
||||
{ "COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
||||
};
|
||||
|
||||
DX::ThrowIfFailed(
|
||||
m_d3dDevice->CreateInputLayout(
|
||||
vertexDesc,
|
||||
ARRAYSIZE(vertexDesc),
|
||||
fileData->Data,
|
||||
fileData->Length,
|
||||
&m_inputLayout
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
auto createPSTask = loadPSTask.then([this](Platform::Array<byte>^ fileData) {
|
||||
DX::ThrowIfFailed(
|
||||
m_d3dDevice->CreatePixelShader(
|
||||
fileData->Data,
|
||||
fileData->Length,
|
||||
nullptr,
|
||||
&m_pixelShader
|
||||
)
|
||||
);
|
||||
|
||||
CD3D11_BUFFER_DESC constantBufferDesc(sizeof(ModelViewProjectionConstantBuffer), D3D11_BIND_CONSTANT_BUFFER);
|
||||
DX::ThrowIfFailed(
|
||||
m_d3dDevice->CreateBuffer(
|
||||
&constantBufferDesc,
|
||||
nullptr,
|
||||
&m_constantBuffer
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
auto createCubeTask = (createPSTask && createVSTask).then([this] () {
|
||||
VertexPositionColor cubeVertices[] =
|
||||
{
|
||||
{XMFLOAT3(-0.5f, -0.5f, -0.5f), XMFLOAT3(0.0f, 0.0f, 0.0f)},
|
||||
{XMFLOAT3(-0.5f, -0.5f, 0.5f), XMFLOAT3(0.0f, 0.0f, 1.0f)},
|
||||
{XMFLOAT3(-0.5f, 0.5f, -0.5f), XMFLOAT3(0.0f, 1.0f, 0.0f)},
|
||||
{XMFLOAT3(-0.5f, 0.5f, 0.5f), XMFLOAT3(0.0f, 1.0f, 1.0f)},
|
||||
{XMFLOAT3( 0.5f, -0.5f, -0.5f), XMFLOAT3(1.0f, 0.0f, 0.0f)},
|
||||
{XMFLOAT3( 0.5f, -0.5f, 0.5f), XMFLOAT3(1.0f, 0.0f, 1.0f)},
|
||||
{XMFLOAT3( 0.5f, 0.5f, -0.5f), XMFLOAT3(1.0f, 1.0f, 0.0f)},
|
||||
{XMFLOAT3( 0.5f, 0.5f, 0.5f), XMFLOAT3(1.0f, 1.0f, 1.0f)},
|
||||
};
|
||||
|
||||
D3D11_SUBRESOURCE_DATA vertexBufferData = {0};
|
||||
vertexBufferData.pSysMem = cubeVertices;
|
||||
vertexBufferData.SysMemPitch = 0;
|
||||
vertexBufferData.SysMemSlicePitch = 0;
|
||||
CD3D11_BUFFER_DESC vertexBufferDesc(sizeof(cubeVertices), D3D11_BIND_VERTEX_BUFFER);
|
||||
DX::ThrowIfFailed(
|
||||
m_d3dDevice->CreateBuffer(
|
||||
&vertexBufferDesc,
|
||||
&vertexBufferData,
|
||||
&m_vertexBuffer
|
||||
)
|
||||
);
|
||||
|
||||
unsigned short cubeIndices[] =
|
||||
{
|
||||
0,2,1, // -x
|
||||
1,2,3,
|
||||
|
||||
4,5,6, // +x
|
||||
5,7,6,
|
||||
|
||||
0,1,5, // -y
|
||||
0,5,4,
|
||||
|
||||
2,6,7, // +y
|
||||
2,7,3,
|
||||
|
||||
0,4,6, // -z
|
||||
0,6,2,
|
||||
|
||||
1,3,7, // +z
|
||||
1,7,5,
|
||||
};
|
||||
|
||||
m_indexCount = ARRAYSIZE(cubeIndices);
|
||||
|
||||
D3D11_SUBRESOURCE_DATA indexBufferData = {0};
|
||||
indexBufferData.pSysMem = cubeIndices;
|
||||
indexBufferData.SysMemPitch = 0;
|
||||
indexBufferData.SysMemSlicePitch = 0;
|
||||
CD3D11_BUFFER_DESC indexBufferDesc(sizeof(cubeIndices), D3D11_BIND_INDEX_BUFFER);
|
||||
DX::ThrowIfFailed(
|
||||
m_d3dDevice->CreateBuffer(
|
||||
&indexBufferDesc,
|
||||
&indexBufferData,
|
||||
&m_indexBuffer
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
createCubeTask.then([this] () {
|
||||
m_loadingComplete = true;
|
||||
});
|
||||
}
|
||||
|
||||
void CubeRenderer::CreateWindowSizeDependentResources()
|
||||
{
|
||||
Direct3DBase::CreateWindowSizeDependentResources();
|
||||
|
||||
float aspectRatio = m_windowBounds.Width / m_windowBounds.Height;
|
||||
float fovAngleY = 70.0f * XM_PI / 180.0f;
|
||||
if (aspectRatio < 1.0f)
|
||||
{
|
||||
fovAngleY /= aspectRatio;
|
||||
}
|
||||
|
||||
// Note that the m_orientationTransform3D matrix is post-multiplied here
|
||||
// in order to correctly orient the scene to match the display orientation.
|
||||
// This post-multiplication step is required for any draw calls that are
|
||||
// made to the swap chain render target. For draw calls to other targets,
|
||||
// this transform should not be applied.
|
||||
XMStoreFloat4x4(
|
||||
&m_constantBufferData.projection,
|
||||
XMMatrixTranspose(
|
||||
XMMatrixMultiply(
|
||||
XMMatrixPerspectiveFovRH(
|
||||
fovAngleY,
|
||||
aspectRatio,
|
||||
0.01f,
|
||||
100.0f
|
||||
),
|
||||
XMLoadFloat4x4(&m_orientationTransform3D)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
void CubeRenderer::Update(float timeTotal, float timeDelta)
|
||||
{
|
||||
(void) timeDelta; // Unused parameter.
|
||||
|
||||
XMVECTOR eye = XMVectorSet(0.0f, 0.7f, 1.5f, 0.0f);
|
||||
XMVECTOR at = XMVectorSet(0.0f, -0.1f, 0.0f, 0.0f);
|
||||
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
|
||||
|
||||
XMStoreFloat4x4(&m_constantBufferData.view, XMMatrixTranspose(XMMatrixLookAtRH(eye, at, up)));
|
||||
XMStoreFloat4x4(&m_constantBufferData.model, XMMatrixTranspose(XMMatrixRotationY(timeTotal * XM_PIDIV4)));
|
||||
}
|
||||
|
||||
void CubeRenderer::Render()
|
||||
{
|
||||
const float midnightBlue[] = { 0.098f, 0.098f, 0.439f, 1.000f };
|
||||
m_d3dContext->ClearRenderTargetView(
|
||||
m_renderTargetView.Get(),
|
||||
midnightBlue
|
||||
);
|
||||
|
||||
m_d3dContext->ClearDepthStencilView(
|
||||
m_depthStencilView.Get(),
|
||||
D3D11_CLEAR_DEPTH,
|
||||
1.0f,
|
||||
0
|
||||
);
|
||||
|
||||
// Only draw the cube once it is loaded (loading is asynchronous).
|
||||
if (!m_loadingComplete)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_d3dContext->OMSetRenderTargets(
|
||||
1,
|
||||
m_renderTargetView.GetAddressOf(),
|
||||
m_depthStencilView.Get()
|
||||
);
|
||||
|
||||
m_d3dContext->UpdateSubresource(
|
||||
m_constantBuffer.Get(),
|
||||
0,
|
||||
NULL,
|
||||
&m_constantBufferData,
|
||||
0,
|
||||
0
|
||||
);
|
||||
|
||||
UINT stride = sizeof(VertexPositionColor);
|
||||
UINT offset = 0;
|
||||
m_d3dContext->IASetVertexBuffers(
|
||||
0,
|
||||
1,
|
||||
m_vertexBuffer.GetAddressOf(),
|
||||
&stride,
|
||||
&offset
|
||||
);
|
||||
|
||||
m_d3dContext->IASetIndexBuffer(
|
||||
m_indexBuffer.Get(),
|
||||
DXGI_FORMAT_R16_UINT,
|
||||
0
|
||||
);
|
||||
|
||||
m_d3dContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
||||
|
||||
m_d3dContext->IASetInputLayout(m_inputLayout.Get());
|
||||
|
||||
m_d3dContext->VSSetShader(
|
||||
m_vertexShader.Get(),
|
||||
nullptr,
|
||||
0
|
||||
);
|
||||
|
||||
m_d3dContext->VSSetConstantBuffers(
|
||||
0,
|
||||
1,
|
||||
m_constantBuffer.GetAddressOf()
|
||||
);
|
||||
|
||||
m_d3dContext->PSSetShader(
|
||||
m_pixelShader.Get(),
|
||||
nullptr,
|
||||
0
|
||||
);
|
||||
|
||||
m_d3dContext->DrawIndexed(
|
||||
m_indexCount,
|
||||
0,
|
||||
0
|
||||
);
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
#pragma once
|
||||
|
||||
#include "Direct3DBase.h"
|
||||
|
||||
struct ModelViewProjectionConstantBuffer
|
||||
{
|
||||
DirectX::XMFLOAT4X4 model;
|
||||
DirectX::XMFLOAT4X4 view;
|
||||
DirectX::XMFLOAT4X4 projection;
|
||||
};
|
||||
|
||||
struct VertexPositionColor
|
||||
{
|
||||
DirectX::XMFLOAT3 pos;
|
||||
DirectX::XMFLOAT3 color;
|
||||
};
|
||||
|
||||
// This class renders a simple spinning cube.
|
||||
ref class CubeRenderer sealed : public Direct3DBase
|
||||
{
|
||||
public:
|
||||
CubeRenderer();
|
||||
|
||||
// Direct3DBase methods.
|
||||
virtual void CreateDeviceResources() override;
|
||||
virtual void CreateWindowSizeDependentResources() override;
|
||||
virtual void Render() override;
|
||||
|
||||
// Method for updating time-dependent objects.
|
||||
void Update(float timeTotal, float timeDelta);
|
||||
|
||||
private:
|
||||
bool m_loadingComplete;
|
||||
|
||||
Microsoft::WRL::ComPtr<ID3D11InputLayout> m_inputLayout;
|
||||
Microsoft::WRL::ComPtr<ID3D11Buffer> m_vertexBuffer;
|
||||
Microsoft::WRL::ComPtr<ID3D11Buffer> m_indexBuffer;
|
||||
Microsoft::WRL::ComPtr<ID3D11VertexShader> m_vertexShader;
|
||||
Microsoft::WRL::ComPtr<ID3D11PixelShader> m_pixelShader;
|
||||
Microsoft::WRL::ComPtr<ID3D11Buffer> m_constantBuffer;
|
||||
|
||||
uint32 m_indexCount;
|
||||
ModelViewProjectionConstantBuffer m_constantBufferData;
|
||||
};
|
|
@ -0,0 +1,153 @@
|
|||
#include "pch.h"
|
||||
#include "Direct3DApp1.h"
|
||||
#include "BasicTimer.h"
|
||||
|
||||
using namespace Windows::ApplicationModel;
|
||||
using namespace Windows::ApplicationModel::Core;
|
||||
using namespace Windows::ApplicationModel::Activation;
|
||||
using namespace Windows::UI::Core;
|
||||
using namespace Windows::System;
|
||||
using namespace Windows::Foundation;
|
||||
using namespace Windows::Graphics::Display;
|
||||
using namespace concurrency;
|
||||
|
||||
Direct3DApp1::Direct3DApp1() :
|
||||
m_windowClosed(false),
|
||||
m_windowVisible(true)
|
||||
{
|
||||
}
|
||||
|
||||
void Direct3DApp1::Initialize(CoreApplicationView^ applicationView)
|
||||
{
|
||||
applicationView->Activated +=
|
||||
ref new TypedEventHandler<CoreApplicationView^, IActivatedEventArgs^>(this, &Direct3DApp1::OnActivated);
|
||||
|
||||
CoreApplication::Suspending +=
|
||||
ref new EventHandler<SuspendingEventArgs^>(this, &Direct3DApp1::OnSuspending);
|
||||
|
||||
CoreApplication::Resuming +=
|
||||
ref new EventHandler<Platform::Object^>(this, &Direct3DApp1::OnResuming);
|
||||
|
||||
m_renderer = ref new CubeRenderer();
|
||||
}
|
||||
|
||||
void Direct3DApp1::SetWindow(CoreWindow^ window)
|
||||
{
|
||||
window->SizeChanged +=
|
||||
ref new TypedEventHandler<CoreWindow^, WindowSizeChangedEventArgs^>(this, &Direct3DApp1::OnWindowSizeChanged);
|
||||
|
||||
window->VisibilityChanged +=
|
||||
ref new TypedEventHandler<CoreWindow^, VisibilityChangedEventArgs^>(this, &Direct3DApp1::OnVisibilityChanged);
|
||||
|
||||
window->Closed +=
|
||||
ref new TypedEventHandler<CoreWindow^, CoreWindowEventArgs^>(this, &Direct3DApp1::OnWindowClosed);
|
||||
|
||||
#ifndef PHONE
|
||||
window->PointerCursor = ref new CoreCursor(CoreCursorType::Arrow, 0);
|
||||
#endif
|
||||
|
||||
window->PointerPressed +=
|
||||
ref new TypedEventHandler<CoreWindow^, PointerEventArgs^>(this, &Direct3DApp1::OnPointerPressed);
|
||||
|
||||
window->PointerMoved +=
|
||||
ref new TypedEventHandler<CoreWindow^, PointerEventArgs^>(this, &Direct3DApp1::OnPointerMoved);
|
||||
|
||||
m_renderer->Initialize(CoreWindow::GetForCurrentThread());
|
||||
}
|
||||
|
||||
void Direct3DApp1::Load(Platform::String^ entryPoint)
|
||||
{
|
||||
}
|
||||
|
||||
void Direct3DApp1::Run()
|
||||
{
|
||||
BasicTimer^ timer = ref new BasicTimer();
|
||||
|
||||
while (!m_windowClosed)
|
||||
{
|
||||
if (m_windowVisible)
|
||||
{
|
||||
timer->Update();
|
||||
CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
|
||||
m_renderer->Update(timer->Total, timer->Delta);
|
||||
m_renderer->Render();
|
||||
m_renderer->Present(); // This call is synchronized to the display frame rate.
|
||||
}
|
||||
else
|
||||
{
|
||||
CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Direct3DApp1::Uninitialize()
|
||||
{
|
||||
}
|
||||
|
||||
void Direct3DApp1::OnWindowSizeChanged(CoreWindow^ sender, WindowSizeChangedEventArgs^ args)
|
||||
{
|
||||
m_renderer->UpdateForWindowSizeChange();
|
||||
}
|
||||
|
||||
void Direct3DApp1::OnVisibilityChanged(CoreWindow^ sender, VisibilityChangedEventArgs^ args)
|
||||
{
|
||||
m_windowVisible = args->Visible;
|
||||
}
|
||||
|
||||
void Direct3DApp1::OnWindowClosed(CoreWindow^ sender, CoreWindowEventArgs^ args)
|
||||
{
|
||||
m_windowClosed = true;
|
||||
}
|
||||
|
||||
void Direct3DApp1::OnPointerPressed(CoreWindow^ sender, PointerEventArgs^ args)
|
||||
{
|
||||
// Insert your code here.
|
||||
}
|
||||
|
||||
void Direct3DApp1::OnPointerMoved(CoreWindow^ sender, PointerEventArgs^ args)
|
||||
{
|
||||
// Insert your code here.
|
||||
}
|
||||
|
||||
void Direct3DApp1::OnActivated(CoreApplicationView^ applicationView, IActivatedEventArgs^ args)
|
||||
{
|
||||
CoreWindow::GetForCurrentThread()->Activate();
|
||||
}
|
||||
|
||||
void Direct3DApp1::OnSuspending(Platform::Object^ sender, SuspendingEventArgs^ args)
|
||||
{
|
||||
// Save app state asynchronously after requesting a deferral. Holding a deferral
|
||||
// indicates that the application is busy performing suspending operations. Be
|
||||
// aware that a deferral may not be held indefinitely. After about five seconds,
|
||||
// the app will be forced to exit.
|
||||
SuspendingDeferral^ deferral = args->SuspendingOperation->GetDeferral();
|
||||
m_renderer->ReleaseResourcesForSuspending();
|
||||
|
||||
create_task([this, deferral]()
|
||||
{
|
||||
// Insert your code here.
|
||||
|
||||
deferral->Complete();
|
||||
});
|
||||
}
|
||||
|
||||
void Direct3DApp1::OnResuming(Platform::Object^ sender, Platform::Object^ args)
|
||||
{
|
||||
// Restore any data or state that was unloaded on suspend. By default, data
|
||||
// and state are persisted when resuming from suspend. Note that this event
|
||||
// does not occur if the app was previously terminated.
|
||||
m_renderer->CreateWindowSizeDependentResources();
|
||||
}
|
||||
|
||||
IFrameworkView^ Direct3DApplicationSource::CreateView()
|
||||
{
|
||||
return ref new Direct3DApp1();
|
||||
}
|
||||
|
||||
[Platform::MTAThread]
|
||||
int main(Platform::Array<Platform::String^>^)
|
||||
{
|
||||
auto direct3DApplicationSource = ref new Direct3DApplicationSource();
|
||||
CoreApplication::Run(direct3DApplicationSource);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
#pragma once
|
||||
|
||||
#include "pch.h"
|
||||
#include "CubeRenderer.h"
|
||||
|
||||
ref class Direct3DApp1 sealed : public Windows::ApplicationModel::Core::IFrameworkView
|
||||
{
|
||||
public:
|
||||
Direct3DApp1();
|
||||
|
||||
// IFrameworkView Methods.
|
||||
virtual void Initialize(Windows::ApplicationModel::Core::CoreApplicationView^ applicationView);
|
||||
virtual void SetWindow(Windows::UI::Core::CoreWindow^ window);
|
||||
virtual void Load(Platform::String^ entryPoint);
|
||||
virtual void Run();
|
||||
virtual void Uninitialize();
|
||||
|
||||
protected:
|
||||
// Event Handlers.
|
||||
void OnWindowSizeChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::WindowSizeChangedEventArgs^ args);
|
||||
void OnLogicalDpiChanged(Platform::Object^ sender);
|
||||
void OnActivated(Windows::ApplicationModel::Core::CoreApplicationView^ applicationView, Windows::ApplicationModel::Activation::IActivatedEventArgs^ args);
|
||||
void OnSuspending(Platform::Object^ sender, Windows::ApplicationModel::SuspendingEventArgs^ args);
|
||||
void OnResuming(Platform::Object^ sender, Platform::Object^ args);
|
||||
void OnWindowClosed(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::CoreWindowEventArgs^ args);
|
||||
void OnVisibilityChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::VisibilityChangedEventArgs^ args);
|
||||
void OnPointerPressed(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args);
|
||||
void OnPointerMoved(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args);
|
||||
|
||||
private:
|
||||
CubeRenderer^ m_renderer;
|
||||
bool m_windowClosed;
|
||||
bool m_windowVisible;
|
||||
};
|
||||
|
||||
ref class Direct3DApplicationSource sealed : Windows::ApplicationModel::Core::IFrameworkViewSource
|
||||
{
|
||||
public:
|
||||
virtual Windows::ApplicationModel::Core::IFrameworkView^ CreateView();
|
||||
};
|
|
@ -0,0 +1,384 @@
|
|||
#include "pch.h"
|
||||
#include "Direct3DBase.h"
|
||||
|
||||
using namespace DirectX;
|
||||
using namespace Microsoft::WRL;
|
||||
using namespace Windows::UI::Core;
|
||||
using namespace Windows::Foundation;
|
||||
using namespace Windows::Graphics::Display;
|
||||
|
||||
// Constructor.
|
||||
Direct3DBase::Direct3DBase()
|
||||
{
|
||||
}
|
||||
|
||||
// Initialize the Direct3D resources required to run.
|
||||
void Direct3DBase::Initialize(CoreWindow^ window)
|
||||
{
|
||||
m_window = window;
|
||||
|
||||
CreateDeviceResources();
|
||||
CreateWindowSizeDependentResources();
|
||||
}
|
||||
|
||||
// Recreate all device resources and set them back to the current state.
|
||||
void Direct3DBase::HandleDeviceLost()
|
||||
{
|
||||
// Reset these member variables to ensure that UpdateForWindowSizeChange recreates all resources.
|
||||
m_windowBounds.Width = 0;
|
||||
m_windowBounds.Height = 0;
|
||||
m_swapChain = nullptr;
|
||||
|
||||
CreateDeviceResources();
|
||||
UpdateForWindowSizeChange();
|
||||
}
|
||||
|
||||
// These are the resources that depend on the device.
|
||||
void Direct3DBase::CreateDeviceResources()
|
||||
{
|
||||
// This flag adds support for surfaces with a different color channel ordering
|
||||
// than the API default. It is required for compatibility with Direct2D.
|
||||
UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
|
||||
|
||||
#if defined(_DEBUG)
|
||||
// If the project is in a debug build, enable debugging via SDK Layers with this flag.
|
||||
creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
|
||||
#endif
|
||||
|
||||
// This array defines the set of DirectX hardware feature levels this app will support.
|
||||
// Note the ordering should be preserved.
|
||||
// Don't forget to declare your application's minimum required feature level in its
|
||||
// description. All applications are assumed to support 9.1 unless otherwise stated.
|
||||
D3D_FEATURE_LEVEL featureLevels[] =
|
||||
{
|
||||
D3D_FEATURE_LEVEL_11_1,
|
||||
D3D_FEATURE_LEVEL_11_0,
|
||||
D3D_FEATURE_LEVEL_10_1,
|
||||
D3D_FEATURE_LEVEL_10_0,
|
||||
D3D_FEATURE_LEVEL_9_3,
|
||||
D3D_FEATURE_LEVEL_9_2,
|
||||
D3D_FEATURE_LEVEL_9_1
|
||||
};
|
||||
|
||||
// Create the Direct3D 11 API device object and a corresponding context.
|
||||
ComPtr<ID3D11Device> device;
|
||||
ComPtr<ID3D11DeviceContext> context;
|
||||
DX::ThrowIfFailed(
|
||||
D3D11CreateDevice(
|
||||
nullptr, // Specify nullptr to use the default adapter.
|
||||
D3D_DRIVER_TYPE_HARDWARE,
|
||||
nullptr,
|
||||
creationFlags, // Set set debug and Direct2D compatibility flags.
|
||||
featureLevels, // List of feature levels this app can support.
|
||||
ARRAYSIZE(featureLevels),
|
||||
D3D11_SDK_VERSION, // Always set this to D3D11_SDK_VERSION for Windows Store apps.
|
||||
&device, // Returns the Direct3D device created.
|
||||
&m_featureLevel, // Returns feature level of device created.
|
||||
&context // Returns the device immediate context.
|
||||
)
|
||||
);
|
||||
|
||||
// Get the Direct3D 11.1 API device and context interfaces.
|
||||
DX::ThrowIfFailed(
|
||||
device.As(&m_d3dDevice)
|
||||
);
|
||||
|
||||
DX::ThrowIfFailed(
|
||||
context.As(&m_d3dContext)
|
||||
);
|
||||
}
|
||||
|
||||
// Allocate all memory resources that change on a window SizeChanged event.
|
||||
void Direct3DBase::CreateWindowSizeDependentResources()
|
||||
{
|
||||
// Store the window bounds so the next time we get a SizeChanged event we can
|
||||
// avoid rebuilding everything if the size is identical.
|
||||
m_windowBounds = m_window->Bounds;
|
||||
|
||||
// Calculate the necessary swap chain and render target size in pixels.
|
||||
float windowWidth = ConvertDipsToPixels(m_windowBounds.Width);
|
||||
float windowHeight = ConvertDipsToPixels(m_windowBounds.Height);
|
||||
|
||||
// The width and height of the swap chain must be based on the window's
|
||||
// landscape-oriented width and height. If the window is in a portrait
|
||||
// orientation, the dimensions must be reversed.
|
||||
#if WINVER > 0x0602
|
||||
m_orientation = DisplayInformation::GetForCurrentView()->CurrentOrientation;
|
||||
#else
|
||||
#if PHONE
|
||||
// WP8 doesn't support rotations so always make it landscape
|
||||
m_orientation = DisplayOrientations::Landscape;
|
||||
#else
|
||||
m_orientation = DisplayProperties::CurrentOrientation;
|
||||
#endif
|
||||
#endif
|
||||
bool swapDimensions =
|
||||
m_orientation == DisplayOrientations::Portrait ||
|
||||
m_orientation == DisplayOrientations::PortraitFlipped;
|
||||
m_renderTargetSize.Width = swapDimensions ? windowHeight : windowWidth;
|
||||
m_renderTargetSize.Height = swapDimensions ? windowWidth : windowHeight;
|
||||
|
||||
if(m_swapChain != nullptr)
|
||||
{
|
||||
// If the swap chain already exists, resize it.
|
||||
DX::ThrowIfFailed(
|
||||
m_swapChain->ResizeBuffers(
|
||||
2, // Double-buffered swap chain.
|
||||
static_cast<UINT>(m_renderTargetSize.Width),
|
||||
static_cast<UINT>(m_renderTargetSize.Height),
|
||||
DXGI_FORMAT_B8G8R8A8_UNORM,
|
||||
0
|
||||
)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Otherwise, create a new one using the same adapter as the existing Direct3D device.
|
||||
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
|
||||
swapChainDesc.Width = static_cast<UINT>(m_renderTargetSize.Width); // Match the size of the window.
|
||||
swapChainDesc.Height = static_cast<UINT>(m_renderTargetSize.Height);
|
||||
swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swap chain format.
|
||||
swapChainDesc.Stereo = false;
|
||||
swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling.
|
||||
swapChainDesc.SampleDesc.Quality = 0;
|
||||
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
||||
#if PHONE && WINVER <= 0x0602
|
||||
swapChainDesc.BufferCount = 1; // Use double-buffering to minimize latency.
|
||||
swapChainDesc.Scaling = DXGI_SCALING_STRETCH; // On phone, only stretch and aspect-ratio stretch scaling are allowed.
|
||||
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; // On phone, no swap effects are supported.
|
||||
#else
|
||||
swapChainDesc.BufferCount = 2; // Use double-buffering to minimize latency.
|
||||
swapChainDesc.Scaling = DXGI_SCALING_NONE;
|
||||
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // All Windows Store apps must use this SwapEffect.
|
||||
#endif
|
||||
swapChainDesc.Flags = 0;
|
||||
|
||||
ComPtr<IDXGIDevice1> dxgiDevice;
|
||||
DX::ThrowIfFailed(
|
||||
m_d3dDevice.As(&dxgiDevice)
|
||||
);
|
||||
|
||||
ComPtr<IDXGIAdapter> dxgiAdapter;
|
||||
DX::ThrowIfFailed(
|
||||
dxgiDevice->GetAdapter(&dxgiAdapter)
|
||||
);
|
||||
|
||||
ComPtr<IDXGIFactory2> dxgiFactory;
|
||||
DX::ThrowIfFailed(
|
||||
dxgiAdapter->GetParent(
|
||||
__uuidof(IDXGIFactory2),
|
||||
&dxgiFactory
|
||||
)
|
||||
);
|
||||
|
||||
Windows::UI::Core::CoreWindow^ window = m_window.Get();
|
||||
DX::ThrowIfFailed(
|
||||
dxgiFactory->CreateSwapChainForCoreWindow(
|
||||
m_d3dDevice.Get(),
|
||||
reinterpret_cast<IUnknown*>(window),
|
||||
&swapChainDesc,
|
||||
nullptr, // Allow on all displays.
|
||||
&m_swapChain
|
||||
)
|
||||
);
|
||||
|
||||
// Ensure that DXGI does not queue more than one frame at a time. This both reduces latency and
|
||||
// ensures that the application will only render after each VSync, minimizing power consumption.
|
||||
DX::ThrowIfFailed(
|
||||
dxgiDevice->SetMaximumFrameLatency(1)
|
||||
);
|
||||
}
|
||||
|
||||
// Set the proper orientation for the swap chain, and generate the
|
||||
// 3D matrix transformation for rendering to the rotated swap chain.
|
||||
DXGI_MODE_ROTATION rotation = DXGI_MODE_ROTATION_UNSPECIFIED;
|
||||
switch (m_orientation)
|
||||
{
|
||||
case DisplayOrientations::Landscape:
|
||||
rotation = DXGI_MODE_ROTATION_IDENTITY;
|
||||
m_orientationTransform3D = XMFLOAT4X4( // 0-degree Z-rotation
|
||||
1.0f, 0.0f, 0.0f, 0.0f,
|
||||
0.0f, 1.0f, 0.0f, 0.0f,
|
||||
0.0f, 0.0f, 1.0f, 0.0f,
|
||||
0.0f, 0.0f, 0.0f, 1.0f
|
||||
);
|
||||
break;
|
||||
|
||||
case DisplayOrientations::Portrait:
|
||||
rotation = DXGI_MODE_ROTATION_ROTATE270;
|
||||
m_orientationTransform3D = XMFLOAT4X4( // 90-degree Z-rotation
|
||||
0.0f, 1.0f, 0.0f, 0.0f,
|
||||
-1.0f, 0.0f, 0.0f, 0.0f,
|
||||
0.0f, 0.0f, 1.0f, 0.0f,
|
||||
0.0f, 0.0f, 0.0f, 1.0f
|
||||
);
|
||||
break;
|
||||
|
||||
case DisplayOrientations::LandscapeFlipped:
|
||||
rotation = DXGI_MODE_ROTATION_ROTATE180;
|
||||
m_orientationTransform3D = XMFLOAT4X4( // 180-degree Z-rotation
|
||||
-1.0f, 0.0f, 0.0f, 0.0f,
|
||||
0.0f, -1.0f, 0.0f, 0.0f,
|
||||
0.0f, 0.0f, 1.0f, 0.0f,
|
||||
0.0f, 0.0f, 0.0f, 1.0f
|
||||
);
|
||||
break;
|
||||
|
||||
case DisplayOrientations::PortraitFlipped:
|
||||
rotation = DXGI_MODE_ROTATION_ROTATE90;
|
||||
m_orientationTransform3D = XMFLOAT4X4( // 270-degree Z-rotation
|
||||
0.0f, -1.0f, 0.0f, 0.0f,
|
||||
1.0f, 0.0f, 0.0f, 0.0f,
|
||||
0.0f, 0.0f, 1.0f, 0.0f,
|
||||
0.0f, 0.0f, 0.0f, 1.0f
|
||||
);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw ref new Platform::FailureException();
|
||||
}
|
||||
|
||||
#if !PHONE || WINVER > 0x0602
|
||||
DX::ThrowIfFailed(
|
||||
m_swapChain->SetRotation(rotation)
|
||||
);
|
||||
#endif // !PHONE
|
||||
|
||||
// Create a render target view of the swap chain back buffer.
|
||||
ComPtr<ID3D11Texture2D> backBuffer;
|
||||
DX::ThrowIfFailed(
|
||||
m_swapChain->GetBuffer(
|
||||
0,
|
||||
__uuidof(ID3D11Texture2D),
|
||||
&backBuffer
|
||||
)
|
||||
);
|
||||
|
||||
DX::ThrowIfFailed(
|
||||
m_d3dDevice->CreateRenderTargetView(
|
||||
backBuffer.Get(),
|
||||
nullptr,
|
||||
&m_renderTargetView
|
||||
)
|
||||
);
|
||||
|
||||
// Create a depth stencil view.
|
||||
CD3D11_TEXTURE2D_DESC depthStencilDesc(
|
||||
DXGI_FORMAT_D24_UNORM_S8_UINT,
|
||||
static_cast<UINT>(m_renderTargetSize.Width),
|
||||
static_cast<UINT>(m_renderTargetSize.Height),
|
||||
1,
|
||||
1,
|
||||
D3D11_BIND_DEPTH_STENCIL
|
||||
);
|
||||
|
||||
ComPtr<ID3D11Texture2D> depthStencil;
|
||||
DX::ThrowIfFailed(
|
||||
m_d3dDevice->CreateTexture2D(
|
||||
&depthStencilDesc,
|
||||
nullptr,
|
||||
&depthStencil
|
||||
)
|
||||
);
|
||||
|
||||
CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(D3D11_DSV_DIMENSION_TEXTURE2D);
|
||||
DX::ThrowIfFailed(
|
||||
m_d3dDevice->CreateDepthStencilView(
|
||||
depthStencil.Get(),
|
||||
&depthStencilViewDesc,
|
||||
&m_depthStencilView
|
||||
)
|
||||
);
|
||||
|
||||
// Set the rendering viewport to target the entire window.
|
||||
CD3D11_VIEWPORT viewport(
|
||||
0.0f,
|
||||
0.0f,
|
||||
m_renderTargetSize.Width,
|
||||
m_renderTargetSize.Height
|
||||
);
|
||||
|
||||
m_d3dContext->RSSetViewports(1, &viewport);
|
||||
}
|
||||
|
||||
// This method is called in the event handler for the SizeChanged event.
|
||||
void Direct3DBase::UpdateForWindowSizeChange()
|
||||
{
|
||||
if (m_window->Bounds.Width != m_windowBounds.Width ||
|
||||
m_window->Bounds.Height != m_windowBounds.Height ||
|
||||
#if WINVER > 0x0602
|
||||
m_orientation != DisplayInformation::GetForCurrentView()->CurrentOrientation)
|
||||
#else
|
||||
m_orientation != DisplayProperties::CurrentOrientation)
|
||||
#endif
|
||||
{
|
||||
ID3D11RenderTargetView* nullViews[] = {nullptr};
|
||||
m_d3dContext->OMSetRenderTargets(ARRAYSIZE(nullViews), nullViews, nullptr);
|
||||
m_renderTargetView = nullptr;
|
||||
m_depthStencilView = nullptr;
|
||||
m_d3dContext->Flush();
|
||||
CreateWindowSizeDependentResources();
|
||||
}
|
||||
}
|
||||
|
||||
void Direct3DBase::ReleaseResourcesForSuspending()
|
||||
{
|
||||
// Phone applications operate in a memory-constrained environment, so when entering
|
||||
// the background it is a good idea to free memory-intensive objects that will be
|
||||
// easy to restore upon reactivation. The swapchain and backbuffer are good candidates
|
||||
// here, as they consume a large amount of memory and can be reinitialized quickly.
|
||||
m_swapChain = nullptr;
|
||||
m_renderTargetView = nullptr;
|
||||
m_depthStencilView = nullptr;
|
||||
}
|
||||
|
||||
// Method to deliver the final image to the display.
|
||||
void Direct3DBase::Present()
|
||||
{
|
||||
// The first argument instructs DXGI to block until VSync, putting the application
|
||||
// to sleep until the next VSync. This ensures we don't waste any cycles rendering
|
||||
// frames that will never be displayed to the screen.
|
||||
#if PHONE && WINVER <= 0x0602
|
||||
HRESULT hr = m_swapChain->Present(1, 0);
|
||||
#else
|
||||
// The application may optionally specify "dirty" or "scroll"
|
||||
// rects to improve efficiency in certain scenarios.
|
||||
DXGI_PRESENT_PARAMETERS parameters = { 0 };
|
||||
parameters.DirtyRectsCount = 0;
|
||||
parameters.pDirtyRects = nullptr;
|
||||
parameters.pScrollRect = nullptr;
|
||||
parameters.pScrollOffset = nullptr;
|
||||
|
||||
HRESULT hr = m_swapChain->Present1(1, 0 , ¶meters);
|
||||
#endif
|
||||
|
||||
// Discard the contents of the render target.
|
||||
// This is a valid operation only when the existing contents will be entirely
|
||||
// overwritten. If dirty or scroll rects are used, this call should be removed.
|
||||
m_d3dContext->DiscardView(m_renderTargetView.Get());
|
||||
|
||||
// Discard the contents of the depth stencil.
|
||||
m_d3dContext->DiscardView(m_depthStencilView.Get());
|
||||
|
||||
// If the device was removed either by a disconnect or a driver upgrade, we
|
||||
// must recreate all device resources.
|
||||
if (hr == DXGI_ERROR_DEVICE_REMOVED)
|
||||
{
|
||||
HandleDeviceLost();
|
||||
}
|
||||
else
|
||||
{
|
||||
DX::ThrowIfFailed(hr);
|
||||
}
|
||||
}
|
||||
|
||||
// Method to convert a length in device-independent pixels (DIPs) to a length in physical pixels.
|
||||
float Direct3DBase::ConvertDipsToPixels(float dips)
|
||||
{
|
||||
static const float dipsPerInch = 96.0f;
|
||||
#if WINVER > 0x0602
|
||||
return floor(dips * DisplayInformation::GetForCurrentView()->LogicalDpi / dipsPerInch + 0.5f); // Round to nearest integer.
|
||||
#else
|
||||
return floor(dips * DisplayProperties::LogicalDpi / dipsPerInch + 0.5f); // Round to nearest integer.
|
||||
#endif
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
#pragma once
|
||||
|
||||
#include "DirectXHelper.h"
|
||||
|
||||
// Helper class that initializes DirectX APIs for 3D rendering.
|
||||
ref class Direct3DBase abstract
|
||||
{
|
||||
internal:
|
||||
Direct3DBase();
|
||||
|
||||
public:
|
||||
virtual void Initialize(Windows::UI::Core::CoreWindow^ window);
|
||||
virtual void HandleDeviceLost();
|
||||
virtual void CreateDeviceResources();
|
||||
virtual void CreateWindowSizeDependentResources();
|
||||
virtual void UpdateForWindowSizeChange();
|
||||
virtual void ReleaseResourcesForSuspending();
|
||||
virtual void Render() = 0;
|
||||
virtual void Present();
|
||||
virtual float ConvertDipsToPixels(float dips);
|
||||
|
||||
protected private:
|
||||
// Direct3D Objects.
|
||||
Microsoft::WRL::ComPtr<ID3D11Device1> m_d3dDevice;
|
||||
Microsoft::WRL::ComPtr<ID3D11DeviceContext1> m_d3dContext;
|
||||
Microsoft::WRL::ComPtr<IDXGISwapChain1> m_swapChain;
|
||||
Microsoft::WRL::ComPtr<ID3D11RenderTargetView> m_renderTargetView;
|
||||
Microsoft::WRL::ComPtr<ID3D11DepthStencilView> m_depthStencilView;
|
||||
|
||||
// Cached renderer properties.
|
||||
D3D_FEATURE_LEVEL m_featureLevel;
|
||||
Windows::Foundation::Size m_renderTargetSize;
|
||||
Windows::Foundation::Rect m_windowBounds;
|
||||
Platform::Agile<Windows::UI::Core::CoreWindow> m_window;
|
||||
Windows::Graphics::Display::DisplayOrientations m_orientation;
|
||||
|
||||
// Transform used for display orientation.
|
||||
DirectX::XMFLOAT4X4 m_orientationTransform3D;
|
||||
};
|
|
@ -0,0 +1,45 @@
|
|||
#pragma once
|
||||
|
||||
#include <wrl/client.h>
|
||||
#include <ppl.h>
|
||||
#include <ppltasks.h>
|
||||
|
||||
namespace DX
|
||||
{
|
||||
inline void ThrowIfFailed(HRESULT hr)
|
||||
{
|
||||
if (FAILED(hr))
|
||||
{
|
||||
// Set a breakpoint on this line to catch Win32 API errors.
|
||||
throw Platform::Exception::CreateException(hr);
|
||||
}
|
||||
}
|
||||
|
||||
// Function that reads from a binary file asynchronously.
|
||||
inline Concurrency::task<Platform::Array<byte>^> ReadDataAsync(Platform::String^ filename)
|
||||
{
|
||||
using namespace Windows::Storage;
|
||||
using namespace Concurrency;
|
||||
|
||||
auto folder = Windows::ApplicationModel::Package::Current->InstalledLocation;
|
||||
|
||||
return create_task(folder->GetFileAsync(filename)).then([] (StorageFile^ file)
|
||||
{
|
||||
#if !PHONE
|
||||
return FileIO::ReadBufferAsync(file);
|
||||
#else
|
||||
return file->OpenReadAsync();
|
||||
}).then([](Streams::IRandomAccessStreamWithContentType^ stream)
|
||||
{
|
||||
unsigned int bufferSize = static_cast<unsigned int>(stream->Size);
|
||||
auto fileBuffer = ref new Streams::Buffer(bufferSize);
|
||||
return stream->ReadAsync(fileBuffer, bufferSize, Streams::InputStreamOptions::None);
|
||||
#endif
|
||||
}).then([] (Streams::IBuffer^ fileBuffer) -> Platform::Array<byte>^
|
||||
{
|
||||
auto fileData = ref new Platform::Array<byte>(fileBuffer->Length);
|
||||
Streams::DataReader::FromBuffer(fileBuffer)->ReadBytes(fileData);
|
||||
return fileData;
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
struct PixelShaderInput
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
float3 color : COLOR0;
|
||||
};
|
||||
|
||||
float4 main(PixelShaderInput input) : SV_TARGET
|
||||
{
|
||||
return float4(input.color,1.0f);
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
cbuffer ModelViewProjectionConstantBuffer : register(b0)
|
||||
{
|
||||
matrix model;
|
||||
matrix view;
|
||||
matrix projection;
|
||||
};
|
||||
|
||||
struct VertexShaderInput
|
||||
{
|
||||
float3 pos : POSITION;
|
||||
float3 color : COLOR0;
|
||||
};
|
||||
|
||||
struct VertexShaderOutput
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
float3 color : COLOR0;
|
||||
};
|
||||
|
||||
VertexShaderOutput main(VertexShaderInput input)
|
||||
{
|
||||
VertexShaderOutput output;
|
||||
float4 pos = float4(input.pos, 1.0f);
|
||||
|
||||
// Transform the vertex position into projected space.
|
||||
pos = mul(pos, model);
|
||||
pos = mul(pos, view);
|
||||
pos = mul(pos, projection);
|
||||
output.pos = pos;
|
||||
|
||||
// Pass through the color without modification.
|
||||
output.color = input.color;
|
||||
|
||||
return output;
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
#include "pch.h"
|
|
@ -0,0 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <wrl/client.h>
|
||||
#include <d3d11_1.h>
|
||||
#include <DirectXMath.h>
|
||||
#include <memory>
|
||||
#include <agile.h>
|
|
@ -0,0 +1,24 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
|
||||
<Identity Name="@PACKAGE_GUID@" Publisher="CN=mgong" Version="1.0.0.0" />
|
||||
<Properties>
|
||||
<DisplayName>@SHORT_NAME@</DisplayName>
|
||||
<PublisherDisplayName>mgong</PublisherDisplayName>
|
||||
<Logo>StoreLogo.png</Logo>
|
||||
</Properties>
|
||||
<Prerequisites>
|
||||
<OSMinVersion>6.2.1</OSMinVersion>
|
||||
<OSMaxVersionTested>6.2.1</OSMaxVersionTested>
|
||||
</Prerequisites>
|
||||
<Resources>
|
||||
<Resource Language="x-generate" />
|
||||
</Resources>
|
||||
<Applications>
|
||||
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="@SHORT_NAME@.App">
|
||||
<VisualElements DisplayName="@SHORT_NAME@" Description="@SHORT_NAME@" BackgroundColor="#336699" ForegroundText="light" Logo="Logo.png" SmallLogo="SmallLogo.png">
|
||||
<DefaultTile ShowName="allLogos" ShortName="@SHORT_NAME@" />
|
||||
<SplashScreen Image="SplashScreen.png" />
|
||||
</VisualElements>
|
||||
</Application>
|
||||
</Applications>
|
||||
</Package>
|
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Deployment xmlns="http://schemas.microsoft.com/windowsphone/2012/deployment" AppPlatformVersion="8.0">
|
||||
<DefaultLanguage xmlns="" code="en-US"/>
|
||||
<App xmlns="" ProductID="{@PACKAGE_GUID@}" Title="@SHORT_NAME@" RuntimeType="Modern Native" Version="1.0.0.0" Genre="apps.normal" Author="mgong" Description="Simple Direct3D application" Publisher="@SHORT_NAME@" PublisherID="{c618991e-1d39-41c2-a881-d3310705a091}">
|
||||
<IconPath IsRelative="true" IsResource="false">ApplicationIcon.png</IconPath>
|
||||
<Capabilities>
|
||||
<Capability Name="ID_CAP_NETWORKING" />
|
||||
<Capability Name="ID_CAP_MEDIALIB_AUDIO" />
|
||||
<Capability Name="ID_CAP_MEDIALIB_PLAYBACK" />
|
||||
</Capabilities>
|
||||
<Tasks>
|
||||
<DefaultTask Name="_default" ImagePath="@SHORT_NAME@.exe" ImageParams="" />
|
||||
</Tasks>
|
||||
<Tokens>
|
||||
<PrimaryToken TokenID="@SHORT_NAME@Token" TaskName="_default">
|
||||
<TemplateFlip>
|
||||
<SmallImageURI IsRelative="true" IsResource="false">FlipCycleTileSmall.png</SmallImageURI>
|
||||
<Count>0</Count>
|
||||
<BackgroundImageURI IsRelative="true" IsResource="false">FlipCycleTileMedium.png</BackgroundImageURI>
|
||||
<Title>@SHORT_NAME@</Title>
|
||||
<BackContent></BackContent>
|
||||
<BackBackgroundImageURI></BackBackgroundImageURI>
|
||||
<BackTitle></BackTitle>
|
||||
<DeviceLockImageURI></DeviceLockImageURI>
|
||||
<HasLarge></HasLarge>
|
||||
</TemplateFlip>
|
||||
</PrimaryToken>
|
||||
</Tokens>
|
||||
<ScreenResolutions>
|
||||
<ScreenResolution Name="ID_RESOLUTION_WVGA" />
|
||||
<ScreenResolution Name="ID_RESOLUTION_WXGA" />
|
||||
<ScreenResolution Name="ID_RESOLUTION_HD720P" />
|
||||
</ScreenResolutions>
|
||||
</App>
|
||||
</Deployment>
|
|
@ -0,0 +1,34 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:m2="http://schemas.microsoft.com/appx/2013/manifest">
|
||||
<Identity Name="@PACKAGE_GUID@" Publisher="CN=mgong" Version="1.1.0.0" />
|
||||
<Properties>
|
||||
<DisplayName>@SHORT_NAME@</DisplayName>
|
||||
<PublisherDisplayName>mgong</PublisherDisplayName>
|
||||
<Logo>StoreLogo.png</Logo>
|
||||
</Properties>
|
||||
<Prerequisites>
|
||||
<OSMinVersion>6.3</OSMinVersion>
|
||||
<OSMaxVersionTested>6.3</OSMaxVersionTested>
|
||||
</Prerequisites>
|
||||
<Resources>
|
||||
<Resource Language="x-generate" />
|
||||
</Resources>
|
||||
<Applications>
|
||||
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="@SHORT_NAME@.App">
|
||||
<m2:VisualElements
|
||||
DisplayName="@SHORT_NAME@"
|
||||
Description="@SHORT_NAME@"
|
||||
BackgroundColor="#336699"
|
||||
ForegroundText="light"
|
||||
Square150x150Logo="Logo.png"
|
||||
Square30x30Logo="SmallLogo.png">
|
||||
<m2:DefaultTile ShortName="@SHORT_NAME@">
|
||||
<m2:ShowNameOnTiles>
|
||||
<m2:ShowOn Tile="square150x150Logo" />
|
||||
</m2:ShowNameOnTiles>
|
||||
</m2:DefaultTile>
|
||||
<m2:SplashScreen Image="SplashScreen.png" />
|
||||
</m2:VisualElements>
|
||||
</Application>
|
||||
</Applications>
|
||||
</Package>
|
|
@ -0,0 +1,36 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:m2="http://schemas.microsoft.com/appx/2013/manifest" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest">
|
||||
<Identity Name="@PACKAGE_GUID@" Publisher="CN=mgong" Version="1.1.0.0" />
|
||||
<mp:PhoneIdentity PhoneProductId="@PACKAGE_GUID@" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
|
||||
|
||||
<Properties>
|
||||
<DisplayName>@SHORT_NAME@</DisplayName>
|
||||
<PublisherDisplayName>mgong</PublisherDisplayName>
|
||||
<Logo>StoreLogo.png</Logo>
|
||||
</Properties>
|
||||
<Prerequisites>
|
||||
<OSMinVersion>6.3.1</OSMinVersion>
|
||||
<OSMaxVersionTested>6.3.1</OSMaxVersionTested>
|
||||
</Prerequisites>
|
||||
<Resources>
|
||||
<Resource Language="x-generate" />
|
||||
</Resources>
|
||||
<Applications>
|
||||
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="@SHORT_NAME@.App">
|
||||
<m2:VisualElements
|
||||
DisplayName="@SHORT_NAME@"
|
||||
Description="@SHORT_NAME@"
|
||||
BackgroundColor="#336699"
|
||||
ForegroundText="light"
|
||||
Square150x150Logo="Logo.png"
|
||||
Square30x30Logo="SmallLogo.png">
|
||||
<m2:DefaultTile ShortName="@SHORT_NAME@">
|
||||
<m2:ShowNameOnTiles>
|
||||
<m2:ShowOn Tile="square150x150Logo" />
|
||||
</m2:ShowNameOnTiles>
|
||||
</m2:DefaultTile>
|
||||
<m2:SplashScreen Image="SplashScreen.png" />
|
||||
</m2:VisualElements>
|
||||
</Application>
|
||||
</Applications>
|
||||
</Package>
|