// Copyright (c) 2021 HTC
//
// SPDX-License-Identifier: CC-BY-4.0

include::{generated}/meta/XR_HTC_facial_tracking.adoc[]

*Last Modified Date*::
    2021-12-16
*IP Status*::
    No known IP claims.
*Contributors*::
    Kyle Chen, HTC +
    Chris Kuo


*Overview*

This extension allows an application to track and integrate users' eye and
lip movements, empowering developers to read intention and model facial
expressions.

*Inspect system capability*
[open,refpage='XrSystemFacialTrackingPropertiesHTC',type='structs',desc='System property for facial tracking',xrefs='']
--

slink:XrSystemFacialTrackingPropertiesHTC is defined as:

include::{generated}/api/structs/XrSystemFacialTrackingPropertiesHTC.adoc[]

.Member Descriptions
****
* pname:type is the elink:XrStructureType of this structure.
* pname:next is code:NULL or a pointer to the next structure in a structure
  chain.
  No such structures are defined in core OpenXR or this extension.
* pname:supportEyeFacialTracking indicates if the current system is capable
  of generating eye expressions.
* pname:supportLipFacialTracking indicates if the current system is capable
  of generating lip expressions.
****

An application can: inspect whether the system is capable of two of the
facial tracking by extending the slink:XrSystemProperties with
slink:XrSystemFacialTrackingPropertiesHTC structure when calling
flink:xrGetSystemProperties.

include::{generated}/validity/structs/XrSystemFacialTrackingPropertiesHTC.adoc[]

If a runtime returns ename:XR_FALSE for pname:supportEyeFacialTracking, the
runtime must: return ename:XR_ERROR_FEATURE_UNSUPPORTED from
flink:xrCreateFacialTrackerHTC with
ename:XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC set for
elink:XrFacialTrackingTypeHTC in slink:XrFacialTrackerCreateInfoHTC.
Similarly, if a runtime returns ename:XR_FALSE for
pname:supportLipFacialTracking the runtime must: return
ename:XR_ERROR_FEATURE_UNSUPPORTED from flink:xrCreateFacialTrackerHTC with
ename:XR_FACIAL_TRACKING_TYPE_LIP_DEFAULT_HTC set for
elink:XrFacialTrackingTypeHTC in slink:XrFacialTrackerCreateInfoHTC.

--

*Create a facial tracker handle*

[open,refpage='XrFacialTrackerHTC',type='handles',desc='Represents a tracker for a facial tracking.']
--
The slink:XrFacialTrackerHTC handle represents the resources for an facial
tracker of the specific facial tracking type.

include::{generated}/api/handles/XrFacialTrackerHTC.adoc[]

An application creates separate slink:XrFacialTrackerHTC handles for eye
tracker or lip tracker.
This handle can be used to retrieve corresponding facial expressions using
flink:xrGetFacialExpressionsHTC function.
--

[open,refpage='xrCreateFacialTrackerHTC',type='protos',desc='Create an facial tracker handle.',xrefs='XrFacialTrackerHTC xrDestroyFacialTrackerHTC']
--
The flink:xrCreateFacialTrackerHTC function is defined as

include::{generated}/api/protos/xrCreateFacialTrackerHTC.adoc[]

.Parameter Descriptions
****
* pname:session is an slink:XrSession in which the facial expression will be
  active.
* pname:createInfo is the slink:XrFacialTrackerCreateInfoHTC used to specify
  the facial tracking type.
* pname:facialTracker is the returned slink:XrFacialTrackerHTC handle.
****

An application can: create an slink:XrFacialTrackerHTC handle using
flink:xrCreateFacialTrackerHTC.

If the system does not support eye tracking or lip tracking, runtime must:
return ename:XR_ERROR_FEATURE_UNSUPPORTED from
flink:xrCreateFacialTrackerHTC according to the corresponding case.
In this case, the runtime must: return ename:XR_FALSE for
slink:XrSystemFacialTrackingPropertiesHTC::pname:supportEyeFacialTracking or
slink:XrSystemFacialTrackingPropertiesHTC::pname:supportLipFacialTracking
when the function flink:xrGetSystemProperties is called, so that the
application may: avoid creating a facial tracker.

