mirror of
https://github.com/lubosz/overte.git
synced 2025-04-15 19:47:38 +02:00
Merge branch 'master' of github.com:highfidelity/hifi into nut
This commit is contained in:
commit
12cc69e41c
66 changed files with 832 additions and 355 deletions
|
@ -66,6 +66,9 @@ macro(AUTOSCRIBE_PLATFORM_SHADER)
|
|||
list(APPEND SHADER_GEN_LINE ${TEMP_PATH})
|
||||
file(RELATIVE_PATH TEMP_PATH ${CMAKE_SOURCE_DIR} ${AUTOSCRIBE_OUTPUT_FILE})
|
||||
list(APPEND SHADER_GEN_LINE ${TEMP_PATH})
|
||||
if (NOT("${DEFINES}" STREQUAL ""))
|
||||
list(APPEND SHADER_GEN_LINE "defines:${DEFINES}")
|
||||
endif()
|
||||
list(APPEND SHADER_GEN_LINE ${AUTOSCRIBE_SHADER_SEEN_LIBS})
|
||||
string(CONCAT AUTOSCRIBE_SHADERGEN_COMMANDS "${AUTOSCRIBE_SHADERGEN_COMMANDS}" "${SHADER_GEN_LINE}\n")
|
||||
endmacro()
|
||||
|
@ -108,6 +111,10 @@ macro(AUTOSCRIBE_SHADER)
|
|||
set(SHADER_TYPE geom)
|
||||
endif()
|
||||
|
||||
if (NOT("${DEFINES}" STREQUAL ""))
|
||||
string(CONCAT SHADER_NAME "${SHADER_NAME}" "_${DEFINES}")
|
||||
endif()
|
||||
|
||||
set(SCRIBE_ARGS -D GLPROFILE ${GLPROFILE} -T ${SHADER_TYPE} ${SCRIBE_INCLUDES} )
|
||||
|
||||
# SHADER_SCRIBED -> the output of scribe
|
||||
|
@ -135,11 +142,78 @@ macro(AUTOSCRIBE_SHADER)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "${SHADER_NAME} = ${SHADER_COUNT},\n")
|
||||
string(CONCAT SHADER_LIST "${SHADER_LIST}" "${SHADER_NAME} = ${SHADER_COUNT},\n")
|
||||
string(CONCAT SHADER_SHADERS_ARRAY "${SHADER_SHADERS_ARRAY}" "${SHADER_COUNT},\n")
|
||||
MATH(EXPR SHADER_COUNT "${SHADER_COUNT}+1")
|
||||
endmacro()
|
||||
|
||||
# This function takes in the list of defines, which would look like:
|
||||
# (normalmap;translucent:f)/shadow;deformed:v
|
||||
# and handles parentheses and slashes, producing the semicolon-separated final list of all combinations, which in that case will look like:
|
||||
# normalmap;translucent:f;normalmap_translucent:f;shadow;normalmap_deformed:v;translucent:f_deformed:v;normalmap_translucent:f_deformed:v;shadow_deformed:v
|
||||
function(GENERATE_DEFINES_LIST_HELPER INPUT_LIST RETURN_LIST)
|
||||
# This while loop handles parentheses, looking for matching ( and ) and then calling GENERATE_DEFINES_LIST_HELPER recursively on the text in between
|
||||
string(LENGTH "${INPUT_LIST}" STR_LENGTH)
|
||||
set(OPEN_INDEX -1)
|
||||
set(STR_INDEX 0)
|
||||
set(NESTED_DEPTH 0)
|
||||
while ("${STR_INDEX}" LESS "${STR_LENGTH}")
|
||||
string(SUBSTRING "${INPUT_LIST}" ${STR_INDEX} 1 CURRENT_CHAR)
|
||||
|
||||
if (("${CURRENT_CHAR}" STREQUAL "(") AND (OPEN_INDEX EQUAL -1))
|
||||
set(OPEN_INDEX ${STR_INDEX})
|
||||
MATH(EXPR STR_INDEX "${STR_INDEX}+1")
|
||||
continue()
|
||||
elseif (("${CURRENT_CHAR}" STREQUAL "(") AND NOT(OPEN_INDEX EQUAL -1))
|
||||
MATH(EXPR NESTED_DEPTH "${NESTED_DEPTH}+1")
|
||||
MATH(EXPR STR_INDEX "${STR_INDEX}+1")
|
||||
continue()
|
||||
elseif (("${CURRENT_CHAR}" STREQUAL ")") AND NOT(OPEN_INDEX EQUAL -1) AND (NESTED_DEPTH GREATER 0))
|
||||
MATH(EXPR NESTED_DEPTH "${NESTED_DEPTH}-1")
|
||||
MATH(EXPR STR_INDEX "${STR_INDEX}+1")
|
||||
continue()
|
||||
elseif (("${CURRENT_CHAR}" STREQUAL ")") AND NOT(OPEN_INDEX EQUAL -1) AND (NESTED_DEPTH EQUAL 0))
|
||||
MATH(EXPR OPEN_INDEX "${OPEN_INDEX}+1")
|
||||
MATH(EXPR SUBSTR_LENGTH "${STR_INDEX}-${OPEN_INDEX}")
|
||||
string(SUBSTRING "${INPUT_LIST}" ${OPEN_INDEX} ${SUBSTR_LENGTH} GROUP_STR)
|
||||
GENERATE_DEFINES_LIST_HELPER("${GROUP_STR}" EXPANDED_GROUP_LIST)
|
||||
string(REPLACE ";" "/" EXPANDED_GROUP_LIST "${EXPANDED_GROUP_LIST}")
|
||||
string(REPLACE "(${GROUP_STR})" "${EXPANDED_GROUP_LIST}" INPUT_LIST "${INPUT_LIST}")
|
||||
MATH(EXPR STR_INDEX "${OPEN_INDEX}-1")
|
||||
set(OPEN_INDEX -1)
|
||||
string(LENGTH "${INPUT_LIST}" STR_LENGTH)
|
||||
continue()
|
||||
endif()
|
||||
|
||||
MATH(EXPR STR_INDEX "${STR_INDEX}+1")
|
||||
endwhile()
|
||||
|
||||
# Here we handle the base case, the recursive case, and slashes
|
||||
list(LENGTH INPUT_LIST NUM_DEFINES)
|
||||
if (NUM_DEFINES EQUAL 1)
|
||||
string(REPLACE "/" ";" INPUT_LIST "${INPUT_LIST}")
|
||||
set(${RETURN_LIST} ${INPUT_LIST} PARENT_SCOPE)
|
||||
elseif (NUM_DEFINES GREATER 1)
|
||||
list(GET INPUT_LIST 0 CURRENT_DEFINES)
|
||||
string(REPLACE "/" ";" CURRENT_DEFINES "${CURRENT_DEFINES}")
|
||||
list(REMOVE_AT INPUT_LIST 0)
|
||||
GENERATE_DEFINES_LIST_HELPER("${INPUT_LIST}" REMAINING_DEFINES_LIST)
|
||||
set(TO_RETURN_LIST "${CURRENT_DEFINES}")
|
||||
foreach(REMAINING_DEFINES ${REMAINING_DEFINES_LIST})
|
||||
list(APPEND TO_RETURN_LIST "${REMAINING_DEFINES}")
|
||||
foreach(CURRENT_DEFINE ${CURRENT_DEFINES})
|
||||
list(APPEND TO_RETURN_LIST "${CURRENT_DEFINE}_${REMAINING_DEFINES}")
|
||||
endforeach()
|
||||
endforeach()
|
||||
set(${RETURN_LIST} ${TO_RETURN_LIST} PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
macro(GENERATE_DEFINES_LIST)
|
||||
set(DEFINES_LIST "")
|
||||
GENERATE_DEFINES_LIST_HELPER("${ARGV0}" DEFINES_LIST)
|
||||
endmacro()
|
||||
|
||||
macro(AUTOSCRIBE_SHADER_LIB)
|
||||
if (NOT ("${TARGET_NAME}" STREQUAL "shaders"))
|
||||
message(FATAL_ERROR "AUTOSCRIBE_SHADER_LIB can only be used by the shaders library")
|
||||
|
@ -164,24 +238,24 @@ macro(AUTOSCRIBE_SHADER_LIB)
|
|||
if (SHADER_VERTEX_FILES)
|
||||
source_group("${SHADER_LIB}/Vertex" FILES ${SHADER_VERTEX_FILES})
|
||||
list(APPEND ALL_SCRIBE_SHADERS ${SHADER_VERTEX_FILES})
|
||||
string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "namespace vertex { enum {\n")
|
||||
foreach(SHADER_FILE ${SHADER_VERTEX_FILES})
|
||||
set(SHADER_LIST "namespace vertex { enum {\n")
|
||||
foreach(SHADER_FILE ${SHADER_VERTEX_FILES})
|
||||
AUTOSCRIBE_SHADER(${ALL_SHADER_HEADERS})
|
||||
endforeach()
|
||||
string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "}; } // vertex \n")
|
||||
set(VERTEX_ENUMS "${SHADER_LIST}")
|
||||
endif()
|
||||
|
||||
file(GLOB_RECURSE SHADER_FRAGMENT_FILES ${SRC_FOLDER}/*.slf)
|
||||
if (SHADER_FRAGMENT_FILES)
|
||||
source_group("${SHADER_LIB}/Fragment" FILES ${SHADER_FRAGMENT_FILES})
|
||||
list(APPEND ALL_SCRIBE_SHADERS ${SHADER_FRAGMENT_FILES})
|
||||
string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "namespace fragment { enum {\n")
|
||||
foreach(SHADER_FILE ${SHADER_FRAGMENT_FILES})
|
||||
set(SHADER_LIST "namespace fragment { enum {\n")
|
||||
foreach(SHADER_FILE ${SHADER_FRAGMENT_FILES})
|
||||
AUTOSCRIBE_SHADER(${ALL_SHADER_HEADERS})
|
||||
endforeach()
|
||||
string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "}; } // fragment \n")
|
||||
set(FRAGMENT_ENUMS "${SHADER_LIST}")
|
||||
endif()
|
||||
|
||||
|
||||
# FIXME add support for geometry, compute and tesselation shaders
|
||||
#file(GLOB_RECURSE SHADER_GEOMETRY_FILES ${SRC_FOLDER}/*.slg)
|
||||
#file(GLOB_RECURSE SHADER_COMPUTE_FILES ${SRC_FOLDER}/*.slc)
|
||||
|
@ -191,13 +265,13 @@ macro(AUTOSCRIBE_SHADER_LIB)
|
|||
if (SHADER_PROGRAM_FILES)
|
||||
source_group("${SHADER_LIB}/Program" FILES ${SHADER_PROGRAM_FILES})
|
||||
list(APPEND ALL_SCRIBE_SHADERS ${SHADER_PROGRAM_FILES})
|
||||
string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "namespace program { enum {\n")
|
||||
set(PROGRAM_ENUMS "namespace program { enum {\n")
|
||||
foreach(PROGRAM_FILE ${SHADER_PROGRAM_FILES})
|
||||
get_filename_component(PROGRAM_NAME ${PROGRAM_FILE} NAME_WE)
|
||||
set(AUTOSCRIBE_PROGRAM_FRAGMENT ${PROGRAM_NAME})
|
||||
file(READ ${PROGRAM_FILE} PROGRAM_CONFIG)
|
||||
set(AUTOSCRIBE_PROGRAM_VERTEX ${PROGRAM_NAME})
|
||||
set(AUTOSCRIBE_PROGRAM_FRAGMENT ${PROGRAM_NAME})
|
||||
set(AUTOSCRIBE_PROGRAM_DEFINES "")
|
||||
|
||||
if (NOT("${PROGRAM_CONFIG}" STREQUAL ""))
|
||||
string(REGEX MATCH ".*VERTEX +([_\\:A-Z0-9a-z]+)" MVERT ${PROGRAM_CONFIG})
|
||||
|
@ -208,6 +282,12 @@ macro(AUTOSCRIBE_SHADER_LIB)
|
|||
if (CMAKE_MATCH_1)
|
||||
set(AUTOSCRIBE_PROGRAM_FRAGMENT ${CMAKE_MATCH_1})
|
||||
endif()
|
||||
string(REGEX MATCH ".*DEFINES +([a-zA-Z\(\)/: ]+)" MDEF ${PROGRAM_CONFIG})
|
||||
if (CMAKE_MATCH_1)
|
||||
set(AUTOSCRIBE_PROGRAM_DEFINES ${CMAKE_MATCH_1})
|
||||
string(TOLOWER AUTOSCRIBE_PROGRAM_DEFINES "${AUTOSCRIBE_PROGRAM_DEFINES}")
|
||||
string(REGEX REPLACE " +" ";" AUTOSCRIBE_PROGRAM_DEFINES "${AUTOSCRIBE_PROGRAM_DEFINES}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (NOT (${AUTOSCRIBE_PROGRAM_VERTEX} MATCHES ".*::.*"))
|
||||
|
@ -216,12 +296,75 @@ macro(AUTOSCRIBE_SHADER_LIB)
|
|||
if (NOT (${AUTOSCRIBE_PROGRAM_FRAGMENT} MATCHES ".*::.*"))
|
||||
set(AUTOSCRIBE_PROGRAM_FRAGMENT "fragment::${AUTOSCRIBE_PROGRAM_FRAGMENT}")
|
||||
endif()
|
||||
string(REGEX REPLACE ".*::" "" VERTEX_NAME "${AUTOSCRIBE_PROGRAM_VERTEX}")
|
||||
string(REGEX REPLACE ".*::" "" FRAGMENT_NAME "${AUTOSCRIBE_PROGRAM_FRAGMENT}")
|
||||
|
||||
set(PROGRAM_ENTRY "${PROGRAM_NAME} = (${AUTOSCRIBE_PROGRAM_VERTEX} << 16) | ${AUTOSCRIBE_PROGRAM_FRAGMENT},\n")
|
||||
string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "${PROGRAM_ENTRY}")
|
||||
GENERATE_DEFINES_LIST("${AUTOSCRIBE_PROGRAM_DEFINES}")
|
||||
|
||||
string(CONCAT PROGRAM_ENUMS "${PROGRAM_ENUMS}" "${PROGRAM_NAME} = (${AUTOSCRIBE_PROGRAM_VERTEX} << 16) | ${AUTOSCRIBE_PROGRAM_FRAGMENT},\n")
|
||||
string(CONCAT SHADER_PROGRAMS_ARRAY "${SHADER_PROGRAMS_ARRAY} ${SHADER_NAMESPACE}::program::${PROGRAM_NAME},\n")
|
||||
|
||||
foreach(DEFINES ${DEFINES_LIST})
|
||||
set(ORIG_DEFINES "${DEFINES}")
|
||||
|
||||
# Below here we handle :v and :f. The program name includes both, but the vertex and fragment names
|
||||
# remove the elements with :f and :v respectively, and only have to call AUTOSCRIBE_SHADER if they don't have those
|
||||
# (because the shaders without them will have already been generated)
|
||||
string(REPLACE ":v" "" VERTEX_DEFINES "${ORIG_DEFINES}")
|
||||
string(FIND "${ORIG_DEFINES}" ":f" HAS_FRAGMENT)
|
||||
if (HAS_FRAGMENT EQUAL -1)
|
||||
set(DEFINES "${VERTEX_DEFINES}")
|
||||
set(SHADER_LIST "")
|
||||
set(SHADER_FILE "${SRC_FOLDER}/${VERTEX_NAME}.slv")
|
||||
AUTOSCRIBE_SHADER(${ALL_SHADER_HEADERS})
|
||||
string(CONCAT VERTEX_ENUMS "${VERTEX_ENUMS}" "${SHADER_LIST}")
|
||||
else()
|
||||
string(REGEX REPLACE "_*[^_]*:f" "" VERTEX_DEFINES "${VERTEX_DEFINES}")
|
||||
endif()
|
||||
|
||||
if (NOT("${VERTEX_DEFINES}" STREQUAL "") AND NOT("${VERTEX_DEFINES}" MATCHES "^_.*"))
|
||||
set(VERTEX_DEFINES "_${VERTEX_DEFINES}")
|
||||
endif()
|
||||
|
||||
string(REPLACE ":f" "" FRAGMENT_DEFINES "${ORIG_DEFINES}")
|
||||
string(FIND "${ORIG_DEFINES}" ":v" HAS_VERTEX)
|
||||
if (HAS_VERTEX EQUAL -1)
|
||||
set(DEFINES "${FRAGMENT_DEFINES}")
|
||||
set(SHADER_LIST "")
|
||||
set(SHADER_FILE "${SRC_FOLDER}/${FRAGMENT_NAME}.slf")
|
||||
AUTOSCRIBE_SHADER(${ALL_SHADER_HEADERS})
|
||||
string(CONCAT FRAGMENT_ENUMS "${FRAGMENT_ENUMS}" "${SHADER_LIST}")
|
||||
else()
|
||||
string(REGEX REPLACE "_*[^_]*:v" "" FRAGMENT_DEFINES "${FRAGMENT_DEFINES}")
|
||||
endif()
|
||||
|
||||
if (NOT("${FRAGMENT_DEFINES}" STREQUAL "") AND NOT("${FRAGMENT_DEFINES}" MATCHES "^_.*"))
|
||||
set(FRAGMENT_DEFINES "_${FRAGMENT_DEFINES}")
|
||||
endif()
|
||||
|
||||
string(REGEX REPLACE ":(f|v)" "" PROGRAM_DEFINES "${ORIG_DEFINES}")
|
||||
|
||||
if (NOT("${PROGRAM_DEFINES}" STREQUAL ""))
|
||||
string(CONCAT PROGRAM_ENUMS "${PROGRAM_ENUMS}" "${PROGRAM_NAME}_${PROGRAM_DEFINES} = (${AUTOSCRIBE_PROGRAM_VERTEX}${VERTEX_DEFINES} << 16) | ${AUTOSCRIBE_PROGRAM_FRAGMENT}${FRAGMENT_DEFINES},\n")
|
||||
string(CONCAT SHADER_PROGRAMS_ARRAY "${SHADER_PROGRAMS_ARRAY} ${SHADER_NAMESPACE}::program::${PROGRAM_NAME}_${PROGRAM_DEFINES},\n")
|
||||
endif()
|
||||
endforeach()
|
||||
endforeach()
|
||||
string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "}; } // program \n")
|
||||
endif()
|
||||
|
||||
if (SHADER_VERTEX_FILES)
|
||||
string(CONCAT VERTEX_ENUMS "${VERTEX_ENUMS}" "}; } // vertex \n")
|
||||
string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "${VERTEX_ENUMS}")
|
||||
endif()
|
||||
|
||||
if (SHADER_FRAGMENT_FILES)
|
||||
string(CONCAT FRAGMENT_ENUMS "${FRAGMENT_ENUMS}" "}; } // fragment \n")
|
||||
string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "${FRAGMENT_ENUMS}")
|
||||
endif()
|
||||
|
||||
if (SHADER_PROGRAM_FILES)
|
||||
string(CONCAT PROGRAM_ENUMS "${PROGRAM_ENUMS}" "}; } // program \n")
|
||||
string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "${PROGRAM_ENUMS}")
|
||||
endif()
|
||||
|
||||
# Finish the shader enums
|
||||
|
|
|
@ -47,8 +47,8 @@ Flickable {
|
|||
source: "images/logo.png"
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.topMargin: 16
|
||||
Layout.preferredWidth: 200
|
||||
Layout.preferredHeight: 150
|
||||
Layout.preferredWidth: 160
|
||||
Layout.preferredHeight: 120
|
||||
fillMode: Image.PreserveAspectFit
|
||||
mipmap: true
|
||||
}
|
||||
|
@ -195,6 +195,73 @@ Flickable {
|
|||
wrapMode: Text.Wrap
|
||||
}
|
||||
|
||||
// This is a bit of a hack to get the name of the currently-selected audio input device
|
||||
// in the current mode (Desktop or VR). The reason this is necessary is because it seems to me like
|
||||
// the only way one can get a human-readable list of the audio I/O devices is by using a ListView
|
||||
// and grabbing the names from the AudioScriptingInterface; you can't do it using a ListModel.
|
||||
// See `AudioDevices.h`, specifically the comment above the declaration of `QVariant data()`.
|
||||
ListView {
|
||||
id: audioInputDevices
|
||||
visible: false
|
||||
property string selectedInputDeviceName
|
||||
Layout.preferredWidth: parent.width
|
||||
Layout.preferredHeight: contentItem.height
|
||||
interactive: false
|
||||
model: AudioScriptingInterface.devices.input
|
||||
delegate: Item {
|
||||
Component.onCompleted: {
|
||||
if (HMD.active && selectedHMD) {
|
||||
audioInputDevices.selectedInputDeviceName = model.devicename
|
||||
} else if (!HMD.active && selectedDesktop) {
|
||||
audioInputDevices.selectedInputDeviceName = model.devicename
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HifiStylesUit.GraphikRegular {
|
||||
text: "<b>Audio Input:</b> " + audioInputDevices.selectedInputDeviceName
|
||||
Layout.maximumWidth: parent.width
|
||||
height: paintedHeight
|
||||
size: 16
|
||||
color: simplifiedUI.colors.text.white
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
|
||||
|
||||
// This is a bit of a hack to get the name of the currently-selected audio output device
|
||||
// in the current mode (Desktop or VR). The reason this is necessary is because it seems to me like
|
||||
// the only way one can get a human-readable list of the audio I/O devices is by using a ListView
|
||||
// and grabbing the names from the AudioScriptingInterface; you can't do it using a ListModel.
|
||||
// See `AudioDevices.h`, specifically the comment above the declaration of `QVariant data()`.
|
||||
ListView {
|
||||
id: audioOutputDevices
|
||||
visible: false
|
||||
property string selectedOutputDeviceName
|
||||
Layout.preferredWidth: parent.width
|
||||
Layout.preferredHeight: contentItem.height
|
||||
interactive: false
|
||||
model: AudioScriptingInterface.devices.output
|
||||
delegate: Item {
|
||||
Component.onCompleted: {
|
||||
if (HMD.active && selectedHMD) {
|
||||
audioOutputDevices.selectedOutputDeviceName = model.devicename
|
||||
} else if (!HMD.active && selectedDesktop) {
|
||||
audioOutputDevices.selectedOutputDeviceName = model.devicename
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HifiStylesUit.GraphikRegular {
|
||||
text: "<b>Audio Output:</b> " + audioOutputDevices.selectedOutputDeviceName
|
||||
Layout.maximumWidth: parent.width
|
||||
height: paintedHeight
|
||||
size: 16
|
||||
color: simplifiedUI.colors.text.white
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
|
||||
SimplifiedControls.Button {
|
||||
Layout.topMargin: 8
|
||||
width: 200
|
||||
|
@ -248,6 +315,8 @@ Flickable {
|
|||
|
||||
textToCopy += "GPU: " + gpuModel + "\n";
|
||||
textToCopy += "VR Hand Controllers: " + (PlatformInfo.hasRiftControllers() ? "Rift" : (PlatformInfo.hasViveControllers() ? "Vive" : "None")) + "\n";
|
||||
textToCopy += "Audio Input: " + audioInputDevices.selectedInputDeviceName + "\n";
|
||||
textToCopy += "Audio Output: " + audioOutputDevices.selectedOutputDeviceName + "\n";
|
||||
|
||||
textToCopy += "\n**All Platform Info**\n";
|
||||
textToCopy += JSON.stringify(JSON.parse(PlatformInfo.getPlatform()), null, 4);
|
||||
|
|
|
@ -1345,9 +1345,22 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
|
|||
connect(this, &QCoreApplication::aboutToQuit, addressManager.data(), &AddressManager::storeCurrentAddress);
|
||||
|
||||
connect(this, &Application::activeDisplayPluginChanged, this, &Application::updateThreadPoolCount);
|
||||
connect(this, &Application::activeDisplayPluginChanged, this, [](){
|
||||
connect(this, &Application::activeDisplayPluginChanged, this, [=](){
|
||||
qApp->setProperty(hifi::properties::HMD, qApp->isHMDMode());
|
||||
auto displayPlugin = qApp->getActiveDisplayPlugin();
|
||||
|
||||
if (displayPlugin->isHmd()) {
|
||||
if (_preferredCursor.get() == Cursor::Manager::getIconName(Cursor::Icon::RETICLE)) {
|
||||
setPreferredCursor(Cursor::Manager::getIconName(Cursor::Icon::RETICLE));
|
||||
}
|
||||
else {
|
||||
setPreferredCursor(Cursor::Manager::getIconName(Cursor::Icon::ARROW));
|
||||
}
|
||||
}
|
||||
else {
|
||||
setPreferredCursor(Cursor::Manager::getIconName(Cursor::Icon::SYSTEM));
|
||||
}
|
||||
|
||||
setCrashAnnotation("display_plugin", displayPlugin->getName().toStdString());
|
||||
setCrashAnnotation("hmd", displayPlugin->isHmd() ? "1" : "0");
|
||||
});
|
||||
|
|
|
@ -108,8 +108,8 @@ void WorldBoxRenderData::renderWorldBox(RenderArgs* args, gpu::Batch& batch) {
|
|||
glm::vec3(HALF_TREE_SCALE, 0.0f, HALF_TREE_SCALE), GREY,
|
||||
geometryIds[17]);
|
||||
|
||||
|
||||
geometryCache->renderWireCubeInstance(args, batch, GREY4);
|
||||
auto pipeline = geometryCache->getShapePipelinePointer(false, false, args->_renderMethod == render::Args::RenderMethod::FORWARD);
|
||||
geometryCache->renderWireCubeInstance(args, batch, GREY4, pipeline);
|
||||
|
||||
// Draw meter markers along the 3 axis to help with measuring things
|
||||
const float MARKER_DISTANCE = 1.0f;
|
||||
|
@ -117,22 +117,22 @@ void WorldBoxRenderData::renderWorldBox(RenderArgs* args, gpu::Batch& batch) {
|
|||
|
||||
transform = Transform().setScale(MARKER_RADIUS);
|
||||
batch.setModelTransform(transform);
|
||||
geometryCache->renderSolidSphereInstance(args, batch, RED);
|
||||
geometryCache->renderSolidSphereInstance(args, batch, RED, pipeline);
|
||||
|
||||
transform = Transform().setTranslation(glm::vec3(MARKER_DISTANCE, 0.0f, 0.0f)).setScale(MARKER_RADIUS);
|
||||
batch.setModelTransform(transform);
|
||||
geometryCache->renderSolidSphereInstance(args, batch, RED);
|
||||
geometryCache->renderSolidSphereInstance(args, batch, RED, pipeline);
|
||||
|
||||
transform = Transform().setTranslation(glm::vec3(0.0f, MARKER_DISTANCE, 0.0f)).setScale(MARKER_RADIUS);
|
||||
batch.setModelTransform(transform);
|
||||
geometryCache->renderSolidSphereInstance(args, batch, GREEN);
|
||||
geometryCache->renderSolidSphereInstance(args, batch, GREEN, pipeline);
|
||||
|
||||
transform = Transform().setTranslation(glm::vec3(0.0f, 0.0f, MARKER_DISTANCE)).setScale(MARKER_RADIUS);
|
||||
batch.setModelTransform(transform);
|
||||
geometryCache->renderSolidSphereInstance(args, batch, BLUE);
|
||||
geometryCache->renderSolidSphereInstance(args, batch, BLUE, pipeline);
|
||||
|
||||
transform = Transform().setTranslation(glm::vec3(MARKER_DISTANCE, 0.0f, MARKER_DISTANCE)).setScale(MARKER_RADIUS);
|
||||
batch.setModelTransform(transform);
|
||||
geometryCache->renderSolidSphereInstance(args, batch, GREY);
|
||||
geometryCache->renderSolidSphereInstance(args, batch, GREY, pipeline);
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,11 @@
|
|||
|
||||
const int SafeLanding::SEQUENCE_MODULO = std::numeric_limits<OCTREE_PACKET_SEQUENCE>::max() + 1;
|
||||
|
||||
CalculateEntityLoadingPriority SafeLanding::entityLoadingOperatorElevateCollidables = [](const EntityItem& entityItem) {
|
||||
const int COLLIDABLE_ENTITY_PRIORITY = 10.0f;
|
||||
return entityItem.getCollisionless() * COLLIDABLE_ENTITY_PRIORITY;
|
||||
};
|
||||
|
||||
namespace {
|
||||
template<typename T> bool lessThanWraparound(int a, int b) {
|
||||
constexpr int MAX_T_VALUE = std::numeric_limits<T>::max();
|
||||
|
@ -52,7 +57,8 @@ void SafeLanding::startTracking(QSharedPointer<EntityTreeRenderer> entityTreeRen
|
|||
connect(std::const_pointer_cast<EntityTree>(entityTree).get(),
|
||||
&EntityTree::deletingEntity, this, &SafeLanding::deleteTrackedEntity);
|
||||
|
||||
EntityTreeRenderer::setEntityLoadingPriorityFunction(&ElevatedPriority);
|
||||
_prevEntityLoadingPriorityOperator = EntityTreeRenderer::getEntityLoadingPriorityOperator();
|
||||
EntityTreeRenderer::setEntityLoadingPriorityFunction(entityLoadingOperatorElevateCollidables);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -162,7 +168,7 @@ void SafeLanding::stopTracking() {
|
|||
&EntityTree::deletingEntity, this, &SafeLanding::deleteTrackedEntity);
|
||||
_entityTreeRenderer.reset();
|
||||
}
|
||||
EntityTreeRenderer::setEntityLoadingPriorityFunction(StandardPriority);
|
||||
EntityTreeRenderer::setEntityLoadingPriorityFunction(_prevEntityLoadingPriorityOperator);
|
||||
}
|
||||
|
||||
bool SafeLanding::trackingIsComplete() const {
|
||||
|
@ -205,10 +211,6 @@ bool SafeLanding::isEntityPhysicsReady(const EntityItemPointer& entity) {
|
|||
return true;
|
||||
}
|
||||
|
||||
float SafeLanding::ElevatedPriority(const EntityItem& entityItem) {
|
||||
return entityItem.getCollisionless() ? 0.0f : 10.0f;
|
||||
}
|
||||
|
||||
void SafeLanding::debugDumpSequenceIDs() const {
|
||||
int p = -1;
|
||||
qCDebug(interfaceapp) << "Sequence set size:" << _sequenceNumbers.size();
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
#include "EntityItem.h"
|
||||
#include "EntityDynamicInterface.h"
|
||||
|
||||
#include "EntityTreeRenderer.h"
|
||||
|
||||
class EntityTreeRenderer;
|
||||
class EntityItemID;
|
||||
|
||||
|
@ -64,8 +66,8 @@ private:
|
|||
|
||||
std::set<int, SequenceLessThan> _sequenceNumbers;
|
||||
|
||||
static float ElevatedPriority(const EntityItem& entityItem);
|
||||
static float StandardPriority(const EntityItem&) { return 0.0f; }
|
||||
static CalculateEntityLoadingPriority entityLoadingOperatorElevateCollidables;
|
||||
CalculateEntityLoadingPriority _prevEntityLoadingPriorityOperator { nullptr };
|
||||
|
||||
static const int SEQUENCE_MODULO;
|
||||
};
|
||||
|
|
|
@ -143,10 +143,6 @@ void Snapshot::save360Snapshot(const glm::vec3& cameraPosition,
|
|||
secondaryCameraRenderConfig->enableSecondaryCameraRenderConfigs(true);
|
||||
}
|
||||
|
||||
// Initialize some secondary camera render config options for 360 snapshot capture
|
||||
static_cast<ToneMappingConfig*>(qApp->getRenderEngine()->getConfiguration()->getConfig("SecondaryCameraJob.ToneMapping"))
|
||||
->setCurve(0);
|
||||
|
||||
secondaryCameraRenderConfig->resetSizeSpectatorCamera(static_cast<int>(CUBEMAP_SIDE_PIXEL_DIMENSION),
|
||||
static_cast<int>(CUBEMAP_SIDE_PIXEL_DIMENSION));
|
||||
secondaryCameraRenderConfig->setProperty("attachedEntityId", "");
|
||||
|
@ -209,7 +205,6 @@ void Snapshot::takeNextSnapshot() {
|
|||
|
||||
// Reset secondary camera render config
|
||||
SecondaryCameraJobConfig* config = static_cast<SecondaryCameraJobConfig*>(qApp->getRenderEngine()->getConfiguration()->getConfig("SecondaryCamera"));
|
||||
static_cast<ToneMappingConfig*>(qApp->getRenderEngine()->getConfiguration()->getConfig("SecondaryCameraJob.ToneMapping"))->setCurve(1);
|
||||
config->resetSizeSpectatorCamera(qApp->getWindow()->geometry().width(), qApp->getWindow()->geometry().height());
|
||||
config->setProperty("attachedEntityId", _oldAttachedEntityId);
|
||||
config->setProperty("vFoV", _oldvFoV);
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -103,7 +104,7 @@ BEGIN
|
|||
CTEXT "",IDC_MESSAGE2_LABEL,35,172,239,15,NOT WS_VISIBLE
|
||||
CTEXT "",IDC_ACTION2_LABEL,15,147,278,25,NOT WS_VISIBLE
|
||||
RTEXT "",IDC_TERMS,15,172,180,15,NOT WS_VISIBLE
|
||||
CONTROL "",IDC_TERMS_LINK,"Button", BS_OWNERDRAW | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,197,172,80,15
|
||||
CONTROL "",IDC_TERMS_LINK,"Button",BS_OWNERDRAW | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,197,172,80,15
|
||||
CTEXT "",IDC_TROUBLE,65,203,174,15,NOT WS_VISIBLE
|
||||
CONTROL "NEXT",IDC_BUTTON_NEXT,"Button",BS_OWNERDRAW | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,107,158,94,16
|
||||
CONTROL "Having Trouble?",IDC_TROUBLE_LINK,"Button",BS_OWNERDRAW | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,126,203,56,11
|
||||
|
|
|
@ -32,19 +32,36 @@ CLauncherApp theApp;
|
|||
// CLauncherApp initialization
|
||||
|
||||
BOOL CLauncherApp::InitInstance() {
|
||||
// don't launch if already running
|
||||
CreateMutex(NULL, TRUE, _T("HQ_Launcher_Mutex"));
|
||||
if (GetLastError() == ERROR_ALREADY_EXISTS) {
|
||||
return FALSE;
|
||||
// Close interface if is running
|
||||
int interfacePID = -1;
|
||||
if (LauncherUtils::IsProcessRunning(L"interface.exe", interfacePID)) {
|
||||
LauncherUtils::shutdownProcess(interfacePID, 0);
|
||||
}
|
||||
int iNumOfArgs;
|
||||
LPWSTR* pArgs = CommandLineToArgvW(GetCommandLine(), &iNumOfArgs);
|
||||
if (iNumOfArgs > 1 && CString(pArgs[1]).Compare(_T("--uninstall")) == 0) {
|
||||
bool isUninstalling = false;
|
||||
bool isRestarting = false;
|
||||
if (iNumOfArgs > 1) {
|
||||
if (CString(pArgs[1]).Compare(_T("--uninstall")) == 0) {
|
||||
isUninstalling = true;
|
||||
} else if (CString(pArgs[1]).Compare(_T("--restart")) == 0) {
|
||||
isRestarting = true;
|
||||
}
|
||||
}
|
||||
if (!isRestarting) {
|
||||
// don't launch if already running
|
||||
CreateMutex(NULL, TRUE, _T("HQ_Launcher_Mutex"));
|
||||
if (GetLastError() == ERROR_ALREADY_EXISTS) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (isUninstalling) {
|
||||
_manager.uninstall();
|
||||
} else {
|
||||
_manager.init();
|
||||
}
|
||||
if (!_manager.installLauncher()) {
|
||||
if (!_manager.hasFailed() && !_manager.installLauncher()) {
|
||||
return FALSE;
|
||||
}
|
||||
installFont(IDR_FONT_REGULAR);
|
||||
|
|
|
@ -207,6 +207,9 @@ void CLauncherDlg::startProcess() {
|
|||
default:
|
||||
break;
|
||||
}
|
||||
if (error != LauncherUtils::DeleteDirError::NoErrorDeleting) {
|
||||
theApp._manager.setFailed(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -230,7 +233,15 @@ afx_msg void CLauncherDlg::OnTermsClicked() {
|
|||
}
|
||||
|
||||
afx_msg void CLauncherDlg::OnNextClicked() {
|
||||
if (_drawStep != DrawStep::DrawChoose) {
|
||||
if (_drawStep == DrawStep::DrawChoose) {
|
||||
CString displayName;
|
||||
m_username.GetWindowTextW(displayName);
|
||||
theApp._manager.setDisplayName(displayName);
|
||||
theApp._manager.addToLog(_T("Setting display name: " + displayName));
|
||||
startProcess();
|
||||
} else if (_drawStep == DrawStep::DrawError) {
|
||||
theApp._manager.restartLauncher();
|
||||
} else {
|
||||
CString token;
|
||||
CString username, password, orgname;
|
||||
m_orgname.GetWindowTextW(orgname);
|
||||
|
@ -261,12 +272,6 @@ afx_msg void CLauncherDlg::OnNextClicked() {
|
|||
setDrawDialog(DrawStep::DrawLoginErrorOrg);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
CString displayName;
|
||||
m_username.GetWindowTextW(displayName);
|
||||
theApp._manager.setDisplayName(displayName);
|
||||
theApp._manager.addToLog(_T("Setting display name: " + displayName));
|
||||
startProcess();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -318,7 +323,6 @@ void CLauncherDlg::drawVoxel(CHwndRenderTarget* pRenderTarget) {
|
|||
pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
|
||||
}
|
||||
|
||||
|
||||
void CLauncherDlg::showWindows(std::vector<CStatic*> windows, bool show) {
|
||||
for (auto window : windows) {
|
||||
window->ShowWindow(show ? SW_SHOW : SW_HIDE);
|
||||
|
@ -342,7 +346,7 @@ void CLauncherDlg::prepareLogin(DrawStep step) {
|
|||
m_password.ShowWindow(SW_SHOW);
|
||||
CString actionText = step == DrawStep::DrawLoginLogin ? _T("Please log in") : _T("Uh-oh, we have a problem");
|
||||
CString messageText = step == DrawStep::DrawLoginLogin ? _T("Be sure you've uploaded your Avatar before signing in.") :
|
||||
step == DrawStep::DrawLoginErrorCred ? _T("There is a problem with your credentials\n please try again.") : _T("There is a problem with your Organization name\n please try again.");
|
||||
step == DrawStep::DrawLoginErrorCred ? _T("There is a problem with your credentials.\n Please try again.") : _T("There is a problem with your Organization name.\n Please try again.");
|
||||
m_action_label->SetWindowTextW(actionText);
|
||||
m_message_label->SetWindowTextW(messageText);
|
||||
m_action_label->ShowWindow(SW_SHOW);
|
||||
|
@ -354,7 +358,6 @@ void CLauncherDlg::prepareLogin(DrawStep step) {
|
|||
|
||||
}
|
||||
|
||||
|
||||
void CLauncherDlg::prepareChoose() {
|
||||
m_orgname.ShowWindow(SW_HIDE);
|
||||
m_username.SetWindowTextW(_T(""));
|
||||
|
@ -371,14 +374,7 @@ void CLauncherDlg::prepareChoose() {
|
|||
m_terms_link.ShowWindow(SW_SHOW);
|
||||
m_terms->SetWindowTextW(_T("By signing in, you agree to the High Fidelity"));
|
||||
m_terms_link.SetWindowTextW(_T("Terms of Service"));
|
||||
CRect rec;
|
||||
m_btnNext.GetWindowRect(&rec);
|
||||
ScreenToClient(&rec);
|
||||
if (rec.top > 281) {
|
||||
rec.bottom -= 35;
|
||||
rec.top -= 35;
|
||||
m_btnNext.MoveWindow(rec, FALSE);
|
||||
}
|
||||
setVerticalElement(&m_btnNext, -35, 0, false);
|
||||
m_btnNext.ShowWindow(SW_SHOW);
|
||||
}
|
||||
|
||||
|
@ -401,6 +397,7 @@ void CLauncherDlg::prepareProcess(DrawStep step) {
|
|||
m_voxel->ShowWindow(SW_SHOW);
|
||||
CString actionText = _T("");
|
||||
CString messageText = _T("");
|
||||
|
||||
switch (step) {
|
||||
case DrawStep::DrawProcessSetup:
|
||||
actionText = _T("We're building your virtual HQ");
|
||||
|
@ -422,6 +419,15 @@ void CLauncherDlg::prepareProcess(DrawStep step) {
|
|||
actionText = _T("Uninstalling...");
|
||||
messageText = _T("It'll take one sec.");
|
||||
break;
|
||||
case DrawStep::DrawError:
|
||||
actionText = _T("Uh oh.");
|
||||
messageText = _T("We seem to have a problem.\nPlease restart HQ.");
|
||||
setVerticalElement(m_message2_label, 0, 5, false);
|
||||
setVerticalElement(&m_btnNext, 10);
|
||||
m_btnNext.ShowWindow(SW_SHOW);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
m_action2_label->SetWindowTextW(actionText);
|
||||
m_message2_label->SetWindowTextW(messageText);
|
||||
|
@ -429,9 +435,6 @@ void CLauncherDlg::prepareProcess(DrawStep step) {
|
|||
m_message2_label->ShowWindow(SW_SHOW);
|
||||
}
|
||||
|
||||
void CLauncherDlg::prepareError() {
|
||||
}
|
||||
|
||||
BOOL CLauncherDlg::getTextFormat(int resID, TextFormat& formatOut) {
|
||||
// Set default values for message
|
||||
BOOL isText = TRUE;
|
||||
|
@ -523,6 +526,8 @@ void CLauncherDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
|
|||
btnName += _drawStep == DrawStep::DrawLoginLogin ? _T("NEXT") : _T("LOG IN");
|
||||
int xpan = -20;
|
||||
defrect = CRect(rect.left - xpan, rect.top, rect.right + xpan, rect.bottom);
|
||||
} else if (_drawStep == DrawStep::DrawError) {
|
||||
btnName += _T("RESTART");
|
||||
} else {
|
||||
btnName += _T("TRY AGAIN");
|
||||
}
|
||||
|
@ -594,49 +599,88 @@ BOOL CLauncherDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
|
|||
void CLauncherDlg::OnTimer(UINT_PTR nIDEvent) {
|
||||
const int CONSOLE_MAX_SHUTDOWN_TRY_COUNT = 10;
|
||||
const int CONSOLE_DELTATIME_BETWEEN_TRYS = 10;
|
||||
if (_drawStep == DrawStep::DrawProcessSetup ||
|
||||
_drawStep == DrawStep::DrawProcessUpdate ||
|
||||
_drawStep == DrawStep::DrawProcessUninstall) {
|
||||
// Refresh
|
||||
setDrawDialog(_drawStep, true);
|
||||
if (theApp._manager.hasFailed() && _drawStep != DrawStep::DrawError) {
|
||||
theApp._manager.saveErrorLog();
|
||||
prepareProcess(DrawStep::DrawError);
|
||||
setDrawDialog(DrawStep::DrawError, false);
|
||||
}
|
||||
if (_showSplash) {
|
||||
if (_splashStep == 0){
|
||||
if (theApp._manager.needsUninstall()) {
|
||||
theApp._manager.addToLog(_T("Waiting to uninstall"));
|
||||
setDrawDialog(DrawStep::DrawProcessUninstall);
|
||||
} else {
|
||||
theApp._manager.addToLog(_T("Start splash screen"));
|
||||
setDrawDialog(DrawStep::DrawLogo);
|
||||
if (_drawStep != DrawStep::DrawError) {
|
||||
if (_drawStep == DrawStep::DrawProcessSetup ||
|
||||
_drawStep == DrawStep::DrawProcessUpdate ||
|
||||
_drawStep == DrawStep::DrawProcessUninstall) {
|
||||
// Refresh
|
||||
setDrawDialog(_drawStep, true);
|
||||
}
|
||||
if (_showSplash) {
|
||||
if (_splashStep == 0) {
|
||||
if (theApp._manager.needsUninstall()) {
|
||||
theApp._manager.addToLog(_T("Waiting to uninstall"));
|
||||
setDrawDialog(DrawStep::DrawProcessUninstall);
|
||||
}
|
||||
else {
|
||||
theApp._manager.addToLog(_T("Start splash screen"));
|
||||
setDrawDialog(DrawStep::DrawLogo);
|
||||
}
|
||||
}
|
||||
} else if (_splashStep > 100) {
|
||||
_showSplash = false;
|
||||
if (theApp._manager.shouldShutDown()) {
|
||||
if (_applicationWND != NULL) {
|
||||
::SetForegroundWindow(_applicationWND);
|
||||
::SetActiveWindow(_applicationWND);
|
||||
else if (_splashStep > 100) {
|
||||
_showSplash = false;
|
||||
if (theApp._manager.shouldShutDown()) {
|
||||
if (_applicationWND != NULL) {
|
||||
::SetForegroundWindow(_applicationWND);
|
||||
::SetActiveWindow(_applicationWND);
|
||||
}
|
||||
int interfacePID = -1;
|
||||
if (LauncherUtils::IsProcessRunning(L"interface.exe", interfacePID)) {
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
if (LauncherUtils::IsProcessRunning(L"interface.exe")) {
|
||||
exit(0);
|
||||
else if (theApp._manager.needsUpdate()) {
|
||||
startProcess();
|
||||
}
|
||||
} else if (theApp._manager.needsUpdate()) {
|
||||
startProcess();
|
||||
} else if (theApp._manager.needsUninstall()) {
|
||||
theApp._manager.uninstallApplication();
|
||||
else if (theApp._manager.needsUninstall()) {
|
||||
if (theApp._manager.uninstallApplication()) {
|
||||
theApp._manager.addToLog(_T("HQ uninstalled successfully."));
|
||||
exit(0);
|
||||
}
|
||||
else {
|
||||
theApp._manager.addToLog(_T("HQ failed to uninstall."));
|
||||
theApp._manager.setFailed(true);
|
||||
}
|
||||
}
|
||||
else {
|
||||
theApp._manager.addToLog(_T("Starting login"));
|
||||
setDrawDialog(DrawStep::DrawLoginLogin);
|
||||
}
|
||||
}
|
||||
_splashStep++;
|
||||
} else if (theApp._manager.shouldShutDown()) {
|
||||
int interfacePID = -1;
|
||||
if (LauncherUtils::IsProcessRunning(L"interface.exe", interfacePID)) {
|
||||
exit(0);
|
||||
} else {
|
||||
theApp._manager.addToLog(_T("Starting login"));
|
||||
setDrawDialog(DrawStep::DrawLoginLogin);
|
||||
}
|
||||
}
|
||||
_splashStep++;
|
||||
} else if (theApp._manager.shouldShutDown()) {
|
||||
if (LauncherUtils::IsProcessRunning(L"interface.exe")) {
|
||||
exit(0);
|
||||
if (theApp._manager.shouldLaunch()) {
|
||||
_applicationWND = theApp._manager.launchApplication();
|
||||
}
|
||||
}
|
||||
if (theApp._manager.shouldLaunch()) {
|
||||
_applicationWND = theApp._manager.launchApplication();
|
||||
}
|
||||
|
||||
void CLauncherDlg::setVerticalElement(CWnd* element, int verticalOffset, int heightOffset, bool fromMainWindowBottom) {
|
||||
CRect elementRec;
|
||||
CRect windowRec;
|
||||
if (element != NULL) {
|
||||
element->GetWindowRect(&elementRec);
|
||||
ScreenToClient(&elementRec);
|
||||
int offset = verticalOffset;
|
||||
if (fromMainWindowBottom) {
|
||||
GetWindowRect(&windowRec);
|
||||
ScreenToClient(&windowRec);
|
||||
int currentDistance = windowRec.bottom - elementRec.bottom;
|
||||
offset = currentDistance - verticalOffset;
|
||||
}
|
||||
elementRec.bottom = elementRec.bottom + offset + heightOffset;
|
||||
elementRec.top = elementRec.top + offset;
|
||||
element->MoveWindow(elementRec, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -671,6 +715,7 @@ void CLauncherDlg::setDrawDialog(DrawStep step, BOOL isUpdate) {
|
|||
m_pRenderTarget->EndDraw();
|
||||
RedrawWindow();
|
||||
break;
|
||||
case DrawStep::DrawError:
|
||||
case DrawStep::DrawProcessFinishHq:
|
||||
case DrawStep::DrawProcessFinishUpdate:
|
||||
case DrawStep::DrawProcessUpdate:
|
||||
|
|
|
@ -43,19 +43,18 @@ public:
|
|||
|
||||
void setDrawDialog(DrawStep step, BOOL isUpdate = FALSE);
|
||||
|
||||
|
||||
// Dialog Data
|
||||
#ifdef AFX_DESIGN_TIME
|
||||
enum { IDD = IDD_LAUNCHER_DIALOG };
|
||||
#endif
|
||||
|
||||
protected:
|
||||
// Implementation
|
||||
protected:
|
||||
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
||||
void startProcess();
|
||||
void setCustomDialog();
|
||||
|
||||
// Implementation
|
||||
protected:
|
||||
void setVerticalElement(CWnd* element, int verticalOffset, int heightOffset = 0, bool fromMainWindowBottom = true);
|
||||
|
||||
BOOL getHQInfo(const CString& orgname);
|
||||
DrawStep _drawStep { DrawStep::DrawLogo };
|
||||
|
@ -100,7 +99,6 @@ protected:
|
|||
void prepareLogin(DrawStep step);
|
||||
void prepareProcess(DrawStep step);
|
||||
void prepareChoose();
|
||||
void prepareError();
|
||||
|
||||
void redrawBanner(const CEdit& edit, CStatic* banner);
|
||||
|
||||
|
|
|
@ -15,32 +15,37 @@
|
|||
#include "LauncherManager.h"
|
||||
|
||||
|
||||
LauncherManager::LauncherManager()
|
||||
{
|
||||
LauncherManager::LauncherManager() {
|
||||
}
|
||||
|
||||
|
||||
LauncherManager::~LauncherManager()
|
||||
{
|
||||
LauncherManager::~LauncherManager() {
|
||||
}
|
||||
|
||||
void LauncherManager::init() {
|
||||
initLog();
|
||||
addToLog(_T("Getting most recent build"));
|
||||
getMostRecentBuild(_latestApplicationURL, _latestVersion);
|
||||
addToLog(_T("Latest version: ") + _latestVersion);
|
||||
CString currentVersion;
|
||||
if (isApplicationInstalled(currentVersion, _domainURL, _contentURL, _loggedIn) && _loggedIn) {
|
||||
addToLog(_T("Installed version: ") + currentVersion);
|
||||
if (_latestVersion.Compare(currentVersion) == 0) {
|
||||
addToLog(_T("Already running most recent build. Launching interface.exe"));
|
||||
_shouldLaunch = TRUE;
|
||||
_shouldShutdown = TRUE;
|
||||
} else {
|
||||
addToLog(_T("New build found. Updating"));
|
||||
_shouldUpdate = TRUE;
|
||||
LauncherUtils::ResponseError error = getMostRecentBuild(_latestApplicationURL, _latestVersion);
|
||||
if (error == LauncherUtils::ResponseError::NoError) {
|
||||
addToLog(_T("Latest version: ") + _latestVersion);
|
||||
CString currentVersion;
|
||||
if (isApplicationInstalled(currentVersion, _domainURL, _contentURL, _loggedIn) && _loggedIn) {
|
||||
addToLog(_T("Installed version: ") + currentVersion);
|
||||
if (_latestVersion.Compare(currentVersion) == 0) {
|
||||
addToLog(_T("Already running most recent build. Launching interface.exe"));
|
||||
_shouldLaunch = TRUE;
|
||||
_shouldShutdown = TRUE;
|
||||
} else {
|
||||
addToLog(_T("New build found. Updating"));
|
||||
_shouldUpdate = TRUE;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
_hasFailed = true;
|
||||
CString msg;
|
||||
msg.Format(_T("Getting most recent build has failed with error: %d"), error);
|
||||
addToLog(msg);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
BOOL LauncherManager::initLog() {
|
||||
|
@ -74,8 +79,19 @@ void LauncherManager::closeLog() {
|
|||
}
|
||||
}
|
||||
|
||||
void LauncherManager::saveErrorLog() {
|
||||
CString logPath = _logFile.GetFilePath();
|
||||
CString errorLogPath;
|
||||
auto result = getAndCreatePaths(PathType::Launcher_Directory, errorLogPath);
|
||||
if (result) {
|
||||
CString filename;
|
||||
errorLogPath += _T("log_error.txt");
|
||||
closeLog();
|
||||
CopyFile(logPath, errorLogPath, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LauncherManager::installLauncher() {
|
||||
addToLog(_T("Installing Launcher."));
|
||||
CString appPath;
|
||||
BOOL result = getAndCreatePaths(PathType::Running_Path, appPath);
|
||||
if (!result) {
|
||||
|
@ -93,13 +109,17 @@ BOOL LauncherManager::installLauncher() {
|
|||
if (!_shouldUninstall) {
|
||||
// The installer is not running on the desired location and has to be installed
|
||||
// Kill of running before self-copy
|
||||
if (LauncherUtils::IsProcessRunning(LAUNCHER_EXE_FILENAME)) {
|
||||
ShellExecute(NULL, NULL, L"taskkill", L"/F /T /IM " + LAUNCHER_EXE_FILENAME, NULL, SW_HIDE);
|
||||
addToLog(_T("Installing Launcher."));
|
||||
int launcherPID = -1;
|
||||
if (LauncherUtils::IsProcessRunning(LAUNCHER_EXE_FILENAME, launcherPID)) {
|
||||
if (!LauncherUtils::shutdownProcess(launcherPID, 0)) {
|
||||
addToLog(_T("Error shutting down the Launcher"));
|
||||
}
|
||||
}
|
||||
CopyFile(appPath, instalationPath, FALSE);
|
||||
}
|
||||
} else if (_shouldUninstall) {
|
||||
addToLog(_T("Launching uninstall mode."));
|
||||
addToLog(_T("Launching Uninstall mode."));
|
||||
CString tempPath;
|
||||
if (getAndCreatePaths(PathType::Temp_Directory, tempPath)) {
|
||||
tempPath += _T("\\HQ_uninstaller_tmp.exe");
|
||||
|
@ -111,6 +131,18 @@ BOOL LauncherManager::installLauncher() {
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LauncherManager::restartLauncher() {
|
||||
addToLog(_T("Restarting Launcher."));
|
||||
CString installDirectory;
|
||||
if (getAndCreatePaths(PathType::Launcher_Directory, installDirectory)) {
|
||||
CString installPath = installDirectory + LAUNCHER_EXE_FILENAME;
|
||||
LauncherUtils::launchApplication(installPath, _T(" --restart"));
|
||||
exit(0);
|
||||
}
|
||||
addToLog(_T("Error restarting Launcher."));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL LauncherManager::createShortcuts() {
|
||||
CString desktopLnkPath;
|
||||
addToLog(_T("Creating shortcuts."));
|
||||
|
@ -276,7 +308,8 @@ LauncherUtils::ResponseError LauncherManager::readConfigJSON(CString& version, C
|
|||
}
|
||||
Json::Value config;
|
||||
configFile >> config;
|
||||
if (config["version"].isString() && config["domain"].isString() &&
|
||||
if (config["version"].isString() &&
|
||||
config["domain"].isString() &&
|
||||
config["content"].isString()) {
|
||||
loggedIn = config["loggedIn"].asBool();
|
||||
version = config["version"].asCString();
|
||||
|
@ -395,8 +428,10 @@ BOOL LauncherManager::uninstallApplication() {
|
|||
CString installDir;
|
||||
getAndCreatePaths(PathType::Launcher_Directory, installDir);
|
||||
BOOL success = LauncherUtils::deleteFileOrDirectory(installDir);
|
||||
success = success && (deleteShortcuts());
|
||||
success = success && (deleteApplicationRegistryKeys());
|
||||
if (success) {
|
||||
deleteShortcuts();
|
||||
deleteApplicationRegistryKeys();
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
|
@ -425,7 +460,12 @@ BOOL LauncherManager::extractApplication() {
|
|||
getAndCreatePaths(LauncherManager::PathType::Interface_Directory, installPath);
|
||||
BOOL success = LauncherUtils::unzipFileOnThread(ZipType::ZipApplication, LauncherUtils::cStringToStd(_applicationZipPath),
|
||||
LauncherUtils::cStringToStd(installPath), [&](int type, int size) {
|
||||
onZipExtracted((ZipType)type, size);
|
||||
if (size > 0) {
|
||||
onZipExtracted((ZipType)type, size);
|
||||
} else {
|
||||
addToLog(_T("Error decompressing application zip file."));
|
||||
_hasFailed = true;
|
||||
}
|
||||
});
|
||||
if (success) {
|
||||
addToLog(_T("Created thread for unzipping application."));
|
||||
|
@ -452,7 +492,13 @@ BOOL LauncherManager::installContent() {
|
|||
getAndCreatePaths(LauncherManager::PathType::Content_Directory, contentPath);
|
||||
BOOL success = LauncherUtils::unzipFileOnThread(ZipType::ZipContent, contentZipFile,
|
||||
LauncherUtils::cStringToStd(contentPath), [&](int type, int size) {
|
||||
onZipExtracted((ZipType)type, size);
|
||||
if (size > 0) {
|
||||
addToLog(_T("Content zip decompresed."));
|
||||
onZipExtracted((ZipType)type, size);
|
||||
} else {
|
||||
addToLog(_T("Error decompressing content zip file."));
|
||||
_hasFailed = true;
|
||||
}
|
||||
});
|
||||
if (success) {
|
||||
addToLog(_T("Created thread for unzipping content."));
|
||||
|
@ -469,8 +515,18 @@ BOOL LauncherManager::downloadFile(DownloadType type, const CString& url, CStrin
|
|||
BOOL success = getAndCreatePaths(LauncherManager::PathType::Download_Directory, downloadDirectory);
|
||||
outPath = downloadDirectory + fileName;
|
||||
if (success) {
|
||||
if (!LauncherUtils::downloadFileOnThread(type, url, outPath, [&](int type) {
|
||||
onFileDownloaded((DownloadType)type);
|
||||
addToLog(_T("Downloading: ") + url);
|
||||
if (!LauncherUtils::downloadFileOnThread(type, url, outPath, [&](int type, bool error) {
|
||||
if (!error) {
|
||||
onFileDownloaded((DownloadType)type);
|
||||
} else {
|
||||
if (type == DownloadType::DownloadApplication) {
|
||||
addToLog(_T("Error downloading content."));
|
||||
} else {
|
||||
addToLog(_T("Error downloading application."));
|
||||
}
|
||||
_hasFailed = true;
|
||||
}
|
||||
})) {
|
||||
success = FALSE;
|
||||
}
|
||||
|
|
|
@ -56,6 +56,7 @@ public:
|
|||
BOOL initLog();
|
||||
BOOL addToLog(const CString& line);
|
||||
void closeLog();
|
||||
void saveErrorLog();
|
||||
BOOL getAndCreatePaths(PathType type, CString& outPath);
|
||||
BOOL getInstalledVersion(const CString& path, CString& version);
|
||||
BOOL isApplicationInstalled(CString& version, CString& domain,
|
||||
|
@ -73,6 +74,7 @@ public:
|
|||
HWND launchApplication();
|
||||
BOOL uninstallApplication();
|
||||
BOOL installLauncher();
|
||||
BOOL restartLauncher();
|
||||
|
||||
// getters
|
||||
const CString& getContentURL() const { return _contentURL; }
|
||||
|
@ -84,6 +86,8 @@ public:
|
|||
BOOL needsUninstall() { return _shouldUninstall; }
|
||||
void setDisplayName(const CString& displayName) { _displayName = displayName; }
|
||||
bool isLoggedIn() { return _loggedIn; }
|
||||
bool hasFailed() { return _hasFailed; }
|
||||
void setFailed(bool hasFailed) { _hasFailed = hasFailed; }
|
||||
const CString& getLatestInterfaceURL() const { return _latestApplicationURL; }
|
||||
void uninstall() { _shouldUninstall = true; };
|
||||
|
||||
|
@ -106,6 +110,7 @@ private:
|
|||
CString _applicationZipPath;
|
||||
CString _contentZipPath;
|
||||
bool _loggedIn{ false };
|
||||
bool _hasFailed{ false };
|
||||
BOOL _shouldUpdate{ FALSE };
|
||||
BOOL _shouldUninstall{ FALSE };
|
||||
BOOL _shouldShutdown{ FALSE };
|
||||
|
|
|
@ -37,7 +37,19 @@ CString LauncherUtils::urlEncodeString(const CString& url) {
|
|||
return stringOut;
|
||||
}
|
||||
|
||||
BOOL LauncherUtils::IsProcessRunning(const wchar_t *processName) {
|
||||
BOOL LauncherUtils::shutdownProcess(DWORD dwProcessId, UINT uExitCode) {
|
||||
DWORD dwDesiredAccess = PROCESS_TERMINATE;
|
||||
BOOL bInheritHandle = FALSE;
|
||||
HANDLE hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
|
||||
if (hProcess == NULL) {
|
||||
return FALSE;
|
||||
}
|
||||
BOOL result = TerminateProcess(hProcess, uExitCode);
|
||||
CloseHandle(hProcess);
|
||||
return result;
|
||||
}
|
||||
|
||||
BOOL LauncherUtils::IsProcessRunning(const wchar_t *processName, int& processID) {
|
||||
bool exists = false;
|
||||
PROCESSENTRY32 entry;
|
||||
entry.dwSize = sizeof(PROCESSENTRY32);
|
||||
|
@ -48,6 +60,7 @@ BOOL LauncherUtils::IsProcessRunning(const wchar_t *processName) {
|
|||
while (Process32Next(snapshot, &entry)) {
|
||||
if (!_wcsicmp(entry.szExeFile, processName)) {
|
||||
exists = true;
|
||||
processID = entry.th32ProcessID;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -258,38 +271,54 @@ uint64_t LauncherUtils::extractZip(const std::string& zipFile, const std::string
|
|||
}
|
||||
|
||||
int fileCount = (int)mz_zip_reader_get_num_files(&zip_archive);
|
||||
if (fileCount == 0) {
|
||||
theApp._manager.addToLog(_T("Zip archive has a file count of 0"));
|
||||
{
|
||||
CString msg;
|
||||
msg.Format(_T("Zip archive has a file count of %d"), fileCount);
|
||||
theApp._manager.addToLog(msg);
|
||||
}
|
||||
|
||||
if (fileCount == 0) {
|
||||
mz_zip_reader_end(&zip_archive);
|
||||
return 0;
|
||||
}
|
||||
mz_zip_archive_file_stat file_stat;
|
||||
if (!mz_zip_reader_file_stat(&zip_archive, 0, &file_stat)) {
|
||||
theApp._manager.addToLog(_T("Zip archive cannot be stat'd"));
|
||||
|
||||
mz_zip_reader_end(&zip_archive);
|
||||
return 0;
|
||||
}
|
||||
// Get root folder
|
||||
CString lastDir = _T("");
|
||||
uint64_t totalSize = 0;
|
||||
bool _shouldFail = false;
|
||||
for (int i = 0; i < fileCount; i++) {
|
||||
if (!mz_zip_reader_file_stat(&zip_archive, i, &file_stat)) continue;
|
||||
std::string filename = file_stat.m_filename;
|
||||
std::replace(filename.begin(), filename.end(), '/', '\\');
|
||||
CString fullFilename = CString(path.c_str()) + "\\" + CString(filename.c_str());
|
||||
if (mz_zip_reader_is_file_a_directory(&zip_archive, i)) {
|
||||
if (SHCreateDirectoryEx(NULL, fullFilename, NULL) || ERROR_ALREADY_EXISTS == GetLastError()) {
|
||||
break;
|
||||
} else {
|
||||
continue;
|
||||
int error = SHCreateDirectoryEx(NULL, fullFilename, NULL);
|
||||
if (error == ERROR_BAD_PATHNAME ||
|
||||
error == ERROR_FILENAME_EXCED_RANGE ||
|
||||
error == ERROR_PATH_NOT_FOUND ||
|
||||
error == ERROR_CANCELLED) {
|
||||
CString msg;
|
||||
msg.Format(_T("Unzipping error: %d creating folder: %s"), error, fullFilename);
|
||||
theApp._manager.addToLog(msg);
|
||||
mz_zip_reader_end(&zip_archive);
|
||||
return 0;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
CT2A destFile(fullFilename);
|
||||
if (mz_zip_reader_extract_to_file(&zip_archive, i, destFile, 0)) {
|
||||
totalSize += (uint64_t)file_stat.m_uncomp_size;
|
||||
files.emplace_back(destFile);
|
||||
} else {
|
||||
CString msg;
|
||||
msg.Format(_T("Error unzipping the file: %s"), fullFilename);
|
||||
theApp._manager.addToLog(msg);
|
||||
_shouldFail = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -421,11 +450,10 @@ DWORD WINAPI LauncherUtils::unzipThread(LPVOID lpParameter) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
DWORD WINAPI LauncherUtils::downloadThread(LPVOID lpParameter)
|
||||
{
|
||||
DWORD WINAPI LauncherUtils::downloadThread(LPVOID lpParameter) {
|
||||
DownloadThreadData& data = *((DownloadThreadData*)lpParameter);
|
||||
auto hr = URLDownloadToFile(0, data._url, data._file, 0, NULL);
|
||||
data.callback(data._type);
|
||||
data.callback(data._type, hr != S_OK);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -457,7 +485,7 @@ BOOL LauncherUtils::unzipFileOnThread(int type, const std::string& zipFile, cons
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL LauncherUtils::downloadFileOnThread(int type, const CString& url, const CString& file, std::function<void(int)> callback) {
|
||||
BOOL LauncherUtils::downloadFileOnThread(int type, const CString& url, const CString& file, std::function<void(int, bool)> callback) {
|
||||
DWORD myThreadID;
|
||||
DownloadThreadData* downloadThreadData = new DownloadThreadData();
|
||||
downloadThreadData->_type = type;
|
||||
|
|
|
@ -41,10 +41,10 @@ public:
|
|||
int _type;
|
||||
CString _url;
|
||||
CString _file;
|
||||
std::function<void(int)> callback;
|
||||
// function(type)
|
||||
void setCallback(std::function<void(int)> fn) {
|
||||
callback = std::bind(fn, std::placeholders::_1);
|
||||
std::function<void(int, bool)> callback;
|
||||
// function(type, errorType)
|
||||
void setCallback(std::function<void(int, bool)> fn) {
|
||||
callback = std::bind(fn, std::placeholders::_1, std::placeholders::_2);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -73,7 +73,8 @@ public:
|
|||
static std::string cStringToStd(CString cstring);
|
||||
static BOOL getFont(const CString& fontName, int fontSize, bool isBold, CFont& fontOut);
|
||||
static BOOL launchApplication(LPCWSTR lpApplicationName, LPTSTR cmdArgs = _T(""));
|
||||
static BOOL IsProcessRunning(const wchar_t *processName);
|
||||
static BOOL IsProcessRunning(const wchar_t *processName, int& processID);
|
||||
static BOOL shutdownProcess(DWORD dwProcessId, UINT uExitCode);
|
||||
static BOOL insertRegistryKey(const std::string& regPath, const std::string& name, const std::string& value);
|
||||
static BOOL insertRegistryKey(const std::string& regPath, const std::string& name, DWORD value);
|
||||
static BOOL deleteFileOrDirectory(const CString& dirPath, bool noRecycleBin = true);
|
||||
|
@ -82,7 +83,7 @@ public:
|
|||
static uint64_t extractZip(const std::string& zipFile, const std::string& path, std::vector<std::string>& files);
|
||||
static BOOL deleteRegistryKey(const CString& registryPath);
|
||||
static BOOL unzipFileOnThread(int type, const std::string& zipFile, const std::string& path, std::function<void(int, int)> callback);
|
||||
static BOOL downloadFileOnThread(int type, const CString& url, const CString& file, std::function<void(int)> callback);
|
||||
static BOOL downloadFileOnThread(int type, const CString& url, const CString& file, std::function<void(int, bool)> callback);
|
||||
static BOOL deleteDirectoriesOnThread(const CString& applicationDir,
|
||||
const CString& downloadsDir,
|
||||
std::function<void(int)> callback);
|
||||
|
|
|
@ -1108,7 +1108,7 @@ void Avatar::renderDisplayName(gpu::Batch& batch, const ViewFrustum& view, const
|
|||
batch.setModelTransform(textTransform);
|
||||
{
|
||||
PROFILE_RANGE_BATCH(batch, __FUNCTION__":renderText");
|
||||
renderer->draw(batch, text_x, -text_y, nameUTF8.data(), textColor, glm::vec2(-1.0f), forward);
|
||||
renderer->draw(batch, text_x, -text_y, nameUTF8.data(), textColor, glm::vec2(-1.0f), true, forward);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -331,18 +331,19 @@ void SkeletonModel::renderBoundingCollisionShapes(RenderArgs* args, gpu::Batch&
|
|||
// draw a blue sphere at the capsule top point
|
||||
glm::vec3 topPoint = _translation + _rotation * (scale * (_boundingCapsuleLocalOffset + (0.5f * _boundingCapsuleHeight) * Vectors::UNIT_Y));
|
||||
batch.setModelTransform(Transform().setTranslation(topPoint).postScale(scale * _boundingCapsuleRadius));
|
||||
geometryCache->renderSolidSphereInstance(args, batch, glm::vec4(0.6f, 0.6f, 0.8f, alpha));
|
||||
auto pipeline = geometryCache->getShapePipelinePointer(alpha < 1.0f, false, args->_renderMethod == render::Args::RenderMethod::FORWARD);
|
||||
geometryCache->renderSolidSphereInstance(args, batch, glm::vec4(0.6f, 0.6f, 0.8f, alpha), pipeline);
|
||||
|
||||
// draw a yellow sphere at the capsule bottom point
|
||||
glm::vec3 bottomPoint = topPoint - _rotation * glm::vec3(0.0f, scale * _boundingCapsuleHeight, 0.0f);
|
||||
batch.setModelTransform(Transform().setTranslation(bottomPoint).postScale(scale * _boundingCapsuleRadius));
|
||||
geometryCache->renderSolidSphereInstance(args, batch, glm::vec4(0.8f, 0.8f, 0.6f, alpha));
|
||||
geometryCache->renderSolidSphereInstance(args, batch, glm::vec4(0.8f, 0.8f, 0.6f, alpha), pipeline);
|
||||
|
||||
// draw a green cylinder between the two points
|
||||
float capsuleDiameter = 2.0f * _boundingCapsuleRadius;
|
||||
glm::vec3 cylinderDimensions = glm::vec3(capsuleDiameter, _boundingCapsuleHeight, capsuleDiameter);
|
||||
batch.setModelTransform(Transform().setScale(scale * cylinderDimensions).setRotation(_rotation).setTranslation(0.5f * (topPoint + bottomPoint)));
|
||||
geometryCache->renderSolidShapeInstance(args, batch, GeometryCache::Shape::Cylinder, glm::vec4(0.6f, 0.8f, 0.6f, alpha));
|
||||
geometryCache->renderSolidShapeInstance(args, batch, GeometryCache::Shape::Cylinder, glm::vec4(0.6f, 0.8f, 0.6f, alpha), pipeline);
|
||||
}
|
||||
|
||||
bool SkeletonModel::hasSkeleton() {
|
||||
|
|
|
@ -69,6 +69,7 @@ public:
|
|||
virtual PacketType getExpectedPacketType() const override { return PacketType::EntityData; }
|
||||
|
||||
// Returns the priority at which an entity should be loaded. Higher values indicate higher priority.
|
||||
static CalculateEntityLoadingPriority getEntityLoadingPriorityOperator() { return _calculateEntityLoadingPriorityFunc; }
|
||||
static float getEntityLoadingPriority(const EntityItem& item) { return _calculateEntityLoadingPriorityFunc(item); }
|
||||
static void setEntityLoadingPriorityFunction(CalculateEntityLoadingPriority fn) { _calculateEntityLoadingPriorityFunc = fn; }
|
||||
|
||||
|
|
|
@ -185,7 +185,7 @@ ItemKey EntityRenderer::getKey() {
|
|||
}
|
||||
}
|
||||
|
||||
uint32_t EntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) {
|
||||
uint32_t EntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) const {
|
||||
if (Item::isValidID(_renderItemID)) {
|
||||
subItems.emplace_back(_renderItemID);
|
||||
return 1;
|
||||
|
|
|
@ -62,7 +62,7 @@ public:
|
|||
|
||||
static glm::vec4 calculatePulseColor(const glm::vec4& color, const PulsePropertyGroup& pulseProperties, quint64 start);
|
||||
|
||||
virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) override;
|
||||
virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) const override;
|
||||
virtual Item::Bound getBound() override;
|
||||
|
||||
protected:
|
||||
|
|
|
@ -111,9 +111,9 @@ void ImageEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
|
|||
void* key = (void*)this;
|
||||
AbstractViewStateInterface::instance()->pushPostUpdateLambda(key, [this, entity]() {
|
||||
withWriteLock([&] {
|
||||
_dimensions = entity->getScaledDimensions();
|
||||
updateModelTransformAndBound();
|
||||
_renderTransform = getModelTransform();
|
||||
_renderTransform.postScale(entity->getScaledDimensions());
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -152,14 +152,12 @@ void ImageEntityRenderer::doRender(RenderArgs* args) {
|
|||
NetworkTexturePointer texture;
|
||||
QRect subImage;
|
||||
glm::vec4 color;
|
||||
glm::vec3 dimensions;
|
||||
Transform transform;
|
||||
withReadLock([&] {
|
||||
texture = _texture;
|
||||
subImage = _subImage;
|
||||
color = glm::vec4(toGlm(_color), _alpha);
|
||||
color = EntityRenderer::calculatePulseColor(color, _pulseProperties, _created);
|
||||
dimensions = _dimensions;
|
||||
transform = _renderTransform;
|
||||
});
|
||||
|
||||
|
@ -171,7 +169,6 @@ void ImageEntityRenderer::doRender(RenderArgs* args) {
|
|||
gpu::Batch* batch = args->_batch;
|
||||
|
||||
transform.setRotation(EntityItem::getBillboardRotation(transform.getTranslation(), transform.getRotation(), _billboardMode, args->getViewFrustum().getPosition()));
|
||||
transform.postScale(dimensions);
|
||||
|
||||
batch->setModelTransform(transform);
|
||||
batch->setResourceTexture(0, texture->getGPUTexture());
|
||||
|
@ -200,16 +197,14 @@ void ImageEntityRenderer::doRender(RenderArgs* args) {
|
|||
|
||||
float maxSize = glm::max(fromImage.width(), fromImage.height());
|
||||
float x = _keepAspectRatio ? fromImage.width() / (2.0f * maxSize) : 0.5f;
|
||||
float y = _keepAspectRatio ? -fromImage.height() / (2.0f * maxSize) : -0.5f;
|
||||
float y = _keepAspectRatio ? fromImage.height() / (2.0f * maxSize) : 0.5f;
|
||||
|
||||
glm::vec2 topLeft(-x, -y);
|
||||
glm::vec2 bottomRight(x, y);
|
||||
glm::vec2 texCoordTopLeft((fromImage.x() + 0.5f) / imageWidth, (fromImage.y() + 0.5f) / imageHeight);
|
||||
glm::vec2 texCoordBottomRight((fromImage.x() + fromImage.width() - 0.5f) / imageWidth,
|
||||
(fromImage.y() + fromImage.height() - 0.5f) / imageHeight);
|
||||
glm::vec2 texCoordBottomLeft((fromImage.x() + 0.5f) / imageWidth, -(fromImage.y() + 0.5f) / imageHeight);
|
||||
glm::vec2 texCoordTopRight((fromImage.x() + fromImage.width() - 0.5f) / imageWidth,
|
||||
-(fromImage.y() + fromImage.height() - 0.5f) / imageHeight);
|
||||
|
||||
DependencyManager::get<GeometryCache>()->renderQuad(
|
||||
*batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight,
|
||||
*batch, glm::vec2(-x, -y), glm::vec2(x, y), texCoordBottomLeft, texCoordTopRight,
|
||||
color, _geometryId
|
||||
);
|
||||
|
||||
|
|
|
@ -47,8 +47,6 @@ private:
|
|||
PulsePropertyGroup _pulseProperties;
|
||||
BillboardMode _billboardMode;
|
||||
|
||||
glm::vec3 _dimensions;
|
||||
|
||||
int _geometryId { 0 };
|
||||
};
|
||||
|
||||
|
|
|
@ -1073,7 +1073,7 @@ ItemKey ModelEntityRenderer::getKey() {
|
|||
return _itemKey;
|
||||
}
|
||||
|
||||
uint32_t ModelEntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) {
|
||||
uint32_t ModelEntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) const {
|
||||
if (_model) {
|
||||
auto metaSubItems = _model->fetchRenderItemIDs();
|
||||
subItems.insert(subItems.end(), metaSubItems.begin(), metaSubItems.end());
|
||||
|
@ -1519,7 +1519,8 @@ void ModelEntityRenderer::doRender(RenderArgs* args) {
|
|||
static glm::vec4 greenColor(0.0f, 1.0f, 0.0f, 1.0f);
|
||||
gpu::Batch& batch = *args->_batch;
|
||||
batch.setModelTransform(getModelTransform()); // we want to include the scale as well
|
||||
DependencyManager::get<GeometryCache>()->renderWireCubeInstance(args, batch, greenColor);
|
||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||
geometryCache->renderWireCubeInstance(args, batch, greenColor, geometryCache->getShapePipelinePointer(false, false, args->_renderMethod == Args::RenderMethod::FORWARD));
|
||||
|
||||
#if WANT_EXTRA_DEBUGGING
|
||||
ModelPointer model;
|
||||
|
|
|
@ -154,7 +154,7 @@ protected:
|
|||
|
||||
void setKey(bool didVisualGeometryRequestSucceed);
|
||||
virtual ItemKey getKey() override;
|
||||
virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) override;
|
||||
virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) const override;
|
||||
|
||||
virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override;
|
||||
virtual bool needsRenderUpdate() const override;
|
||||
|
|
|
@ -283,12 +283,8 @@ void ShapeEntityRenderer::doRender(RenderArgs* args) {
|
|||
} else if (!useMaterialPipeline(materials)) {
|
||||
// FIXME, support instanced multi-shape rendering using multidraw indirect
|
||||
outColor.a *= _isFading ? Interpolate::calculateFadeRatio(_fadeStartTime) : 1.0f;
|
||||
render::ShapePipelinePointer pipeline;
|
||||
if (renderLayer == RenderLayer::WORLD && args->_renderMethod != Args::RenderMethod::FORWARD) {
|
||||
pipeline = outColor.a < 1.0f ? geometryCache->getTransparentShapePipeline() : geometryCache->getOpaqueShapePipeline();
|
||||
} else {
|
||||
pipeline = outColor.a < 1.0f ? geometryCache->getForwardTransparentShapePipeline() : geometryCache->getForwardOpaqueShapePipeline();
|
||||
}
|
||||
render::ShapePipelinePointer pipeline = geometryCache->getShapePipelinePointer(outColor.a < 1.0f, false,
|
||||
renderLayer != RenderLayer::WORLD || args->_renderMethod == Args::RenderMethod::FORWARD);
|
||||
if (render::ShapeKey(args->_globalShapeKey).isWireframe() || primitiveMode == PrimitiveMode::LINES) {
|
||||
geometryCache->renderWireShapeInstance(args, batch, geometryShape, outColor, pipeline);
|
||||
} else {
|
||||
|
|
|
@ -31,6 +31,17 @@ const float LINE_SCALE_RATIO = 1.2f;
|
|||
TextEntityRenderer::TextEntityRenderer(const EntityItemPointer& entity) :
|
||||
Parent(entity),
|
||||
_textRenderer(TextRenderer3D::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE / 2.0f)) {
|
||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||
if (geometryCache) {
|
||||
_geometryID = geometryCache->allocateID();
|
||||
}
|
||||
}
|
||||
|
||||
TextEntityRenderer::~TextEntityRenderer() {
|
||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||
if (_geometryID && geometryCache) {
|
||||
geometryCache->releaseID(_geometryID);
|
||||
}
|
||||
}
|
||||
|
||||
bool TextEntityRenderer::isTransparent() const {
|
||||
|
@ -59,17 +70,20 @@ ItemKey TextEntityRenderer::getKey() {
|
|||
}
|
||||
|
||||
ShapeKey TextEntityRenderer::getShapeKey() {
|
||||
auto builder = render::ShapeKey::Builder();
|
||||
auto builder = render::ShapeKey::Builder().withoutCullFace();
|
||||
if (isTransparent()) {
|
||||
builder.withTranslucent();
|
||||
}
|
||||
if (_unlit) {
|
||||
builder.withUnlit();
|
||||
}
|
||||
if (_primitiveMode == PrimitiveMode::LINES) {
|
||||
builder.withWireframe();
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
uint32_t TextEntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) {
|
||||
uint32_t TextEntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) const {
|
||||
auto parentSubs = Parent::metaFetchMetaSubItems(subItems);
|
||||
if (Item::isValidID(_textRenderID)) {
|
||||
subItems.emplace_back(_textRenderID);
|
||||
|
@ -127,6 +141,10 @@ bool TextEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPoint
|
|||
return true;
|
||||
}
|
||||
|
||||
if (_unlit != entity->getUnlit()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (_pulseProperties != entity->getPulseProperties()) {
|
||||
return true;
|
||||
}
|
||||
|
@ -160,6 +178,7 @@ void TextEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointe
|
|||
_rightMargin = entity->getRightMargin();
|
||||
_topMargin = entity->getTopMargin();
|
||||
_bottomMargin = entity->getBottomMargin();
|
||||
_unlit = entity->getUnlit();
|
||||
updateTextRenderItem();
|
||||
});
|
||||
}
|
||||
|
@ -193,17 +212,19 @@ void TextEntityRenderer::doRender(RenderArgs* args) {
|
|||
batch.setModelTransform(modelTransform);
|
||||
|
||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||
render::ShapePipelinePointer pipeline;
|
||||
if (renderLayer == RenderLayer::WORLD && args->_renderMethod != Args::RenderMethod::FORWARD) {
|
||||
pipeline = backgroundColor.a < 1.0f ? geometryCache->getTransparentShapePipeline() : geometryCache->getOpaqueShapePipeline();
|
||||
} else {
|
||||
pipeline = backgroundColor.a < 1.0f ? geometryCache->getForwardTransparentShapePipeline() : geometryCache->getForwardOpaqueShapePipeline();
|
||||
}
|
||||
if (render::ShapeKey(args->_globalShapeKey).isWireframe() || primitiveMode == PrimitiveMode::LINES) {
|
||||
geometryCache->renderWireShapeInstance(args, batch, GeometryCache::Quad, backgroundColor, pipeline);
|
||||
} else {
|
||||
geometryCache->renderSolidShapeInstance(args, batch, GeometryCache::Quad, backgroundColor, pipeline);
|
||||
}
|
||||
// FIXME: we want to use instanced rendering here, but if textAlpha < 1 and backgroundAlpha < 1, the transparency sorting will be wrong
|
||||
//render::ShapePipelinePointer pipeline = geometryCache->getShapePipelinePointer(backgroundColor.a < 1.0f, _unlit,
|
||||
// renderLayer != RenderLayer::WORLD || args->_renderMethod == Args::RenderMethod::FORWARD);
|
||||
//if (render::ShapeKey(args->_globalShapeKey).isWireframe() || primitiveMode == PrimitiveMode::LINES) {
|
||||
// geometryCache->renderWireShapeInstance(args, batch, GeometryCache::Quad, backgroundColor, pipeline);
|
||||
//} else {
|
||||
// geometryCache->renderSolidShapeInstance(args, batch, GeometryCache::Quad, backgroundColor, pipeline);
|
||||
//}
|
||||
|
||||
geometryCache->renderQuad(batch, glm::vec2(-0.5), glm::vec2(0.5), backgroundColor, _geometryID);
|
||||
|
||||
const int TRIANBLES_PER_QUAD = 2;
|
||||
args->_details._trianglesRendered += TRIANBLES_PER_QUAD;
|
||||
}
|
||||
|
||||
QSizeF TextEntityRenderer::textSize(const QString& text) const {
|
||||
|
@ -224,7 +245,6 @@ void TextEntityRenderer::onAddToSceneTyped(const TypedEntityPointer& entity) {
|
|||
render::Transaction transaction;
|
||||
transaction.resetItem(_textRenderID, renderPayload);
|
||||
AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction);
|
||||
updateTextRenderItem();
|
||||
}
|
||||
|
||||
void TextEntityRenderer::onRemoveFromSceneTyped(const TypedEntityPointer& entity) {
|
||||
|
@ -295,6 +315,9 @@ ShapeKey entities::TextPayload::getShapeKey() const {
|
|||
if (textRenderable->isTextTransparent()) {
|
||||
builder.withTranslucent();
|
||||
}
|
||||
if (textRenderable->_unlit) {
|
||||
builder.withUnlit();
|
||||
}
|
||||
if (textRenderable->_primitiveMode == PrimitiveMode::LINES) {
|
||||
builder.withWireframe();
|
||||
}
|
||||
|
@ -355,7 +378,7 @@ void entities::TextPayload::render(RenderArgs* args) {
|
|||
batch.setModelTransform(modelTransform);
|
||||
|
||||
glm::vec2 bounds = glm::vec2(dimensions.x - (leftMargin + rightMargin), dimensions.y - (topMargin + bottomMargin));
|
||||
textRenderer->draw(batch, leftMargin / scale, -topMargin / scale, text, textColor, bounds / scale, forward);
|
||||
textRenderer->draw(batch, leftMargin / scale, -topMargin / scale, text, textColor, bounds / scale, textRenderable->_unlit, forward);
|
||||
}
|
||||
|
||||
namespace render {
|
||||
|
|
|
@ -26,6 +26,7 @@ class TextEntityRenderer : public TypedEntityRenderer<TextEntityItem> {
|
|||
using Pointer = std::shared_ptr<TextEntityRenderer>;
|
||||
public:
|
||||
TextEntityRenderer(const EntityItemPointer& entity);
|
||||
~TextEntityRenderer();
|
||||
|
||||
QSizeF textSize(const QString& text) const;
|
||||
|
||||
|
@ -35,7 +36,7 @@ protected:
|
|||
Item::Bound getBound() override;
|
||||
ShapeKey getShapeKey() override;
|
||||
ItemKey getKey() override;
|
||||
virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) override;
|
||||
virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) const override;
|
||||
|
||||
void onAddToSceneTyped(const TypedEntityPointer& entity) override;
|
||||
void onRemoveFromSceneTyped(const TypedEntityPointer& entity) override;
|
||||
|
@ -56,6 +57,7 @@ private:
|
|||
float _textAlpha;
|
||||
glm::vec3 _backgroundColor;
|
||||
float _backgroundAlpha;
|
||||
bool _unlit;
|
||||
|
||||
float _leftMargin;
|
||||
float _rightMargin;
|
||||
|
@ -65,6 +67,8 @@ private:
|
|||
BillboardMode _billboardMode;
|
||||
glm::vec3 _dimensions;
|
||||
|
||||
int _geometryID { 0 };
|
||||
|
||||
std::shared_ptr<TextPayload> _textPayload;
|
||||
render::ItemID _textRenderID;
|
||||
void updateTextRenderItem() const;
|
||||
|
|
|
@ -26,14 +26,14 @@ layout(location=3) in float _distanceFromCenter;
|
|||
|
||||
void main(void) {
|
||||
vec4 texel = texture(_texture, _texCoord);
|
||||
int frontCondition = 1 - 2 * int(gl_FrontFacing);
|
||||
float frontCondition = 2.0 * float(gl_FrontFacing) - 1.0;
|
||||
vec3 color = _color.rgb * texel.rgb;
|
||||
float alpha = texel.a * _color.a;
|
||||
|
||||
alpha *= mix(1.0, pow(1.0 - abs(_distanceFromCenter), 10.0), _polylineData.faceCameraGlow.y);
|
||||
|
||||
packDeferredFragmentTranslucent(
|
||||
float(frontCondition) * _normalWS,
|
||||
_normalWS * frontCondition,
|
||||
alpha,
|
||||
color,
|
||||
DEFAULT_ROUGHNESS);
|
||||
|
|
|
@ -527,6 +527,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
|
|||
CHECK_PROPERTY_CHANGE(PROP_RIGHT_MARGIN, rightMargin);
|
||||
CHECK_PROPERTY_CHANGE(PROP_TOP_MARGIN, topMargin);
|
||||
CHECK_PROPERTY_CHANGE(PROP_BOTTOM_MARGIN, bottomMargin);
|
||||
CHECK_PROPERTY_CHANGE(PROP_UNLIT, unlit);
|
||||
|
||||
// Zone
|
||||
changedProperties += _keyLight.getChangedProperties();
|
||||
|
@ -1284,6 +1285,8 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
|
|||
* @property {number} rightMargin=0.0 - The right margin, in meters.
|
||||
* @property {number} topMargin=0.0 - The top margin, in meters.
|
||||
* @property {number} bottomMargin=0.0 - The bottom margin, in meters.
|
||||
* @property {boolean} unlit=false - <code>true</code> if the entity should be unaffected by lighting. Otherwise, the text
|
||||
* is lit by the keylight and local lights.
|
||||
* @property {BillboardMode} billboardMode="none" - Whether the entity is billboarded to face the camera.
|
||||
* @property {boolean} faceCamera - <code>true</code> if <code>billboardMode</code> is <code>"yaw"</code>, <code>false</code>
|
||||
* if it isn't. Setting this property to <code>false</code> sets the <code>billboardMode</code> to <code>"none"</code>.
|
||||
|
@ -1723,6 +1726,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
|
|||
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RIGHT_MARGIN, rightMargin);
|
||||
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TOP_MARGIN, topMargin);
|
||||
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_BOTTOM_MARGIN, bottomMargin);
|
||||
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_UNLIT, unlit);
|
||||
}
|
||||
|
||||
// Zones only
|
||||
|
@ -2098,6 +2102,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool
|
|||
COPY_PROPERTY_FROM_QSCRIPTVALUE(rightMargin, float, setRightMargin);
|
||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(topMargin, float, setTopMargin);
|
||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(bottomMargin, float, setBottomMargin);
|
||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(unlit, bool, setUnlit);
|
||||
|
||||
// Zone
|
||||
_keyLight.copyFromScriptValue(object, _defaultSettings);
|
||||
|
@ -2381,6 +2386,7 @@ void EntityItemProperties::merge(const EntityItemProperties& other) {
|
|||
COPY_PROPERTY_IF_CHANGED(rightMargin);
|
||||
COPY_PROPERTY_IF_CHANGED(topMargin);
|
||||
COPY_PROPERTY_IF_CHANGED(bottomMargin);
|
||||
COPY_PROPERTY_IF_CHANGED(unlit);
|
||||
|
||||
// Zone
|
||||
_keyLight.merge(other._keyLight);
|
||||
|
@ -2739,6 +2745,7 @@ bool EntityItemProperties::getPropertyInfo(const QString& propertyName, EntityPr
|
|||
ADD_PROPERTY_TO_MAP(PROP_RIGHT_MARGIN, RightMargin, rightMargin, float);
|
||||
ADD_PROPERTY_TO_MAP(PROP_TOP_MARGIN, TopMargin, topMargin, float);
|
||||
ADD_PROPERTY_TO_MAP(PROP_BOTTOM_MARGIN, BottomMargin, bottomMargin, float);
|
||||
ADD_PROPERTY_TO_MAP(PROP_UNLIT, Unlit, unlit, bool);
|
||||
|
||||
// Zone
|
||||
{ // Keylight
|
||||
|
@ -3168,6 +3175,7 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy
|
|||
APPEND_ENTITY_PROPERTY(PROP_RIGHT_MARGIN, properties.getRightMargin());
|
||||
APPEND_ENTITY_PROPERTY(PROP_TOP_MARGIN, properties.getTopMargin());
|
||||
APPEND_ENTITY_PROPERTY(PROP_BOTTOM_MARGIN, properties.getBottomMargin());
|
||||
APPEND_ENTITY_PROPERTY(PROP_UNLIT, properties.getUnlit());
|
||||
}
|
||||
|
||||
if (properties.getType() == EntityTypes::Zone) {
|
||||
|
@ -3646,6 +3654,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
|
|||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RIGHT_MARGIN, float, setRightMargin);
|
||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TOP_MARGIN, float, setTopMargin);
|
||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BOTTOM_MARGIN, float, setBottomMargin);
|
||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_UNLIT, bool, setUnlit);
|
||||
}
|
||||
|
||||
if (properties.getType() == EntityTypes::Zone) {
|
||||
|
@ -4038,6 +4047,7 @@ void EntityItemProperties::markAllChanged() {
|
|||
_rightMarginChanged = true;
|
||||
_topMarginChanged = true;
|
||||
_bottomMarginChanged = true;
|
||||
_unlitChanged = true;
|
||||
|
||||
// Zone
|
||||
_keyLight.markAllChanged();
|
||||
|
@ -4627,6 +4637,9 @@ QList<QString> EntityItemProperties::listChangedProperties() {
|
|||
if (bottomMarginChanged()) {
|
||||
out += "bottomMargin";
|
||||
}
|
||||
if (unlitChanged()) {
|
||||
out += "unlit";
|
||||
}
|
||||
|
||||
// Zone
|
||||
getKeyLight().listChangedProperties(out);
|
||||
|
|
|
@ -314,6 +314,7 @@ public:
|
|||
DEFINE_PROPERTY_REF(PROP_RIGHT_MARGIN, RightMargin, rightMargin, float, TextEntityItem::DEFAULT_MARGIN);
|
||||
DEFINE_PROPERTY_REF(PROP_TOP_MARGIN, TopMargin, topMargin, float, TextEntityItem::DEFAULT_MARGIN);
|
||||
DEFINE_PROPERTY_REF(PROP_BOTTOM_MARGIN, BottomMargin, bottomMargin, float, TextEntityItem::DEFAULT_MARGIN);
|
||||
DEFINE_PROPERTY_REF(PROP_UNLIT, Unlit, unlit, bool, false);
|
||||
|
||||
// Zone
|
||||
DEFINE_PROPERTY_GROUP(KeyLight, keyLight, KeyLightPropertyGroup);
|
||||
|
|
|
@ -241,6 +241,7 @@ enum EntityPropertyList {
|
|||
PROP_RIGHT_MARGIN = PROP_DERIVED_7,
|
||||
PROP_TOP_MARGIN = PROP_DERIVED_8,
|
||||
PROP_BOTTOM_MARGIN = PROP_DERIVED_9,
|
||||
PROP_UNLIT = PROP_DERIVED_10,
|
||||
|
||||
// Zone
|
||||
// Keylight
|
||||
|
|
|
@ -64,6 +64,7 @@ EntityItemProperties TextEntityItem::getProperties(const EntityPropertyFlags& de
|
|||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(rightMargin, getRightMargin);
|
||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(topMargin, getTopMargin);
|
||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(bottomMargin, getBottomMargin);
|
||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(unlit, getUnlit);
|
||||
return properties;
|
||||
}
|
||||
|
||||
|
@ -87,6 +88,7 @@ bool TextEntityItem::setProperties(const EntityItemProperties& properties) {
|
|||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(rightMargin, setRightMargin);
|
||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(topMargin, setTopMargin);
|
||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(bottomMargin, setBottomMargin);
|
||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(unlit, setUnlit);
|
||||
|
||||
if (somethingChanged) {
|
||||
bool wantDebug = false;
|
||||
|
@ -129,7 +131,8 @@ int TextEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
|
|||
READ_ENTITY_PROPERTY(PROP_RIGHT_MARGIN, float, setRightMargin);
|
||||
READ_ENTITY_PROPERTY(PROP_TOP_MARGIN, float, setTopMargin);
|
||||
READ_ENTITY_PROPERTY(PROP_BOTTOM_MARGIN, float, setBottomMargin);
|
||||
|
||||
READ_ENTITY_PROPERTY(PROP_UNLIT, bool, setUnlit);
|
||||
|
||||
return bytesRead;
|
||||
}
|
||||
|
||||
|
@ -149,6 +152,7 @@ EntityPropertyFlags TextEntityItem::getEntityProperties(EncodeBitstreamParams& p
|
|||
requestedProperties += PROP_RIGHT_MARGIN;
|
||||
requestedProperties += PROP_TOP_MARGIN;
|
||||
requestedProperties += PROP_BOTTOM_MARGIN;
|
||||
requestedProperties += PROP_UNLIT;
|
||||
|
||||
return requestedProperties;
|
||||
}
|
||||
|
@ -179,6 +183,7 @@ void TextEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits
|
|||
APPEND_ENTITY_PROPERTY(PROP_RIGHT_MARGIN, getRightMargin());
|
||||
APPEND_ENTITY_PROPERTY(PROP_TOP_MARGIN, getTopMargin());
|
||||
APPEND_ENTITY_PROPERTY(PROP_BOTTOM_MARGIN, getBottomMargin());
|
||||
APPEND_ENTITY_PROPERTY(PROP_UNLIT, getUnlit());
|
||||
}
|
||||
|
||||
glm::vec3 TextEntityItem::getRaycastDimensions() const {
|
||||
|
@ -382,6 +387,18 @@ float TextEntityItem::getBottomMargin() const {
|
|||
});
|
||||
}
|
||||
|
||||
void TextEntityItem::setUnlit(bool value) {
|
||||
withWriteLock([&] {
|
||||
_unlit = value;
|
||||
});
|
||||
}
|
||||
|
||||
bool TextEntityItem::getUnlit() const {
|
||||
return resultWithReadLock<bool>([&] {
|
||||
return _unlit;
|
||||
});
|
||||
}
|
||||
|
||||
PulsePropertyGroup TextEntityItem::getPulseProperties() const {
|
||||
return resultWithReadLock<PulsePropertyGroup>([&] {
|
||||
return _pulseProperties;
|
||||
|
|
|
@ -97,6 +97,9 @@ public:
|
|||
float getBottomMargin() const;
|
||||
void setBottomMargin(float value);
|
||||
|
||||
bool getUnlit() const;
|
||||
void setUnlit(bool value);
|
||||
|
||||
PulsePropertyGroup getPulseProperties() const;
|
||||
|
||||
private:
|
||||
|
@ -113,6 +116,7 @@ private:
|
|||
float _rightMargin;
|
||||
float _topMargin;
|
||||
float _bottomMargin;
|
||||
bool _unlit;
|
||||
};
|
||||
|
||||
#endif // hifi_TextEntityItem_h
|
||||
|
|
|
@ -271,6 +271,7 @@ enum class EntityVersion : PacketVersion {
|
|||
ParticleShapeType,
|
||||
ParticleShapeTypeDeadlockFix,
|
||||
PrivateUserData,
|
||||
TextUnlit,
|
||||
|
||||
// Add new versions above here
|
||||
NUM_PACKET_TYPE,
|
||||
|
|
|
@ -722,42 +722,12 @@ gpu::ShaderPointer GeometryCache::_forwardUnlitShader;
|
|||
gpu::ShaderPointer GeometryCache::_forwardSimpleFadeShader;
|
||||
gpu::ShaderPointer GeometryCache::_forwardUnlitFadeShader;
|
||||
|
||||
render::ShapePipelinePointer GeometryCache::_simpleOpaquePipeline;
|
||||
render::ShapePipelinePointer GeometryCache::_simpleTransparentPipeline;
|
||||
render::ShapePipelinePointer GeometryCache::_forwardSimpleOpaquePipeline;
|
||||
render::ShapePipelinePointer GeometryCache::_forwardSimpleTransparentPipeline;
|
||||
render::ShapePipelinePointer GeometryCache::_simpleOpaqueFadePipeline;
|
||||
render::ShapePipelinePointer GeometryCache::_simpleTransparentFadePipeline;
|
||||
render::ShapePipelinePointer GeometryCache::_simpleWirePipeline;
|
||||
|
||||
uint8_t GeometryCache::CUSTOM_PIPELINE_NUMBER = 0;
|
||||
|
||||
render::ShapePipelinePointer GeometryCache::shapePipelineFactory(const render::ShapePlumber& plumber, const render::ShapeKey& key, gpu::Batch& batch) {
|
||||
initializeShapePipelines();
|
||||
|
||||
if (key.isWireframe()) {
|
||||
return _simpleWirePipeline;
|
||||
}
|
||||
|
||||
if (key.isFaded()) {
|
||||
if (key.isTranslucent()) {
|
||||
return _simpleTransparentFadePipeline;
|
||||
} else {
|
||||
return _simpleOpaqueFadePipeline;
|
||||
}
|
||||
} else {
|
||||
if (key.isTranslucent()) {
|
||||
return _simpleTransparentPipeline;
|
||||
} else {
|
||||
return _simpleOpaquePipeline;
|
||||
}
|
||||
}
|
||||
}
|
||||
std::map<std::tuple<bool, bool, bool>, render::ShapePipelinePointer> GeometryCache::_shapePipelines;
|
||||
|
||||
GeometryCache::GeometryCache() :
|
||||
_nextID(0) {
|
||||
// Let's register its special shapePipeline factory:
|
||||
registerShapePipeline();
|
||||
initializeShapePipelines();
|
||||
buildShapes();
|
||||
}
|
||||
|
||||
|
@ -799,16 +769,14 @@ void GeometryCache::releaseID(int id) {
|
|||
}
|
||||
|
||||
void GeometryCache::initializeShapePipelines() {
|
||||
if (!_simpleOpaquePipeline) {
|
||||
_simpleOpaquePipeline = getShapePipeline(false, false, true, false);
|
||||
_simpleTransparentPipeline = getShapePipeline(false, true, true, false);
|
||||
_forwardSimpleOpaquePipeline = getShapePipeline(false, false, true, false, false, true);
|
||||
_forwardSimpleTransparentPipeline = getShapePipeline(false, true, true, false, false, true);
|
||||
|
||||
// FIXME: these need forward pipelines
|
||||
_simpleOpaqueFadePipeline = getFadingShapePipeline(false, false, false, false, false);
|
||||
_simpleTransparentFadePipeline = getFadingShapePipeline(false, true, false, false, false);
|
||||
_simpleWirePipeline = getShapePipeline(false, false, true, true);
|
||||
if (_shapePipelines.empty()) {
|
||||
const int NUM_PIPELINES = 8;
|
||||
for (int i = 0; i < NUM_PIPELINES; ++i) {
|
||||
bool transparent = i & 1;
|
||||
bool unlit = i & 2;
|
||||
bool forward = i & 4;
|
||||
_shapePipelines[std::make_tuple(transparent, unlit, forward)] = getShapePipeline(false, transparent, true, unlit, false, forward);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1027,7 +995,7 @@ void GeometryCache::updateVertices(int id, const QVector<glm::vec2>& points, con
|
|||
int* colorData = new int[details.vertices];
|
||||
int* colorDataAt = colorData;
|
||||
|
||||
const glm::vec3 NORMAL(0.0f, 1.0f, 0.0f);
|
||||
const glm::vec3 NORMAL(0.0f, -1.0f, 0.0f);
|
||||
auto pointCount = points.size();
|
||||
auto colorCount = colors.size();
|
||||
int compactColor = 0;
|
||||
|
@ -1105,7 +1073,7 @@ void GeometryCache::updateVertices(int id, const QVector<glm::vec3>& points, con
|
|||
int* colorData = new int[details.vertices];
|
||||
int* colorDataAt = colorData;
|
||||
|
||||
const glm::vec3 NORMAL(0.0f, 1.0f, 0.0f);
|
||||
const glm::vec3 NORMAL(0.0f, -1.0f, 0.0f);
|
||||
auto pointCount = points.size();
|
||||
auto colorCount = colors.size();
|
||||
for (auto i = 0; i < pointCount; i++) {
|
||||
|
@ -1193,7 +1161,7 @@ void GeometryCache::updateVertices(int id, const QVector<glm::vec3>& points, con
|
|||
int* colorData = new int[details.vertices];
|
||||
int* colorDataAt = colorData;
|
||||
|
||||
const glm::vec3 NORMAL(0.0f, 1.0f, 0.0f);
|
||||
const glm::vec3 NORMAL(0.0f, -1.0f, 0.0f);
|
||||
for (int i = 0; i < points.size(); i++) {
|
||||
glm::vec3 point = points[i];
|
||||
glm::vec2 texCoord = texCoords[i];
|
||||
|
@ -2281,8 +2249,7 @@ void renderInstances(RenderArgs* args, gpu::Batch& batch, const glm::vec4& color
|
|||
|
||||
if (isWire) {
|
||||
DependencyManager::get<GeometryCache>()->renderWireShapeInstances(batch, shape, data.count(), data.buffers[INSTANCE_COLOR_BUFFER]);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
DependencyManager::get<GeometryCache>()->renderShapeInstances(batch, shape, data.count(), data.buffers[INSTANCE_COLOR_BUFFER]);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -157,14 +157,6 @@ public:
|
|||
|
||||
static void computeSimpleHullPointListForShape(int entityShape, const glm::vec3 &entityExtents, QVector<glm::vec3> &outPointList);
|
||||
|
||||
static uint8_t CUSTOM_PIPELINE_NUMBER;
|
||||
static render::ShapePipelinePointer shapePipelineFactory(const render::ShapePlumber& plumber, const render::ShapeKey& key, gpu::Batch& batch);
|
||||
static void registerShapePipeline() {
|
||||
if (!CUSTOM_PIPELINE_NUMBER) {
|
||||
CUSTOM_PIPELINE_NUMBER = render::ShapePipeline::registerCustomShapePipelineFactory(shapePipelineFactory);
|
||||
}
|
||||
}
|
||||
|
||||
int allocateID() { return _nextID++; }
|
||||
void releaseID(int id);
|
||||
static const int UNKNOWN_ID;
|
||||
|
@ -180,11 +172,7 @@ public:
|
|||
gpu::PipelinePointer getWebBrowserProgram(bool transparent);
|
||||
|
||||
static void initializeShapePipelines();
|
||||
|
||||
render::ShapePipelinePointer getOpaqueShapePipeline() { assert(_simpleOpaquePipeline != nullptr); return _simpleOpaquePipeline; }
|
||||
render::ShapePipelinePointer getTransparentShapePipeline() { assert(_simpleTransparentPipeline != nullptr); return _simpleTransparentPipeline; }
|
||||
render::ShapePipelinePointer getForwardOpaqueShapePipeline() { assert(_forwardSimpleOpaquePipeline != nullptr); return _forwardSimpleOpaquePipeline; }
|
||||
render::ShapePipelinePointer getForwardTransparentShapePipeline() { assert(_forwardSimpleTransparentPipeline != nullptr); return _forwardSimpleTransparentPipeline; }
|
||||
render::ShapePipelinePointer getShapePipelinePointer(bool transparent, bool unlit, bool forward) { return _shapePipelines[std::make_tuple(transparent, unlit, forward)]; }
|
||||
|
||||
// Static (instanced) geometry
|
||||
void renderShapeInstances(gpu::Batch& batch, Shape shape, size_t count, gpu::BufferPointer& colorBuffer);
|
||||
|
@ -195,17 +183,17 @@ public:
|
|||
void renderWireFadeShapeInstances(gpu::Batch& batch, Shape shape, size_t count, gpu::BufferPointer& colorBuffer,
|
||||
gpu::BufferPointer& fadeBuffer1, gpu::BufferPointer& fadeBuffer2, gpu::BufferPointer& fadeBuffer3);
|
||||
|
||||
void renderSolidShapeInstance(RenderArgs* args, gpu::Batch& batch, Shape shape, const glm::vec4& color = glm::vec4(1),
|
||||
const render::ShapePipelinePointer& pipeline = _simpleOpaquePipeline);
|
||||
void renderSolidShapeInstance(RenderArgs* args, gpu::Batch& batch, Shape shape, const glm::vec4& color,
|
||||
const render::ShapePipelinePointer& pipeline);
|
||||
void renderSolidShapeInstance(RenderArgs* args, gpu::Batch& batch, Shape shape, const glm::vec3& color,
|
||||
const render::ShapePipelinePointer& pipeline = _simpleOpaquePipeline) {
|
||||
const render::ShapePipelinePointer& pipeline) {
|
||||
renderSolidShapeInstance(args, batch, shape, glm::vec4(color, 1.0f), pipeline);
|
||||
}
|
||||
|
||||
void renderWireShapeInstance(RenderArgs* args, gpu::Batch& batch, Shape shape, const glm::vec4& color = glm::vec4(1),
|
||||
const render::ShapePipelinePointer& pipeline = _simpleOpaquePipeline);
|
||||
void renderWireShapeInstance(RenderArgs* args, gpu::Batch& batch, Shape shape, const glm::vec4& color,
|
||||
const render::ShapePipelinePointer& pipeline);
|
||||
void renderWireShapeInstance(RenderArgs* args, gpu::Batch& batch, Shape shape, const glm::vec3& color,
|
||||
const render::ShapePipelinePointer& pipeline = _simpleOpaquePipeline) {
|
||||
const render::ShapePipelinePointer& pipeline) {
|
||||
renderWireShapeInstance(args, batch, shape, glm::vec4(color, 1.0f), pipeline);
|
||||
}
|
||||
|
||||
|
@ -217,33 +205,33 @@ public:
|
|||
const render::ShapePipelinePointer& pipeline);
|
||||
|
||||
void renderSolidSphereInstance(RenderArgs* args, gpu::Batch& batch, const glm::vec4& color,
|
||||
const render::ShapePipelinePointer& pipeline = _simpleOpaquePipeline);
|
||||
const render::ShapePipelinePointer& pipeline);
|
||||
void renderSolidSphereInstance(RenderArgs* args, gpu::Batch& batch, const glm::vec3& color,
|
||||
const render::ShapePipelinePointer& pipeline = _simpleOpaquePipeline) {
|
||||
const render::ShapePipelinePointer& pipeline) {
|
||||
renderSolidSphereInstance(args, batch, glm::vec4(color, 1.0f), pipeline);
|
||||
}
|
||||
|
||||
|
||||
void renderWireSphereInstance(RenderArgs* args, gpu::Batch& batch, const glm::vec4& color,
|
||||
const render::ShapePipelinePointer& pipeline = _simpleWirePipeline);
|
||||
const render::ShapePipelinePointer& pipeline);
|
||||
void renderWireSphereInstance(RenderArgs* args, gpu::Batch& batch, const glm::vec3& color,
|
||||
const render::ShapePipelinePointer& pipeline = _simpleWirePipeline) {
|
||||
const render::ShapePipelinePointer& pipeline) {
|
||||
renderWireSphereInstance(args, batch, glm::vec4(color, 1.0f), pipeline);
|
||||
}
|
||||
|
||||
|
||||
void renderSolidCubeInstance(RenderArgs* args, gpu::Batch& batch, const glm::vec4& color,
|
||||
const render::ShapePipelinePointer& pipeline = _simpleOpaquePipeline);
|
||||
const render::ShapePipelinePointer& pipeline);
|
||||
void renderSolidCubeInstance(RenderArgs* args, gpu::Batch& batch, const glm::vec3& color,
|
||||
const render::ShapePipelinePointer& pipeline = _simpleOpaquePipeline) {
|
||||
const render::ShapePipelinePointer& pipeline) {
|
||||
renderSolidCubeInstance(args, batch, glm::vec4(color, 1.0f), pipeline);
|
||||
}
|
||||
|
||||
|
||||
void renderWireCubeInstance(RenderArgs* args, gpu::Batch& batch, const glm::vec4& color,
|
||||
const render::ShapePipelinePointer& pipeline = _simpleWirePipeline);
|
||||
const render::ShapePipelinePointer& pipeline);
|
||||
void renderWireCubeInstance(RenderArgs* args, gpu::Batch& batch, const glm::vec3& color,
|
||||
const render::ShapePipelinePointer& pipeline = _simpleWirePipeline) {
|
||||
const render::ShapePipelinePointer& pipeline) {
|
||||
renderWireCubeInstance(args, batch, glm::vec4(color, 1.0f), pipeline);
|
||||
}
|
||||
|
||||
|
||||
// Dynamic geometry
|
||||
void renderShape(gpu::Batch& batch, Shape shape);
|
||||
void renderWireShape(gpu::Batch& batch, Shape shape);
|
||||
|
@ -467,14 +455,7 @@ private:
|
|||
static gpu::ShaderPointer _forwardSimpleFadeShader;
|
||||
static gpu::ShaderPointer _forwardUnlitFadeShader;
|
||||
|
||||
static render::ShapePipelinePointer _simpleOpaquePipeline;
|
||||
static render::ShapePipelinePointer _simpleTransparentPipeline;
|
||||
static render::ShapePipelinePointer _forwardSimpleOpaquePipeline;
|
||||
static render::ShapePipelinePointer _forwardSimpleTransparentPipeline;
|
||||
static render::ShapePipelinePointer _simpleOpaqueFadePipeline;
|
||||
static render::ShapePipelinePointer _simpleTransparentFadePipeline;
|
||||
static render::ShapePipelinePointer _simpleWirePipeline;
|
||||
|
||||
static std::map<std::tuple<bool, bool, bool>, render::ShapePipelinePointer> _shapePipelines;
|
||||
static QHash<SimpleProgramKey, gpu::PipelinePointer> _simplePrograms;
|
||||
|
||||
gpu::ShaderPointer _simpleOpaqueWebBrowserShader;
|
||||
|
|
|
@ -67,11 +67,11 @@ float TextRenderer3D::getFontSize() const {
|
|||
}
|
||||
|
||||
void TextRenderer3D::draw(gpu::Batch& batch, float x, float y, const QString& str, const glm::vec4& color,
|
||||
const glm::vec2& bounds, bool forward) {
|
||||
const glm::vec2& bounds, bool unlit, bool forward) {
|
||||
// The font does all the OpenGL work
|
||||
if (_font) {
|
||||
_color = color;
|
||||
_font->drawString(batch, _drawInfo, str, _color, _effectType, { x, y }, bounds, forward);
|
||||
_font->drawString(batch, _drawInfo, str, _color, _effectType, { x, y }, bounds, unlit, forward);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ public:
|
|||
float getFontSize() const; // Pixel size
|
||||
|
||||
void draw(gpu::Batch& batch, float x, float y, const QString& str, const glm::vec4& color,
|
||||
const glm::vec2& bounds, bool forward);
|
||||
const glm::vec2& bounds, bool unlit, bool forward);
|
||||
|
||||
private:
|
||||
TextRenderer3D(const char* family, float pointSize, int weight = -1, bool italic = false,
|
||||
|
|
|
@ -52,7 +52,7 @@ void main(void) {
|
|||
1.0,
|
||||
DEFAULT_OCCLUSION,
|
||||
fragPosition,
|
||||
normal,
|
||||
normal * (2.0 * float(gl_FrontFacing) - 1.0),
|
||||
diffuse,
|
||||
DEFAULT_FRESNEL,
|
||||
length(specular),
|
||||
|
|
|
@ -49,7 +49,7 @@ void main(void) {
|
|||
1.0,
|
||||
DEFAULT_OCCLUSION,
|
||||
fragPosition,
|
||||
normalize(_normalWS),
|
||||
normalize(_normalWS) * (2.0 * float(gl_FrontFacing) - 1.0),
|
||||
albedo,
|
||||
fresnel,
|
||||
metallic,
|
||||
|
|
|
@ -50,7 +50,7 @@ void main(void) {
|
|||
1.0,
|
||||
DEFAULT_OCCLUSION,
|
||||
fragPosition,
|
||||
normalize(_normalWS),
|
||||
normalize(_normalWS) * (2.0 * float(gl_FrontFacing) - 1.0),
|
||||
albedo,
|
||||
fresnel,
|
||||
metallic,
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
VERTEX sdf_text3D
|
|
@ -0,0 +1 @@
|
|||
VERTEX sdf_text3D
|
|
@ -1 +0,0 @@
|
|||
VERTEX sdf_text3D
|
|
@ -0,0 +1 @@
|
|||
VERTEX sdf_text3D
|
|
@ -1,7 +1,7 @@
|
|||
<@include gpu/Config.slh@>
|
||||
<$VERSION_HEADER$>
|
||||
// Generated on <$_SCRIBE_DATE$>
|
||||
// sdf_text3D_transparent.frag
|
||||
// sdf_text3D_forward.frag
|
||||
// fragment shader
|
||||
//
|
||||
// Created by Bradley Austin Davis on 2015-02-04
|
||||
|
@ -53,5 +53,5 @@ void main() {
|
|||
DEFAULT_FRESNEL,
|
||||
DEFAULT_METALLIC,
|
||||
DEFAULT_ROUGHNESS),
|
||||
1.0);
|
||||
alpha);
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
<@include gpu/Config.slh@>
|
||||
<$VERSION_HEADER$>
|
||||
// Generated on <$_SCRIBE_DATE$>
|
||||
// sdf_text3D_transparent.frag
|
||||
// sdf_text3D_translucent.frag
|
||||
// fragment shader
|
||||
//
|
||||
// Created by Bradley Austin Davis on 2015-02-04
|
||||
|
@ -12,8 +12,8 @@
|
|||
|
||||
<@include DefaultMaterials.slh@>
|
||||
|
||||
<@include ForwardGlobalLight.slh@>
|
||||
<$declareEvalGlobalLightingAlphaBlended()$>
|
||||
<@include DeferredGlobalLight.slh@>
|
||||
<$declareEvalGlobalLightingAlphaBlendedWithHaze()$>
|
||||
|
||||
<@include gpu/Transform.slh@>
|
||||
<$declareStandardCameraTransform()$>
|
38
libraries/render-utils/src/sdf_text3D_translucent_unlit.slf
Normal file
38
libraries/render-utils/src/sdf_text3D_translucent_unlit.slf
Normal file
|
@ -0,0 +1,38 @@
|
|||
<@include gpu/Config.slh@>
|
||||
<$VERSION_HEADER$>
|
||||
// Generated on <$_SCRIBE_DATE$>
|
||||
// sdf_text3D_translucent.frag
|
||||
// fragment shader
|
||||
//
|
||||
// Created by Bradley Austin Davis on 2015-02-04
|
||||
// Based on fragment shader code from
|
||||
// https://github.com/paulhoux/Cinder-Samples/blob/master/TextRendering/include/text/Text.cpp
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
|
||||
<@include DefaultMaterials.slh@>
|
||||
|
||||
<@include LightingModel.slh@>
|
||||
|
||||
<@include render-utils/ShaderConstants.h@>
|
||||
|
||||
<@include sdf_text3D.slh@>
|
||||
<$declareEvalSDFSuperSampled()$>
|
||||
|
||||
layout(location=RENDER_UTILS_ATTR_COLOR) in vec4 _color;
|
||||
layout(location=RENDER_UTILS_ATTR_TEXCOORD01) in vec4 _texCoord01;
|
||||
#define _texCoord0 _texCoord01.xy
|
||||
#define _texCoord1 _texCoord01.zw
|
||||
|
||||
layout(location=0) out vec4 _fragColor0;
|
||||
|
||||
void main() {
|
||||
float a = evalSDFSuperSampled(_texCoord0);
|
||||
|
||||
float alpha = a * _color.a;
|
||||
if (alpha <= 0.0) {
|
||||
discard;
|
||||
}
|
||||
|
||||
_fragColor0 = vec4(_color.rgb * isUnlitEnabled(), alpha);
|
||||
}
|
32
libraries/render-utils/src/sdf_text3D_unlit.slf
Normal file
32
libraries/render-utils/src/sdf_text3D_unlit.slf
Normal file
|
@ -0,0 +1,32 @@
|
|||
<@include gpu/Config.slh@>
|
||||
<$VERSION_HEADER$>
|
||||
// Generated on <$_SCRIBE_DATE$>
|
||||
// sdf_text3D_unlit.frag
|
||||
// fragment shader
|
||||
//
|
||||
// Created by Bradley Austin Davis on 2015-02-04
|
||||
// Based on fragment shader code from
|
||||
// https://github.com/paulhoux/Cinder-Samples/blob/master/TextRendering/include/text/Text.cpp
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
|
||||
<@include DeferredBufferWrite.slh@>
|
||||
<@include render-utils/ShaderConstants.h@>
|
||||
|
||||
<@include sdf_text3D.slh@>
|
||||
<$declareEvalSDFSuperSampled()$>
|
||||
|
||||
layout(location=RENDER_UTILS_ATTR_NORMAL_WS) in vec3 _normalWS;
|
||||
layout(location=RENDER_UTILS_ATTR_COLOR) in vec4 _color;
|
||||
layout(location=RENDER_UTILS_ATTR_TEXCOORD01) in vec4 _texCoord01;
|
||||
#define _texCoord0 _texCoord01.xy
|
||||
#define _texCoord1 _texCoord01.zw
|
||||
|
||||
void main() {
|
||||
float a = evalSDFSuperSampled(_texCoord0);
|
||||
|
||||
packDeferredFragmentUnlit(
|
||||
normalize(_normalWS),
|
||||
a,
|
||||
_color.rgb);
|
||||
}
|
|
@ -60,7 +60,7 @@ float getProceduralFragmentWithPosition(inout ProceduralFragmentWithPosition pro
|
|||
|
||||
#line 2030
|
||||
void main(void) {
|
||||
vec3 normal = normalize(_normalWS.xyz);
|
||||
vec3 normal = normalize(_normalWS.xyz) * (2.0 * float(gl_FrontFacing) - 1.0);
|
||||
vec3 diffuse = _color.rgb;
|
||||
float roughness = DEFAULT_ROUGHNESS;
|
||||
float metallic = DEFAULT_METALLIC;
|
||||
|
|
|
@ -33,7 +33,7 @@ void main(void) {
|
|||
texel.rgb *= _color.rgb;
|
||||
|
||||
packDeferredFragment(
|
||||
normalize(_normalWS),
|
||||
normalize(_normalWS) * (2.0 * float(gl_FrontFacing) - 1.0),
|
||||
1.0,
|
||||
texel.rgb,
|
||||
DEFAULT_ROUGHNESS,
|
||||
|
|
|
@ -48,13 +48,13 @@ void main(void) {
|
|||
const float ALPHA_THRESHOLD = 0.999;
|
||||
if (texel.a < ALPHA_THRESHOLD) {
|
||||
packDeferredFragmentTranslucent(
|
||||
normalize(_normalWS),
|
||||
normalize(_normalWS) * (2.0 * float(gl_FrontFacing) - 1.0),
|
||||
texel.a,
|
||||
texel.rgb + fadeEmissive,
|
||||
DEFAULT_ROUGHNESS);
|
||||
} else {
|
||||
packDeferredFragment(
|
||||
normalize(_normalWS),
|
||||
normalize(_normalWS) * (2.0 * float(gl_FrontFacing) - 1.0),
|
||||
1.0,
|
||||
texel.rgb,
|
||||
DEFAULT_ROUGHNESS,
|
||||
|
|
|
@ -36,13 +36,13 @@ void main(void) {
|
|||
const float ALPHA_THRESHOLD = 0.999;
|
||||
if (texel.a < ALPHA_THRESHOLD) {
|
||||
packDeferredFragmentTranslucent(
|
||||
normalize(_normalWS),
|
||||
normalize(_normalWS) * (2.0 * float(gl_FrontFacing) - 1.0),
|
||||
texel.a,
|
||||
texel.rgb,
|
||||
DEFAULT_ROUGHNESS);
|
||||
} else {
|
||||
packDeferredFragmentUnlit(
|
||||
normalize(_normalWS),
|
||||
normalize(_normalWS) * (2.0 * float(gl_FrontFacing) - 1.0),
|
||||
1.0,
|
||||
texel.rgb);
|
||||
}
|
||||
|
|
|
@ -48,13 +48,13 @@ void main(void) {
|
|||
const float ALPHA_THRESHOLD = 0.999;
|
||||
if (texel.a < ALPHA_THRESHOLD) {
|
||||
packDeferredFragmentTranslucent(
|
||||
normalize(_normalWS),
|
||||
normalize(_normalWS) * (2.0 * float(gl_FrontFacing) - 1.0),
|
||||
texel.a,
|
||||
texel.rgb + fadeEmissive,
|
||||
DEFAULT_ROUGHNESS);
|
||||
} else {
|
||||
packDeferredFragmentUnlit(
|
||||
normalize(_normalWS),
|
||||
normalize(_normalWS) * (2.0 * float(gl_FrontFacing) - 1.0),
|
||||
1.0,
|
||||
texel.rgb + fadeEmissive);
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@ float getProceduralFragmentWithPosition(inout ProceduralFragmentWithPosition pro
|
|||
|
||||
#line 2030
|
||||
void main(void) {
|
||||
vec3 normal = normalize(_normalWS.xyz);
|
||||
vec3 normal = normalize(_normalWS.xyz) * (2.0 * float(gl_FrontFacing) - 1.0);
|
||||
vec3 diffuse = _color.rgb;
|
||||
float alpha = _color.a;
|
||||
float occlusion = DEFAULT_OCCLUSION;
|
||||
|
|
|
@ -50,7 +50,7 @@ void main(void) {
|
|||
1.0,
|
||||
DEFAULT_OCCLUSION,
|
||||
fragPosition,
|
||||
normalize(_normalWS),
|
||||
normalize(_normalWS) * (2.0 * float(gl_FrontFacing) - 1.0),
|
||||
albedo,
|
||||
fresnel,
|
||||
metallic,
|
||||
|
|
|
@ -52,7 +52,7 @@ void main(void) {
|
|||
texel.a *= abs(_color.a);
|
||||
|
||||
vec3 fragPosition = _positionES.xyz;
|
||||
vec3 fragNormal = normalize(_normalWS);
|
||||
vec3 fragNormal = normalize(_normalWS) * (2.0 * float(gl_FrontFacing) - 1.0);
|
||||
|
||||
TransformCamera cam = getTransformCamera();
|
||||
|
||||
|
|
|
@ -15,9 +15,7 @@
|
|||
|
||||
static std::mutex fontMutex;
|
||||
|
||||
gpu::PipelinePointer Font::_deferredPipeline;
|
||||
gpu::PipelinePointer Font::_forwardPipeline;
|
||||
gpu::PipelinePointer Font::_transparentPipeline;
|
||||
std::map<std::tuple<bool, bool, bool>, gpu::PipelinePointer> Font::_pipelines;
|
||||
gpu::Stream::FormatPointer Font::_format;
|
||||
|
||||
struct TextureVertex {
|
||||
|
@ -221,31 +219,28 @@ void Font::read(QIODevice& in) {
|
|||
}
|
||||
|
||||
void Font::setupGPU() {
|
||||
if (!_deferredPipeline) {
|
||||
// Setup render pipeline
|
||||
{
|
||||
{
|
||||
auto state = std::make_shared<gpu::State>();
|
||||
state->setCullMode(gpu::State::CULL_BACK);
|
||||
state->setDepthTest(true, true, gpu::LESS_EQUAL);
|
||||
state->setBlendFunction(false,
|
||||
gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA,
|
||||
gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE);
|
||||
PrepareStencil::testMaskDrawShape(*state);
|
||||
_deferredPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(shader::render_utils::program::sdf_text3D), state);
|
||||
_forwardPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(shader::render_utils::program::forward_sdf_text3D), state);
|
||||
}
|
||||
if (_pipelines.empty()) {
|
||||
using namespace shader::render_utils::program;
|
||||
|
||||
{
|
||||
auto state = std::make_shared<gpu::State>();
|
||||
state->setCullMode(gpu::State::CULL_BACK);
|
||||
state->setDepthTest(true, true, gpu::LESS_EQUAL);
|
||||
state->setBlendFunction(true,
|
||||
gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA,
|
||||
gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE);
|
||||
static const std::vector<std::tuple<bool, bool, bool, uint32_t>> keys = {
|
||||
std::make_tuple(false, false, false, sdf_text3D), std::make_tuple(true, false, false, sdf_text3D_translucent),
|
||||
std::make_tuple(false, true, false, sdf_text3D_unlit), std::make_tuple(true, true, false, sdf_text3D_translucent_unlit),
|
||||
std::make_tuple(false, false, true, sdf_text3D_forward), std::make_tuple(true, false, true, sdf_text3D_forward/*sdf_text3D_translucent_forward*/),
|
||||
std::make_tuple(false, true, true, sdf_text3D_translucent_unlit/*sdf_text3D_unlit_forward*/), std::make_tuple(true, true, true, sdf_text3D_translucent_unlit/*sdf_text3D_translucent_unlit_forward*/)
|
||||
};
|
||||
for (auto& key : keys) {
|
||||
auto state = std::make_shared<gpu::State>();
|
||||
state->setCullMode(gpu::State::CULL_BACK);
|
||||
state->setDepthTest(true, true, gpu::LESS_EQUAL);
|
||||
state->setBlendFunction(std::get<0>(key),
|
||||
gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA,
|
||||
gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE);
|
||||
if (std::get<0>(key)) {
|
||||
PrepareStencil::testMask(*state);
|
||||
_transparentPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(shader::render_utils::program::sdf_text3D_transparent), state);
|
||||
} else {
|
||||
PrepareStencil::testMaskDrawShape(*state);
|
||||
}
|
||||
_pipelines[std::make_tuple(std::get<0>(key), std::get<1>(key), std::get<2>(key))] = gpu::Pipeline::create(gpu::Shader::createProgram(std::get<3>(key)), state);
|
||||
}
|
||||
|
||||
// Sanity checks
|
||||
|
@ -349,7 +344,7 @@ void Font::buildVertices(Font::DrawInfo& drawInfo, const QString& str, const glm
|
|||
}
|
||||
|
||||
void Font::drawString(gpu::Batch& batch, Font::DrawInfo& drawInfo, const QString& str, const glm::vec4& color,
|
||||
EffectType effectType, const glm::vec2& origin, const glm::vec2& bounds, bool forward) {
|
||||
EffectType effectType, const glm::vec2& origin, const glm::vec2& bounds, bool unlit, bool forward) {
|
||||
if (str == "") {
|
||||
return;
|
||||
}
|
||||
|
@ -376,7 +371,7 @@ void Font::drawString(gpu::Batch& batch, Font::DrawInfo& drawInfo, const QString
|
|||
}
|
||||
// need the gamma corrected color here
|
||||
|
||||
batch.setPipeline(color.a < 1.0f ? _transparentPipeline : (forward ? _forwardPipeline : _deferredPipeline));
|
||||
batch.setPipeline(_pipelines[std::make_tuple(color.a < 1.0f, unlit, forward)]);
|
||||
batch.setInputFormat(_format);
|
||||
batch.setInputBuffer(0, drawInfo.verticesBuffer, 0, _format->getChannels().at(0)._stride);
|
||||
batch.setResourceTexture(render_utils::slot::texture::TextFont, _texture);
|
||||
|
|
|
@ -46,11 +46,10 @@ public:
|
|||
// Render string to batch
|
||||
void drawString(gpu::Batch& batch, DrawInfo& drawInfo, const QString& str,
|
||||
const glm::vec4& color, EffectType effectType,
|
||||
const glm::vec2& origin, const glm::vec2& bound, bool forward);
|
||||
const glm::vec2& origin, const glm::vec2& bound, bool unlit, bool forward);
|
||||
|
||||
static Pointer load(const QString& family);
|
||||
|
||||
|
||||
private:
|
||||
static Pointer load(QIODevice& fontFile);
|
||||
QStringList tokenizeForWrapping(const QString& str) const;
|
||||
|
@ -80,9 +79,7 @@ private:
|
|||
gpu::TexturePointer _texture;
|
||||
gpu::BufferStreamPointer _stream;
|
||||
|
||||
static gpu::PipelinePointer _deferredPipeline;
|
||||
static gpu::PipelinePointer _forwardPipeline;
|
||||
static gpu::PipelinePointer _transparentPipeline;
|
||||
static std::map<std::tuple<bool, bool, bool>, gpu::PipelinePointer> _pipelines;
|
||||
static gpu::Stream::FormatPointer _format;
|
||||
};
|
||||
|
||||
|
|
|
@ -614,7 +614,7 @@ public:
|
|||
virtual ShapeKey getShapeKey() = 0;
|
||||
virtual Item::Bound getBound() = 0;
|
||||
virtual void render(RenderArgs* args) = 0;
|
||||
virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) = 0;
|
||||
virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) const = 0;
|
||||
};
|
||||
|
||||
template <> const ItemKey payloadGetKey(const PayloadProxyInterface::Pointer& payload);
|
||||
|
|
|
@ -39,6 +39,10 @@
|
|||
"leftMargin": {
|
||||
"tooltip": "The left margin, in meters."
|
||||
},
|
||||
"unlit": {
|
||||
"tooltip": "If enabled, the entity will not be lit by the keylight or local lights.",
|
||||
"jsPropertyName": "unlit"
|
||||
},
|
||||
"zoneShapeType": {
|
||||
"tooltip": "The shape of the volume in which the zone's lighting effects and avatar permissions have effect.",
|
||||
"jsPropertyName": "shapeType"
|
||||
|
@ -135,7 +139,7 @@
|
|||
"tooltip": "The radius of bloom. The higher the value, the larger the bloom."
|
||||
},
|
||||
"avatarPriority": {
|
||||
"tooltip": "Alter Avatars' update priorities."
|
||||
"tooltip": "Alter Avatars' update priorities."
|
||||
},
|
||||
"modelURL": {
|
||||
"tooltip": "A mesh model from an FBX or OBJ file."
|
||||
|
|
|
@ -216,6 +216,11 @@ const GROUPS = [
|
|||
decimals: 2,
|
||||
propertyID: "leftMargin",
|
||||
},
|
||||
{
|
||||
label: "Unlit",
|
||||
type: "bool",
|
||||
propertyID: "unlit",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
|
@ -39,6 +39,10 @@
|
|||
"leftMargin": {
|
||||
"tooltip": "The left margin, in meters."
|
||||
},
|
||||
"unlit": {
|
||||
"tooltip": "If enabled, the entity will not be lit by the keylight or local lights.",
|
||||
"jsPropertyName": "unlit"
|
||||
},
|
||||
"zoneShapeType": {
|
||||
"tooltip": "The shape of the volume in which the zone's lighting effects and avatar permissions have effect.",
|
||||
"jsPropertyName": "shapeType"
|
||||
|
@ -135,7 +139,7 @@
|
|||
"tooltip": "The radius of bloom. The higher the value, the larger the bloom."
|
||||
},
|
||||
"avatarPriority": {
|
||||
"tooltip": "Alter Avatars' update priorities."
|
||||
"tooltip": "Alter Avatars' update priorities."
|
||||
},
|
||||
"modelURL": {
|
||||
"tooltip": "A mesh model from an FBX or OBJ file."
|
||||
|
|
|
@ -216,6 +216,11 @@ const GROUPS = [
|
|||
decimals: 2,
|
||||
propertyID: "leftMargin",
|
||||
},
|
||||
{
|
||||
label: "Unlit",
|
||||
type: "bool",
|
||||
propertyID: "unlit",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
|
@ -66,7 +66,6 @@ def getExtensionsHeader(dialect, variant, extensions):
|
|||
extensionsHeaderMutex.release()
|
||||
return extensionHeader
|
||||
|
||||
|
||||
def getDialectAndVariantHeaders(dialect, variant, extensions=None):
|
||||
result = []
|
||||
headerPath = args.source_dir + '/libraries/shaders/headers/'
|
||||
|
@ -80,6 +79,14 @@ def getDialectAndVariantHeaders(dialect, variant, extensions=None):
|
|||
result.append(variantHeader)
|
||||
return result
|
||||
|
||||
def getDefines(defines):
|
||||
definesList = []
|
||||
if defines:
|
||||
definesSplit = defines.split("_")
|
||||
for define in definesSplit:
|
||||
definesList.append('HIFI_USE_{} 1'.format(define.upper()))
|
||||
return definesList
|
||||
|
||||
class ScribeDependenciesCache:
|
||||
cache = {}
|
||||
lock = Lock()
|
||||
|
@ -99,9 +106,9 @@ class ScribeDependenciesCache:
|
|||
with open(self.filename, "w") as f:
|
||||
f.write(json.dumps(self.cache))
|
||||
|
||||
def get(self, scribefile, dialect, variant):
|
||||
def get(self, scribefile, dialect, variant, defines):
|
||||
self.lock.acquire()
|
||||
key = self.key(scribefile, dialect, variant)
|
||||
key = self.key(scribefile, dialect, variant, defines)
|
||||
try:
|
||||
if key in self.cache:
|
||||
return self.cache[key].copy()
|
||||
|
@ -109,25 +116,26 @@ class ScribeDependenciesCache:
|
|||
self.lock.release()
|
||||
return None
|
||||
|
||||
def key(self, scribeFile, dialect, variant):
|
||||
return ':'.join([scribeFile, dialect, variant])
|
||||
def key(self, scribeFile, dialect, variant, defines):
|
||||
return ':'.join([scribeFile, dialect, variant, defines])
|
||||
|
||||
def getOrGen(self, scribefile, includeLibs, dialect, variant):
|
||||
result = self.get(scribefile, dialect, variant)
|
||||
if (None == result):
|
||||
result = self.gen(scribefile, includeLibs, dialect, variant)
|
||||
def getOrGen(self, scribefile, includeLibs, dialect, variant, defines):
|
||||
result = self.get(scribefile, dialect, variant, defines)
|
||||
if result is None:
|
||||
result = self.gen(scribefile, includeLibs, dialect, variant, defines)
|
||||
return result
|
||||
|
||||
def gen(self, scribefile, includeLibs, dialect, variant):
|
||||
def gen(self, scribefile, includeLibs, dialect, variant, defines):
|
||||
scribeArgs = getCommonScribeArgs(scribefile, includeLibs)
|
||||
scribeArgs.extend(['-M'])
|
||||
processResult = subprocess.run(scribeArgs, stdout=subprocess.PIPE)
|
||||
if (0 != processResult.returncode):
|
||||
raise RuntimeError("Unable to parse scribe dependencies")
|
||||
raise RuntimeError("Unable to parse scribe dependencies for file {} with defines: {}".format(scribefile, defines))
|
||||
result = processResult.stdout.decode("utf-8").splitlines(False)
|
||||
result.append(scribefile)
|
||||
result.extend(getDialectAndVariantHeaders(dialect, variant))
|
||||
key = self.key(scribefile, dialect, variant)
|
||||
result.extend(getDefines(defines))
|
||||
key = self.key(scribefile, dialect, variant, defines)
|
||||
self.lock.acquire()
|
||||
self.cache[key] = result.copy()
|
||||
self.lock.release()
|
||||
|
@ -166,6 +174,10 @@ def processCommand(line):
|
|||
variant = params.pop(0)
|
||||
scribeFile = args.source_dir + '/' + params.pop(0)
|
||||
unoptGlslFile = args.source_dir + '/' + params.pop(0)
|
||||
defines = ""
|
||||
if len(params) > 1 and params[0].startswith("defines:"):
|
||||
defines = params.pop(0)
|
||||
defines = defines[len("defines:"):]
|
||||
libs = params
|
||||
|
||||
upoptSpirvFile = unoptGlslFile + '.spv'
|
||||
|
@ -184,19 +196,23 @@ def processCommand(line):
|
|||
os.makedirs(scribeOutputDir)
|
||||
folderMutex.release()
|
||||
|
||||
scribeDeps = scribeDepCache.getOrGen(scribeFile, libs, dialect, variant)
|
||||
scribeDeps = scribeDepCache.getOrGen(scribeFile, libs, dialect, variant, defines)
|
||||
|
||||
# if the scribe sources (slv, slf, slh, etc), or the dialect/ variant headers are out of date
|
||||
# regenerate the scribe GLSL output
|
||||
if args.force or outOfDate(scribeDeps, outputFiles):
|
||||
print('Processing file {} dialect {} variant {}'.format(scribeFile, dialect, variant))
|
||||
print('Processing file {} dialect {} variant {} defines {}'.format(scribeFile, dialect, variant, defines))
|
||||
if args.dry_run:
|
||||
return True
|
||||
|
||||
scribeDepCache.gen(scribeFile, libs, dialect, variant)
|
||||
scribeDepCache.gen(scribeFile, libs, dialect, variant, defines)
|
||||
scribeArgs = getCommonScribeArgs(scribeFile, libs)
|
||||
for header in getDialectAndVariantHeaders(dialect, variant, args.extensions):
|
||||
scribeArgs.extend(['-H', header])
|
||||
for define in getDefines(defines):
|
||||
defineArgs = ['-D']
|
||||
defineArgs.extend(define.split(' '))
|
||||
scribeArgs.extend(defineArgs)
|
||||
scribeArgs.extend(['-o', unoptGlslFile])
|
||||
executeSubprocess(scribeArgs)
|
||||
|
||||
|
|
Loading…
Reference in a new issue