include::{generated}/validity/protos/xrCreateFacialTrackerHTC.adoc[]

--

[open,refpage='XrFacialTrackerCreateInfoHTC',type='structs',desc='Information to create a facial tracker handle',xrefs='']
--
The slink:XrFacialTrackerCreateInfoHTC structure is defined as:

include::{generated}/api/structs/XrFacialTrackerCreateInfoHTC.adoc[]

.Member Descriptions
****
* pname:type is the elink:XrStructureType of this structure.
* pname:next is code:NULL or a pointer to the next structure in a structure
  chain.
  No such structures are defined in core OpenXR or this extension.
* pname:facialTrackingType is an elink:XrFacialTrackingTypeHTC which
  describes which type of facial tracking should be used for this handle.
****

The slink:XrFacialTrackerCreateInfoHTC structure describes the information
to create an slink:XrFacialTrackerHTC handle.

include::{generated}/validity/structs/XrFacialTrackerCreateInfoHTC.adoc[]
--

[open,refpage='XrFacialTrackingTypeHTC',type='enums',desc='Describes the type of facial tracking.',xrefs='']
--
The elink:XrFacialTrackingTypeHTC describes which type of tracking the
slink:XrFacialTrackerHTC is using.

include::{generated}/api/enums/XrFacialTrackingTypeHTC.adoc[]

include::{generated}/api/enums/XrFacialTrackingTypeHTC.comments-box.adoc[]
--

[open,refpage='xrDestroyFacialTrackerHTC',type='protos',desc='Destroy a facial tracker handle',xrefs='']
--
The flink:xrDestroyFacialTrackerHTC function is defined as:

include::{generated}/api/protos/xrDestroyFacialTrackerHTC.adoc[]

.Parameter Descriptions
****
* pname:facialTracker is an slink:XrFacialTrackerHTC previously created by
  flink:xrCreateFacialTrackerHTC.
****

flink:xrDestroyFacialTrackerHTC releases the pname:facialTracker and the
underlying resources when finished with facial tracking experiences.

include::{generated}/validity/protos/xrDestroyFacialTrackerHTC.adoc[]
--

*Retrieve facial expressions*

[open,refpage='xrGetFacialExpressionsHTC',type='protos',desc='Retrieve facial expressions',xrefs='']
--
The flink:xrGetFacialExpressionsHTC function is defined as:

include::{generated}/api/protos/xrGetFacialExpressionsHTC.adoc[]

.Parameter Descriptions
****
* pname:facialTracker is an slink:XrFacialTrackerHTC previously created by
  flink:xrCreateFacialTrackerHTC.
* pname:facialExpressions is a pointer to slink:XrFacialExpressionsHTC
  receiving the returned facial expressions.
****

flink:xrGetFacialExpressionsHTC retrieves an array of values of blend shapes
for a facial expression on a given time.

include::{generated}/validity/protos/xrGetFacialExpressionsHTC.adoc[]
--

[open,refpage='XrFacialExpressionsHTC',type='structs',desc='Returns the expression data',xrefs='xrGetFacialExpressionsHTC']
--
The slink:XrFacialExpressionsHTC structure is defined as:

include::{generated}/api/structs/XrFacialExpressionsHTC.adoc[]

.Member Descriptions
****
* pname:type is the elink:XrStructureType of this structure.
* pname:next is code:NULL or a pointer to the next structure in a structure
  chain.
  No such structures are defined in core OpenXR or this extension.
* pname:isActive is an basetype:XrBool32 indicating if the facial tracker is
  active.
* pname:sampleTime is when in time the expression is expressed.
* pname:expressionCount is a code:uint32_t describing the count of elements
  in pname:expressionWeightings array.
* pname:expressionWeightings is a code:float array filled in by the runtime,
  specifying the weightings for each blend shape.
****

slink:XrFacialExpressionsHTC structure returns data of a lip facial
expression or an eye facial expression.

An application must: preallocate the output pname:expressionWeightings array
that can contain at least pname:expressionCount of code:float.
pname:expressionCount must: be at least
dlink:XR_FACIAL_EXPRESSION_LIP_COUNT_HTC for
ename:XR_FACIAL_TRACKING_TYPE_LIP_DEFAULT_HTC, and at least
dlink:XR_FACIAL_EXPRESSION_EYE_COUNT_HTC for
ename:XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC.

The application must: set pname:expressionCount as described by the
elink:XrFacialTrackingTypeHTC when creating the slink:XrFacialTrackerHTC
otherwise the runtime must: return ename:XR_ERROR_VALIDATION_FAILURE.

The runtime must: update the pname:expressionWeightings array ordered so
that the application can index elements using the corresponding facial
tracker enum (e.g. elink:XrEyeExpressionHTC or elink:XrLipExpressionHTC) as
described by elink:XrFacialTrackingTypeHTC when creating the
slink:XrFacialTrackerHTC.
For example, when the slink:XrFacialTrackerHTC is created with
slink:XrFacialTrackerHTC::pname:facialTrackingType set to
ename:XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC, the application must: set the
pname:expressionCount to dlink:XR_FACIAL_EXPRESSION_EYE_COUNT_HTC, and the
runtime must: fill the pname:expressionWeightings array ordered with eye
expression data so that it can be indexed by the elink:XrEyeExpressionHTC
enum.

If the returned pname:isActive is true, the runtime must: fill the
pname:expressionWeightings array ordered.

If the returned pname:isActive is false, it indicates the facial tracker did
not detect the corresponding facial input or the application lost input
focus.

If the input pname:expressionCount is not sufficient to contain all output
indices, the runtime must: return ename:XR_ERROR_SIZE_INSUFFICIENT on calls
to flink:xrGetFacialExpressionsHTC and not change the content in
pname:expressionWeightings.

include::{generated}/validity/structs/XrFacialExpressionsHTC.adoc[]
--

[open,refpage='XR_FACIAL_EXPRESSION_EYE_COUNT_HTC',type='defines',desc='The number of blend shapes in an expression of type XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC',xrefs='XrFacialExpressionsHTC']
--
include::{generated}/api/defines/XR_FACIAL_EXPRESSION_EYE_COUNT_HTC.adoc[]

The number of blend shapes in an expression of type
ename:XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC.
--

[open,refpage='XR_FACIAL_EXPRESSION_LIP_COUNT_HTC',type='defines',desc='The number of blend shapes in an expression of type XR_FACIAL_TRACKING_TYPE_LIP_DEFAULT_HTC',xrefs='XrFacialExpressionsHTC']
--
include::{generated}/api/defines/XR_FACIAL_EXPRESSION_LIP_COUNT_HTC.adoc[]

The number of blend shapes in an expression of type
ename:XR_FACIAL_TRACKING_TYPE_LIP_DEFAULT_HTC.
--

*Facial Expression List*

* *Eye Blend Shapes*

Through feeding the blend shape values of eye expression to an avatar, its
facial expression can be animated with the player's eye movement.
The following pictures show how the facial expression acts on the avatar
according to each set of eye blend shape values.

[open,refpage='XrEyeExpressionHTC',type='enums',desc='The blend shapes of eye expression',xrefs='']
--
include::{generated}/api/enums/XrEyeExpressionHTC.adoc[]
--

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_LEFT_WIDE_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_LEFT_WIDE_HTC.png[width=210]| **Description** +
This blend shape keeps left eye wide and at that time
ename:XR_EYE_EXPRESSION_LEFT_BLINK_HTC value is 0.
|====
[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_RIGHT_WIDE_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_RIGHT_WIDE_HTC.png[width=210]| **Description** +
This blend shape keeps right eye wide and at that time
ename:XR_EYE_EXPRESSION_RIGHT_BLINK_HTC value is 0.
|====

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_LEFT_BLINK_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_LEFT_BLINK_HTC.png[width=210]| **Description** +
This blend shape influences blinking of the right eye. When this value
goes higher, left eye approaches close.
|====

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_RIGHT_BLINK_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_RIGHT_BLINK_HTC.png[width=210]| **Description** +
This blend shape influences blinking of the right eye. When this value
goes higher, right eye approaches close.
|====

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_LEFT_SQUEEZE_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_LEFT_SQUEEZE_HTC.png[width=210]| **Description** +
The blend shape closes eye tightly and at that time
ename:XR_EYE_EXPRESSION_LEFT_BLINK_HTC value is 1.
|====

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_RIGHT_SQUEEZE_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_RIGHT_SQUEEZE_HTC.png[width=210]| **Description** +
The blend shape closes eye tightly and at that time
ename:XR_EYE_EXPRESSION_RIGHT_BLINK_HTC value is 1.
|====

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_LEFT_DOWN_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_LEFT_DOWN.png[width=210]| **Description** +
This blendShape influences the muscles around the left eye,
moving these muscles further downward with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_RIGHT_DOWN_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_RIGHT_DOWN.png[width=210]| **Description** +
This blendShape influences the muscles around the right eye,
moving these muscles further downward with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_LEFT_OUT_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_LEFT_LEFT.png[width=210]| **Description** +
This blendShape influences the muscles around the left eye,
moving these muscles further leftward with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_RIGHT_IN_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_RIGHT_LEFT.png[width=210]| **Description** +
This blendShape influences the muscles around the right eye,
moving these muscles further leftward with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_LEFT_IN_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_LEFT_RIGHT.png[width=210]| **Description** +
This blendShape influences the muscles around the left eye,
moving these muscles further rightward with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_RIGHT_OUT_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_RIGHT_RIGHT.png[width=210]| **Description** +
This blendShape influences the muscles around the right eye,
moving these muscles further rightward with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_LEFT_UP_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_LEFT_UP.png[width=210]| **Description** +
This blendShape influences the muscles around the left eye,
moving these muscles further upward with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_EYE_EXPRESSION_RIGHT_UP_HTC
^.^a|image::images/XR_EYE_SHAPE_EYE_RIGHT_UP.png[width=210]| **Description** +
This blendShape influences the muscles around the right eye,
moving these muscles further upward with a higher value.
|====

* *Lip Blend Shapes*

Through feeding the blend shape values of lip expression to an avatar, its
facial expression can be animated with the player's lip movement.
The following pictures show how the facial expression acts on the avatar
according to each set of lip blend shape values.

[open,refpage='XrLipExpressionHTC',type='enums',desc='The blend shapes of lip expression',xrefs='']
--
include::{generated}/api/enums/XrLipExpressionHTC.adoc[]
--

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_JAW_LEFT_HTC
^.^a|image::images/XR_LIP_SHAPE_JAW_LEFT_HTC.png[width=210]| **Description** +
This blend shape moves the jaw further leftward with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_JAW_RIGHT_HTC
^.^a|image::images/XR_LIP_SHAPE_JAW_RIGHT_HTC.png[width=210]| **Description** +
This blend shape moves the jaw further rightward with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_JAW_FORWARD_HTC
^.^a|image::images/XR_LIP_SHAPE_JAW_FORWARD_HTC.png[width=210]| **Description** +
This blend shape moves the jaw forward with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_JAW_OPEN_HTC
^.^a|image::images/XR_LIP_SHAPE_JAW_OPEN_HTC.png[width=210]| **Description** +
This blend shape opens the mouth further with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_APE_SHAPE_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_APE_SHAPE_HTC.png[width=210]| **Description** +
This blend shape stretches the jaw further with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_UPPER_LEFT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_UPPER_LEFT_HTC.png[width=210]| **Description** +
This blend shape moves your upper lip leftward.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_UPPER_RIGHT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_UPPER_RIGHT_HTC.png[width=210]| **Description** +
This blend shape moves your upper lip rightward.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_LOWER_LEFT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_LOWER_LEFT_HTC.png[width=210]| **Description** +
This blend shape moves your lower lip leftward.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_LOWER_RIGHT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_LOWER_RIGHT_HTC.png[width=210]| **Description** +
This blend shape moves your lower lip rightward.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_UPPER_OVERTURN_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_UPPER_OVERTURN_HTC.png[width=210]| **Description** +
This blend shape pouts your upper lip.
Can be used with ename:XR_LIP_EXPRESSION_MOUTH_UPPER_UPRIGHT_HTC and
ename:XR_LIP_EXPRESSION_MOUTH_UPPER_UPLEFT_HTC to complete upper O mouth shape.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_LOWER_OVERTURN_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_LOWER_OVERTURN_HTC.png[width=210]| **Description** +
This blend shape pouts your lower lip.
Can be used with ename:XR_LIP_EXPRESSION_MOUTH_UPPER_UPRIGHT_HTC and
ename:XR_LIP_EXPRESSION_MOUTH_LOWER_DOWNRIGHT_HTC to complete upper O mouth shape.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_POUT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_POUT_HTC.png[width=210]| **Description** +
This blend shape allows the lips to pout more with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_SMILE_LEFT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_SMILE_LEFT_HTC.png[width=210]| **Description** +
This blend shape raises the left side of the mouth further with a
higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_SMILE_RIGHT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_SMILE_RIGHT_HTC.png[width=210]| **Description** +
This blend shape raises the right side of the mouth further with a
higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_SAD_LEFT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_SAD_LEFT_HTC.png[width=210]| **Description** +
This blend shape lowers the left side of the mouth further with a
higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_SAD_RIGHT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_SAD_RIGHT_HTC.png[width=210]| **Description** +
This blend shape lowers the right side of the mouth further with a
higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_CHEEK_PUFF_RIGHT_HTC
^.^a|image::images/XR_LIP_SHAPE_CHEEK_PUFF_RIGHT_HTC.png[width=210]| **Description** +
This blend shape puffs up the right side of the cheek further with a
higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_CHEEK_PUFF_LEFT_HTC
^.^a|image::images/XR_LIP_SHAPE_CHEEK_PUFF_LEFT_HTC.png[width=210]| **Description** +
This blend shape puffs up the left side of the cheek further with a
higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_CHEEK_SUCK_HTC
^.^a|image::images/XR_LIP_SHAPE_CHEEK_SUCK_HTC.png[width=210]| **Description** +
This blend shape sucks in the cheeks on both sides further with a
higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_UPPER_UPLEFT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_UPPER_UPLEFT_HTC.png[width=210]| **Description** +
This blend shape raises the left upper lip further with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_UPPER_UPRIGHT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_UPPER_UPRIGHT_HTC.png[width=210]| **Description** +
This blend shape raises the right upper lip further with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_LOWER_DOWNLEFT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_LOWER_DOWNLEFT_HTC.png[width=210]| **Description** +
This blend shape lowers the left lower lip further with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_LOWER_DOWNRIGHT_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_LOWER_DOWNRIGHT_HTC.png[width=210]| **Description** +
This blend shape lowers the right lower lip further with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_LOWER_INSIDE_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_LOWER_INSIDE_HTC.png[width=210]| **Description** +
This blend shape rolls in the lower lip further with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_UPPER_INSIDE_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_UPPER_INSIDE_HTC.png[width=210]| **Description** +
This blend shape rolls in the upper lip further with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_MOUTH_LOWER_OVERLAY_HTC
^.^a|image::images/XR_LIP_SHAPE_MOUTH_LOWER_OVERLAY_HTC.png[width=210]| **Description** +
This blend shape stretches the lower lip further and lays it on the
upper lip further with a higher value.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC
^.^a|image::images/XR_LIP_SHAPE_TONGUE_LONGSTEP1_HTC.png[width=210]| **Description** +
This blend shape sticks the tongue out slightly. +
In step 1 of extending the tongue, the main action of the tongue is
to lift up, and the elongated length only extends to a little bit
beyond the teeth.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC
^.^a|image::images/XR_LIP_SHAPE_TONGUE_LONGSTEP2_HTC.png[width=210]| **Description** +
This blend shape sticks the tongue out extremely. +
Continuing the step 1, it extends the tongue to the longest.
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_TONGUE_DOWN_HTC
^.^a|image::images/XR_LIP_SHAPE_TONGUE_DOWN_HTC.png[width=210]| **Description** +
This blend shape sticks the tongue out and down extremely. +
This example contains (ename:XR_LIP_EXPRESSION_TONGUE_DOWN_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC).
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_TONGUE_UP_HTC
^.^a|image::images/XR_LIP_SHAPE_TONGUE_UP_HTC.png[width=210]| **Description** +
This blend shape sticks the tongue out and up extremely. +
This example contains (ename:XR_LIP_EXPRESSION_TONGUE_UP_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC).
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_TONGUE_RIGHT_HTC
^.^a|image::images/XR_LIP_SHAPE_TONGUE_RIGHT_HTC.png[width=210]| **Description** +
This blend shape sticks the tongue out and right extremely. +
This example contains (ename:XR_LIP_EXPRESSION_TONGUE_RIGHT_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC).
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_TONGUE_LEFT_HTC
^.^a|image::images/XR_LIP_SHAPE_TONGUE_LEFT_HTC.png[width=210]| **Description** +
This blend shape sticks the tongue out and left extremely. +
This example contains (ename:XR_LIP_EXPRESSION_TONGUE_LEFT_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC).
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_TONGUE_ROLL_HTC
^.^a|image::images/XR_LIP_SHAPE_TONGUE_ROLL_HTC.png[width=210]| **Description** +
This blend shape sticks the tongue out with roll type. +
This example contains (ename:XR_LIP_EXPRESSION_TONGUE_ROLL_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC).
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_TONGUE_UPRIGHT_MORPH_HTC
^.^a|image::images/XR_LIP_SHAPE_TONGUE_UPRIGHT_MORPH_HTC_error.png[width=150]| **Description** +
This blend shape does not make sense.
When both the right and up blend shapes appear at the same time,
the tongue will be deformed. (ename:XR_LIP_EXPRESSION_TONGUE_RIGHT_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_UP_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC)
^.^a|image::images/XR_LIP_SHAPE_TONGUE_UPRIGHT_MORPH_HTC_correct.png[width=150]| **Description** +
This blend shape fixes the deformation illustrated above.
(ename:XR_LIP_EXPRESSION_TONGUE_RIGHT_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_UP_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC + ename:XR_LIP_EXPRESSION_TONGUE_UPRIGHT_MORPH_HTC)
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_TONGUE_UPLEFT_MORPH_HTC
^.^a|image::images/XR_LIP_SHAPE_TONGUE_UPLEFT_MORPH_HTC_error.png[width=150]| **Description** +
This blend shape does not make sense.
When both the left and up blend shapes appear at the same time,
the tongue will be deformed. (ename:XR_LIP_EXPRESSION_TONGUE_LEFT_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_UP_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC)
^.^a|image::images/XR_LIP_SHAPE_TONGUE_UPLEFT_MORPH_HTC_correct.png[width=150]| **Description** +
This blend shape fixes the deformation illustrated above.
(ename:XR_LIP_EXPRESSION_TONGUE_LEFT_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_UP_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC + ename:XR_LIP_EXPRESSION_TONGUE_UPLEFT_MORPH_HTC)
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_TONGUE_DOWNRIGHT_MORPH_HTC
^.^a|image::images/XR_LIP_SHAPE_TONGUE_DOWNRIGHT_MORPH_HTC_error.png[width=150]| **Description** +
This blend shape does not make sense.
When both the right and down blend shapes appear at the same time,
the tongue will be deformed. (ename:XR_LIP_EXPRESSION_TONGUE_RIGHT_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_DOWN_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC)
^.^a|image::images/XR_LIP_SHAPE_TONGUE_DOWNRIGHT_MORPH_HTC_correct.png[width=150]| **Description** +
This blend shape fixes the deformation illustrated above.
(ename:XR_LIP_EXPRESSION_TONGUE_RIGHT_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_DOWN_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC + ename:XR_LIP_EXPRESSION_TONGUE_DOWNRIGHT_MORPH_HTC)
|====

[width="80%",options="header"]
|====
2+|ename:XR_LIP_EXPRESSION_TONGUE_DOWNLEFT_MORPH_HTC
^.^a|image::images/XR_LIP_SHAPE_TONGUE_DOWNLEFT_MORPH_HTC_error.png[width=150]| **Description** +
This blend shape does not make sense.
When both the left and down blend shapes appear at the same time,
the tongue will be deformed. (ename:XR_LIP_EXPRESSION_TONGUE_LEFT_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_DOWN_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC)
^.^a|image::images/XR_LIP_SHAPE_TONGUE_DOWNLEFT_MORPH_HTC_correct.png[width=150]| **Description** +
This blend shape fixes the deformation illustrated above.
(ename:XR_LIP_EXPRESSION_TONGUE_LEFT_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_DOWN_HTC + ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC +
ename:XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC + ename:XR_LIP_EXPRESSION_TONGUE_DOWNLEFT_MORPH_HTC)
|====

[width="80%",options="header"]
|====
2+e|O shape
^.^a|image::images/o_shape.png[width=210]| **Description** +
The entire O-shaped mouth is formed by the combination of
6 blend shapes: +
(ename:XR_LIP_EXPRESSION_MOUTH_UPPER_OVERTURN_HTC +
ename:XR_LIP_EXPRESSION_MOUTH_LOWER_OVERTURN_HTC +
ename:XR_LIP_EXPRESSION_MOUTH_UPPER_UPLEFT_HTC +
ename:XR_LIP_EXPRESSION_MOUTH_UPPER_UPRIGHT_HTC +
ename:XR_LIP_EXPRESSION_MOUTH_LOWER_DOWNLEFT_HTC +
ename:XR_LIP_EXPRESSION_MOUTH_LOWER_DOWNRIGHT_HTC)
|====

*New Object Types*

* slink:XrFacialTrackerHTC

*New Flag Types*

*New Enum Constants*

elink:XrObjectType enumeration is extended with:

* ename:XR_OBJECT_TYPE_FACIAL_TRACKER_HTC

elink:XrStructureType enumeration is extended with:

* ename:XR_TYPE_SYSTEM_FACIAL_TRACKING_PROPERTIES_HTC
* ename:XR_TYPE_FACIAL_TRACKER_CREATE_INFO_HTC
* ename:XR_TYPE_FACIAL_EXPRESSIONS_HTC

*New Enums*

* elink:XrFacialTrackingTypeHTC
* elink:XrEyeExpressionHTC
* elink:XrLipExpressionHTC

*New Structures*

* slink:XrSystemFacialTrackingPropertiesHTC
* slink:XrFacialTrackerCreateInfoHTC
* slink:XrFacialExpressionsHTC

*New Functions*

* flink:xrCreateFacialTrackerHTC
* flink:xrDestroyFacialTrackerHTC
* flink:xrGetFacialExpressionsHTC

*Issues*

*Version History*

* Revision 1, 2021-12-16 (Kyle Chen)
** Initial extension description

* Revision 2, 2022-09-22 (Andy Chen)
** Correct the range of the blink blend shapes.
