diff --git a/docs/course_authors/source/Images/AI_ScoredResponse.gif b/docs/course_authors/source/Images/AI_ScoredResponse.gif new file mode 100644 index 0000000000..cdffaa4574 Binary files /dev/null and b/docs/course_authors/source/Images/AI_ScoredResponse.gif differ diff --git a/docs/course_authors/source/Images/AddNewComponent.gif b/docs/course_authors/source/Images/AddNewComponent.gif new file mode 100644 index 0000000000..24dfd2be2d Binary files /dev/null and b/docs/course_authors/source/Images/AddNewComponent.gif differ diff --git a/docs/course_authors/source/Images/AdditionalFeedback.gif b/docs/course_authors/source/Images/AdditionalFeedback.gif new file mode 100644 index 0000000000..a6895b0434 Binary files /dev/null and b/docs/course_authors/source/Images/AdditionalFeedback.gif differ diff --git a/docs/course_authors/source/Images/AdvSettings_After.gif b/docs/course_authors/source/Images/AdvSettings_After.gif new file mode 100644 index 0000000000..5ef07be886 Binary files /dev/null and b/docs/course_authors/source/Images/AdvSettings_After.gif differ diff --git a/docs/course_authors/source/Images/AdvSettings_Before.gif b/docs/course_authors/source/Images/AdvSettings_Before.gif new file mode 100644 index 0000000000..7207d38d68 Binary files /dev/null and b/docs/course_authors/source/Images/AdvSettings_Before.gif differ diff --git a/docs/course_authors/source/Images/AdvancedComponent.gif b/docs/course_authors/source/Images/AdvancedComponent.gif new file mode 100644 index 0000000000..c12f46c7da Binary files /dev/null and b/docs/course_authors/source/Images/AdvancedComponent.gif differ diff --git a/docs/course_authors/source/Images/AdvancedModulesEmpty.gif b/docs/course_authors/source/Images/AdvancedModulesEmpty.gif new file mode 100644 index 0000000000..b3919919dc Binary files /dev/null and b/docs/course_authors/source/Images/AdvancedModulesEmpty.gif differ diff --git a/docs/course_authors/source/Images/AdvancedSettings.gif b/docs/course_authors/source/Images/AdvancedSettings.gif new file mode 100644 index 0000000000..f6a7b2e3f3 Binary files /dev/null and b/docs/course_authors/source/Images/AdvancedSettings.gif differ diff --git a/docs/course_authors/source/Images/AnatomyOfExercise1.gif b/docs/course_authors/source/Images/AnatomyOfExercise1.gif new file mode 100644 index 0000000000..d5456f1783 Binary files /dev/null and b/docs/course_authors/source/Images/AnatomyOfExercise1.gif differ diff --git a/docs/course_authors/source/Images/AnatomyOfExercise2.gif b/docs/course_authors/source/Images/AnatomyOfExercise2.gif new file mode 100644 index 0000000000..bf5097dd9c Binary files /dev/null and b/docs/course_authors/source/Images/AnatomyOfExercise2.gif differ diff --git a/docs/course_authors/source/Images/AnatomyOfExercise3.gif b/docs/course_authors/source/Images/AnatomyOfExercise3.gif new file mode 100644 index 0000000000..557789f9da Binary files /dev/null and b/docs/course_authors/source/Images/AnatomyOfExercise3.gif differ diff --git a/docs/course_authors/source/Images/AnatomyofaProblem_Feedback.gif b/docs/course_authors/source/Images/AnatomyofaProblem_Feedback.gif new file mode 100644 index 0000000000..b033fe5076 Binary files /dev/null and b/docs/course_authors/source/Images/AnatomyofaProblem_Feedback.gif differ diff --git a/docs/course_authors/source/Images/Annotation.gif b/docs/course_authors/source/Images/Annotation.gif new file mode 100644 index 0000000000..e5c2ed41ca Binary files /dev/null and b/docs/course_authors/source/Images/Annotation.gif differ diff --git a/docs/course_authors/source/Images/AnnotationExample.gif b/docs/course_authors/source/Images/AnnotationExample.gif new file mode 100644 index 0000000000..e5c2ed41ca Binary files /dev/null and b/docs/course_authors/source/Images/AnnotationExample.gif differ diff --git a/docs/course_authors/source/Images/ChangesSaved.gif b/docs/course_authors/source/Images/ChangesSaved.gif new file mode 100644 index 0000000000..6da5a61092 Binary files /dev/null and b/docs/course_authors/source/Images/ChangesSaved.gif differ diff --git a/docs/course_authors/source/Images/Checkbox.gif b/docs/course_authors/source/Images/Checkbox.gif new file mode 100644 index 0000000000..fe5e7e0ccf Binary files /dev/null and b/docs/course_authors/source/Images/Checkbox.gif differ diff --git a/docs/course_authors/source/Images/CheckboxExample.gif b/docs/course_authors/source/Images/CheckboxExample.gif new file mode 100644 index 0000000000..fe5e7e0ccf Binary files /dev/null and b/docs/course_authors/source/Images/CheckboxExample.gif differ diff --git a/docs/course_authors/source/Images/CircuitSchematic.gif b/docs/course_authors/source/Images/CircuitSchematic.gif new file mode 100644 index 0000000000..29419fcabe Binary files /dev/null and b/docs/course_authors/source/Images/CircuitSchematic.gif differ diff --git a/docs/course_authors/source/Images/CircuitSchematicExample.gif b/docs/course_authors/source/Images/CircuitSchematicExample.gif new file mode 100644 index 0000000000..29419fcabe Binary files /dev/null and b/docs/course_authors/source/Images/CircuitSchematicExample.gif differ diff --git a/docs/course_authors/source/Images/DiscussionComponentEditor.png b/docs/course_authors/source/Images/DiscussionComponentEditor.png new file mode 100644 index 0000000000..b5dd53c979 Binary files /dev/null and b/docs/course_authors/source/Images/DiscussionComponentEditor.png differ diff --git a/docs/course_authors/source/Images/DiscussionComponent_Forum.png b/docs/course_authors/source/Images/DiscussionComponent_Forum.png new file mode 100644 index 0000000000..90dbaff7eb Binary files /dev/null and b/docs/course_authors/source/Images/DiscussionComponent_Forum.png differ diff --git a/docs/course_authors/source/Images/DiscussionComponent_LMS.png b/docs/course_authors/source/Images/DiscussionComponent_LMS.png new file mode 100644 index 0000000000..41a111890a Binary files /dev/null and b/docs/course_authors/source/Images/DiscussionComponent_LMS.png differ diff --git a/docs/course_authors/source/Images/DiscussionComponent_LMS_Ribbon.png b/docs/course_authors/source/Images/DiscussionComponent_LMS_Ribbon.png new file mode 100644 index 0000000000..b7d7226341 Binary files /dev/null and b/docs/course_authors/source/Images/DiscussionComponent_LMS_Ribbon.png differ diff --git a/docs/course_authors/source/Images/DragAndDrop.gif b/docs/course_authors/source/Images/DragAndDrop.gif new file mode 100644 index 0000000000..c9627c5e3b Binary files /dev/null and b/docs/course_authors/source/Images/DragAndDrop.gif differ diff --git a/docs/course_authors/source/Images/DragAndDropExample.gif b/docs/course_authors/source/Images/DragAndDropExample.gif new file mode 100644 index 0000000000..c9627c5e3b Binary files /dev/null and b/docs/course_authors/source/Images/DragAndDropExample.gif differ diff --git a/docs/course_authors/source/Images/Dropdown.gif b/docs/course_authors/source/Images/Dropdown.gif new file mode 100644 index 0000000000..f60a7d4386 Binary files /dev/null and b/docs/course_authors/source/Images/Dropdown.gif differ diff --git a/docs/course_authors/source/Images/DropdownExample.gif b/docs/course_authors/source/Images/DropdownExample.gif new file mode 100644 index 0000000000..f60a7d4386 Binary files /dev/null and b/docs/course_authors/source/Images/DropdownExample.gif differ diff --git a/docs/course_authors/source/Images/E3_1_1.gif b/docs/course_authors/source/Images/E3_1_1.gif new file mode 100644 index 0000000000..13f0e29af9 Binary files /dev/null and b/docs/course_authors/source/Images/E3_1_1.gif differ diff --git a/docs/course_authors/source/Images/E3_1_3.gif b/docs/course_authors/source/Images/E3_1_3.gif new file mode 100644 index 0000000000..7d53506495 Binary files /dev/null and b/docs/course_authors/source/Images/E3_1_3.gif differ diff --git a/docs/course_authors/source/Images/EditDiscussionComponent.png b/docs/course_authors/source/Images/EditDiscussionComponent.png new file mode 100644 index 0000000000..c192a7b534 Binary files /dev/null and b/docs/course_authors/source/Images/EditDiscussionComponent.png differ diff --git a/docs/course_authors/source/Images/FeedbackNotAvailable.gif b/docs/course_authors/source/Images/FeedbackNotAvailable.gif new file mode 100644 index 0000000000..048374dcd9 Binary files /dev/null and b/docs/course_authors/source/Images/FeedbackNotAvailable.gif differ diff --git a/docs/course_authors/source/Images/FetchingNextSubmission.gif b/docs/course_authors/source/Images/FetchingNextSubmission.gif new file mode 100644 index 0000000000..7a1e648739 Binary files /dev/null and b/docs/course_authors/source/Images/FetchingNextSubmission.gif differ diff --git a/docs/course_authors/source/Images/HTMLComponent_CreateLink.png b/docs/course_authors/source/Images/HTMLComponent_CreateLink.png new file mode 100644 index 0000000000..f8ec50f0a9 Binary files /dev/null and b/docs/course_authors/source/Images/HTMLComponent_CreateLink.png differ diff --git a/docs/course_authors/source/Images/HTMLComponent_Edit.png b/docs/course_authors/source/Images/HTMLComponent_Edit.png new file mode 100644 index 0000000000..9cede5ee16 Binary files /dev/null and b/docs/course_authors/source/Images/HTMLComponent_Edit.png differ diff --git a/docs/course_authors/source/Images/HTMLEditor.png b/docs/course_authors/source/Images/HTMLEditor.png new file mode 100644 index 0000000000..4dd26dfc3b Binary files /dev/null and b/docs/course_authors/source/Images/HTMLEditor.png differ diff --git a/docs/course_authors/source/Images/HTMLEditorTabs.png b/docs/course_authors/source/Images/HTMLEditorTabs.png new file mode 100644 index 0000000000..822819ca56 Binary files /dev/null and b/docs/course_authors/source/Images/HTMLEditorTabs.png differ diff --git a/docs/course_authors/source/Images/HTMLEditor_HTML.png b/docs/course_authors/source/Images/HTMLEditor_HTML.png new file mode 100644 index 0000000000..a3a6592350 Binary files /dev/null and b/docs/course_authors/source/Images/HTMLEditor_HTML.png differ diff --git a/docs/course_authors/source/Images/HTMLEditor_Visual.png b/docs/course_authors/source/Images/HTMLEditor_Visual.png new file mode 100644 index 0000000000..c8e72efc0a Binary files /dev/null and b/docs/course_authors/source/Images/HTMLEditor_Visual.png differ diff --git a/docs/course_authors/source/Images/HTML_Component_Type.png b/docs/course_authors/source/Images/HTML_Component_Type.png new file mode 100644 index 0000000000..5960c0958b Binary files /dev/null and b/docs/course_authors/source/Images/HTML_Component_Type.png differ diff --git a/docs/course_authors/source/Images/ImageMappedInput.gif b/docs/course_authors/source/Images/ImageMappedInput.gif new file mode 100644 index 0000000000..e90f2df167 Binary files /dev/null and b/docs/course_authors/source/Images/ImageMappedInput.gif differ diff --git a/docs/course_authors/source/Images/ImageMappedInputExample.gif b/docs/course_authors/source/Images/ImageMappedInputExample.gif new file mode 100644 index 0000000000..e90f2df167 Binary files /dev/null and b/docs/course_authors/source/Images/ImageMappedInputExample.gif differ diff --git a/docs/course_authors/source/Images/JavaScriptInputExample.gif b/docs/course_authors/source/Images/JavaScriptInputExample.gif new file mode 100644 index 0000000000..3848660898 Binary files /dev/null and b/docs/course_authors/source/Images/JavaScriptInputExample.gif differ diff --git a/docs/course_authors/source/Images/Latex_component.png b/docs/course_authors/source/Images/Latex_component.png new file mode 100644 index 0000000000..7700ccea80 Binary files /dev/null and b/docs/course_authors/source/Images/Latex_component.png differ diff --git a/docs/course_authors/source/Images/Math1.gif b/docs/course_authors/source/Images/Math1.gif new file mode 100644 index 0000000000..6b02b4fd76 Binary files /dev/null and b/docs/course_authors/source/Images/Math1.gif differ diff --git a/docs/course_authors/source/Images/Math2.gif b/docs/course_authors/source/Images/Math2.gif new file mode 100644 index 0000000000..b251505593 Binary files /dev/null and b/docs/course_authors/source/Images/Math2.gif differ diff --git a/docs/course_authors/source/Images/Math3.gif b/docs/course_authors/source/Images/Math3.gif new file mode 100644 index 0000000000..b0f2a92b1a Binary files /dev/null and b/docs/course_authors/source/Images/Math3.gif differ diff --git a/docs/course_authors/source/Images/Math4.gif b/docs/course_authors/source/Images/Math4.gif new file mode 100644 index 0000000000..5b9fcf966e Binary files /dev/null and b/docs/course_authors/source/Images/Math4.gif differ diff --git a/docs/course_authors/source/Images/Math5.gif b/docs/course_authors/source/Images/Math5.gif new file mode 100644 index 0000000000..ee99729a35 Binary files /dev/null and b/docs/course_authors/source/Images/Math5.gif differ diff --git a/docs/course_authors/source/Images/MathExpressionInput.gif b/docs/course_authors/source/Images/MathExpressionInput.gif new file mode 100644 index 0000000000..b50a5d4bc7 Binary files /dev/null and b/docs/course_authors/source/Images/MathExpressionInput.gif differ diff --git a/docs/course_authors/source/Images/MathExpressionInputExample.gif b/docs/course_authors/source/Images/MathExpressionInputExample.gif new file mode 100644 index 0000000000..b50a5d4bc7 Binary files /dev/null and b/docs/course_authors/source/Images/MathExpressionInputExample.gif differ diff --git a/docs/course_authors/source/Images/MultipleChoice.gif b/docs/course_authors/source/Images/MultipleChoice.gif new file mode 100644 index 0000000000..ca14a82232 Binary files /dev/null and b/docs/course_authors/source/Images/MultipleChoice.gif differ diff --git a/docs/course_authors/source/Images/MultipleChoiceExample.gif b/docs/course_authors/source/Images/MultipleChoiceExample.gif new file mode 100644 index 0000000000..ca14a82232 Binary files /dev/null and b/docs/course_authors/source/Images/MultipleChoiceExample.gif differ diff --git a/docs/course_authors/source/Images/MultipleChoice_AdvancedEditor.gif b/docs/course_authors/source/Images/MultipleChoice_AdvancedEditor.gif new file mode 100644 index 0000000000..cc5e156043 Binary files /dev/null and b/docs/course_authors/source/Images/MultipleChoice_AdvancedEditor.gif differ diff --git a/docs/course_authors/source/Images/MultipleChoice_SimpleEditor.gif b/docs/course_authors/source/Images/MultipleChoice_SimpleEditor.gif new file mode 100644 index 0000000000..79029e0126 Binary files /dev/null and b/docs/course_authors/source/Images/MultipleChoice_SimpleEditor.gif differ diff --git a/docs/course_authors/source/Images/NewComponent_Discussion.png b/docs/course_authors/source/Images/NewComponent_Discussion.png new file mode 100644 index 0000000000..6b88144393 Binary files /dev/null and b/docs/course_authors/source/Images/NewComponent_Discussion.png differ diff --git a/docs/course_authors/source/Images/NewComponent_HTML.png b/docs/course_authors/source/Images/NewComponent_HTML.png new file mode 100644 index 0000000000..60f914fb19 Binary files /dev/null and b/docs/course_authors/source/Images/NewComponent_HTML.png differ diff --git a/docs/course_authors/source/Images/NoMoreSubmissions.gif b/docs/course_authors/source/Images/NoMoreSubmissions.gif new file mode 100644 index 0000000000..32007b4213 Binary files /dev/null and b/docs/course_authors/source/Images/NoMoreSubmissions.gif differ diff --git a/docs/course_authors/source/Images/NumericalInput.gif b/docs/course_authors/source/Images/NumericalInput.gif new file mode 100644 index 0000000000..2a778b3a22 Binary files /dev/null and b/docs/course_authors/source/Images/NumericalInput.gif differ diff --git a/docs/course_authors/source/Images/NumericalInputExample.gif b/docs/course_authors/source/Images/NumericalInputExample.gif new file mode 100644 index 0000000000..d0aefdaa8b Binary files /dev/null and b/docs/course_authors/source/Images/NumericalInputExample.gif differ diff --git a/docs/course_authors/source/Images/ORA_Component.gif b/docs/course_authors/source/Images/ORA_Component.gif new file mode 100644 index 0000000000..3a52b3389c Binary files /dev/null and b/docs/course_authors/source/Images/ORA_Component.gif differ diff --git a/docs/course_authors/source/Images/ORA_Component_Editor.gif b/docs/course_authors/source/Images/ORA_Component_Editor.gif new file mode 100644 index 0000000000..07afaa51fe Binary files /dev/null and b/docs/course_authors/source/Images/ORA_Component_Editor.gif differ diff --git a/docs/course_authors/source/Images/ORA_DuplicateWarning.gif b/docs/course_authors/source/Images/ORA_DuplicateWarning.gif new file mode 100644 index 0000000000..90cb07ce8d Binary files /dev/null and b/docs/course_authors/source/Images/ORA_DuplicateWarning.gif differ diff --git a/docs/course_authors/source/Images/ORA_ProblemName1.gif b/docs/course_authors/source/Images/ORA_ProblemName1.gif new file mode 100644 index 0000000000..450f1b8e94 Binary files /dev/null and b/docs/course_authors/source/Images/ORA_ProblemName1.gif differ diff --git a/docs/course_authors/source/Images/ORA_Prompt.gif b/docs/course_authors/source/Images/ORA_Prompt.gif new file mode 100644 index 0000000000..70f8069581 Binary files /dev/null and b/docs/course_authors/source/Images/ORA_Prompt.gif differ diff --git a/docs/course_authors/source/Images/ORA_Rubric.gif b/docs/course_authors/source/Images/ORA_Rubric.gif new file mode 100644 index 0000000000..12694da1f7 Binary files /dev/null and b/docs/course_authors/source/Images/ORA_Rubric.gif differ diff --git a/docs/course_authors/source/Images/ORA_Settings.gif b/docs/course_authors/source/Images/ORA_Settings.gif new file mode 100644 index 0000000000..6a4f7c1ed5 Binary files /dev/null and b/docs/course_authors/source/Images/ORA_Settings.gif differ diff --git a/docs/course_authors/source/Images/ORA_Tasks.gif b/docs/course_authors/source/Images/ORA_Tasks.gif new file mode 100644 index 0000000000..0a39bab517 Binary files /dev/null and b/docs/course_authors/source/Images/ORA_Tasks.gif differ diff --git a/docs/course_authors/source/Images/OpenEndedConsole_NewSubmissions.gif b/docs/course_authors/source/Images/OpenEndedConsole_NewSubmissions.gif new file mode 100644 index 0000000000..8441dcbb75 Binary files /dev/null and b/docs/course_authors/source/Images/OpenEndedConsole_NewSubmissions.gif differ diff --git a/docs/course_authors/source/Images/OpenEndedPanel.gif b/docs/course_authors/source/Images/OpenEndedPanel.gif new file mode 100644 index 0000000000..1e6de1fccb Binary files /dev/null and b/docs/course_authors/source/Images/OpenEndedPanel.gif differ diff --git a/docs/course_authors/source/Images/PA_StaffDebug_Location.gif b/docs/course_authors/source/Images/PA_StaffDebug_Location.gif new file mode 100644 index 0000000000..bac3da8c55 Binary files /dev/null and b/docs/course_authors/source/Images/PA_StaffDebug_Location.gif differ diff --git a/docs/course_authors/source/Images/PGI_CompEditor_Settings.gif b/docs/course_authors/source/Images/PGI_CompEditor_Settings.gif new file mode 100644 index 0000000000..da09adf8f3 Binary files /dev/null and b/docs/course_authors/source/Images/PGI_CompEditor_Settings.gif differ diff --git a/docs/course_authors/source/Images/PGI_Single.gif b/docs/course_authors/source/Images/PGI_Single.gif new file mode 100644 index 0000000000..0c906366f2 Binary files /dev/null and b/docs/course_authors/source/Images/PGI_Single.gif differ diff --git a/docs/course_authors/source/Images/Peer_ScoredResponse.gif b/docs/course_authors/source/Images/Peer_ScoredResponse.gif new file mode 100644 index 0000000000..9a6402df00 Binary files /dev/null and b/docs/course_authors/source/Images/Peer_ScoredResponse.gif differ diff --git a/docs/course_authors/source/Images/ProbCompButton_Dropdown.gif b/docs/course_authors/source/Images/ProbCompButton_Dropdown.gif new file mode 100644 index 0000000000..8a3076197c Binary files /dev/null and b/docs/course_authors/source/Images/ProbCompButton_Dropdown.gif differ diff --git a/docs/course_authors/source/Images/ProbCompButton_Explanation.gif b/docs/course_authors/source/Images/ProbCompButton_Explanation.gif new file mode 100644 index 0000000000..b212cab8f8 Binary files /dev/null and b/docs/course_authors/source/Images/ProbCompButton_Explanation.gif differ diff --git a/docs/course_authors/source/Images/ProbCompButton_MultChoice.gif b/docs/course_authors/source/Images/ProbCompButton_MultChoice.gif new file mode 100644 index 0000000000..91066a0826 Binary files /dev/null and b/docs/course_authors/source/Images/ProbCompButton_MultChoice.gif differ diff --git a/docs/course_authors/source/Images/ProbCompButton_NumInput.gif b/docs/course_authors/source/Images/ProbCompButton_NumInput.gif new file mode 100644 index 0000000000..c6b654fe27 Binary files /dev/null and b/docs/course_authors/source/Images/ProbCompButton_NumInput.gif differ diff --git a/docs/course_authors/source/Images/ProbCompButton_TextInput.gif b/docs/course_authors/source/Images/ProbCompButton_TextInput.gif new file mode 100644 index 0000000000..9a49e04418 Binary files /dev/null and b/docs/course_authors/source/Images/ProbCompButton_TextInput.gif differ diff --git a/docs/course_authors/source/Images/ProbComp_AdvancedMenu.gif b/docs/course_authors/source/Images/ProbComp_AdvancedMenu.gif new file mode 100644 index 0000000000..b7c9fe2316 Binary files /dev/null and b/docs/course_authors/source/Images/ProbComp_AdvancedMenu.gif differ diff --git a/docs/course_authors/source/Images/ProbComp_CPTMenu.gif b/docs/course_authors/source/Images/ProbComp_CPTMenu.gif new file mode 100644 index 0000000000..e671478715 Binary files /dev/null and b/docs/course_authors/source/Images/ProbComp_CPTMenu.gif differ diff --git a/docs/course_authors/source/Images/ProbComponent_Attributes.gif b/docs/course_authors/source/Images/ProbComponent_Attributes.gif new file mode 100644 index 0000000000..331276a921 Binary files /dev/null and b/docs/course_authors/source/Images/ProbComponent_Attributes.gif differ diff --git a/docs/course_authors/source/Images/ProbComponent_LMS_DisplayName.gif b/docs/course_authors/source/Images/ProbComponent_LMS_DisplayName.gif new file mode 100644 index 0000000000..0f4268c4ec Binary files /dev/null and b/docs/course_authors/source/Images/ProbComponent_LMS_DisplayName.gif differ diff --git a/docs/course_authors/source/Images/ProbComponent_MC_Studio_Default.gif b/docs/course_authors/source/Images/ProbComponent_MC_Studio_Default.gif new file mode 100644 index 0000000000..903a85ef47 Binary files /dev/null and b/docs/course_authors/source/Images/ProbComponent_MC_Studio_Default.gif differ diff --git a/docs/course_authors/source/Images/ProblemList-DemoCourse.gif b/docs/course_authors/source/Images/ProblemList-DemoCourse.gif new file mode 100644 index 0000000000..a652a4bde8 Binary files /dev/null and b/docs/course_authors/source/Images/ProblemList-DemoCourse.gif differ diff --git a/docs/course_authors/source/Images/ProblemWeight_DD.gif b/docs/course_authors/source/Images/ProblemWeight_DD.gif new file mode 100644 index 0000000000..5815ad3ec4 Binary files /dev/null and b/docs/course_authors/source/Images/ProblemWeight_DD.gif differ diff --git a/docs/course_authors/source/Images/ProblemWeight_TI.gif b/docs/course_authors/source/Images/ProblemWeight_TI.gif new file mode 100644 index 0000000000..c69e029d8b Binary files /dev/null and b/docs/course_authors/source/Images/ProblemWeight_TI.gif differ diff --git a/docs/course_authors/source/Images/ProblemWithAdaptiveHint.gif b/docs/course_authors/source/Images/ProblemWithAdaptiveHint.gif new file mode 100644 index 0000000000..ae62af8cd8 Binary files /dev/null and b/docs/course_authors/source/Images/ProblemWithAdaptiveHint.gif differ diff --git a/docs/course_authors/source/Images/ProblemWithAdaptiveHintExample.gif b/docs/course_authors/source/Images/ProblemWithAdaptiveHintExample.gif new file mode 100644 index 0000000000..ae62af8cd8 Binary files /dev/null and b/docs/course_authors/source/Images/ProblemWithAdaptiveHintExample.gif differ diff --git a/docs/course_authors/source/Images/ProblemWrittenInLaTeX.gif b/docs/course_authors/source/Images/ProblemWrittenInLaTeX.gif new file mode 100644 index 0000000000..767c3f286c Binary files /dev/null and b/docs/course_authors/source/Images/ProblemWrittenInLaTeX.gif differ diff --git a/docs/course_authors/source/Images/ProblemWrittenInLaTeXExample.gif b/docs/course_authors/source/Images/ProblemWrittenInLaTeXExample.gif new file mode 100644 index 0000000000..767c3f286c Binary files /dev/null and b/docs/course_authors/source/Images/ProblemWrittenInLaTeXExample.gif differ diff --git a/docs/course_authors/source/Images/ProblemsYouHaveSubmitted.gif b/docs/course_authors/source/Images/ProblemsYouHaveSubmitted.gif new file mode 100644 index 0000000000..7e9b254cc4 Binary files /dev/null and b/docs/course_authors/source/Images/ProblemsYouHaveSubmitted.gif differ diff --git a/docs/course_authors/source/Images/ResponseToGrade.gif b/docs/course_authors/source/Images/ResponseToGrade.gif new file mode 100644 index 0000000000..d56af8e251 Binary files /dev/null and b/docs/course_authors/source/Images/ResponseToGrade.gif differ diff --git a/docs/course_authors/source/Images/SaveChanges.gif b/docs/course_authors/source/Images/SaveChanges.gif new file mode 100644 index 0000000000..0dde0bfbdd Binary files /dev/null and b/docs/course_authors/source/Images/SaveChanges.gif differ diff --git a/docs/course_authors/source/Images/SpecProbs_List.gif b/docs/course_authors/source/Images/SpecProbs_List.gif new file mode 100644 index 0000000000..ff74892313 Binary files /dev/null and b/docs/course_authors/source/Images/SpecProbs_List.gif differ diff --git a/docs/course_authors/source/Images/TextInput.gif b/docs/course_authors/source/Images/TextInput.gif new file mode 100644 index 0000000000..a9998db48d Binary files /dev/null and b/docs/course_authors/source/Images/TextInput.gif differ diff --git a/docs/course_authors/source/Images/TextInputExample.gif b/docs/course_authors/source/Images/TextInputExample.gif new file mode 100644 index 0000000000..a9998db48d Binary files /dev/null and b/docs/course_authors/source/Images/TextInputExample.gif differ diff --git a/docs/course_authors/source/Images/ThreeAssmts_NoResponse.gif b/docs/course_authors/source/Images/ThreeAssmts_NoResponse.gif new file mode 100644 index 0000000000..c029638f7c Binary files /dev/null and b/docs/course_authors/source/Images/ThreeAssmts_NoResponse.gif differ diff --git a/docs/course_authors/source/Images/Unit_DisplayName_Studio.png b/docs/course_authors/source/Images/Unit_DisplayName_Studio.png new file mode 100644 index 0000000000..c3aea05312 Binary files /dev/null and b/docs/course_authors/source/Images/Unit_DisplayName_Studio.png differ diff --git a/docs/course_authors/source/Images/VideoComponent_Default.png b/docs/course_authors/source/Images/VideoComponent_Default.png new file mode 100644 index 0000000000..01d90c457f Binary files /dev/null and b/docs/course_authors/source/Images/VideoComponent_Default.png differ diff --git a/docs/course_authors/source/Images/VideoComponent_YouTubeCode.png b/docs/course_authors/source/Images/VideoComponent_YouTubeCode.png new file mode 100644 index 0000000000..fd061135cc Binary files /dev/null and b/docs/course_authors/source/Images/VideoComponent_YouTubeCode.png differ diff --git a/docs/course_authors/source/Images/Viz_Revise_EditDraft.png b/docs/course_authors/source/Images/Viz_Revise_EditDraft.png new file mode 100644 index 0000000000..66bd9ee015 Binary files /dev/null and b/docs/course_authors/source/Images/Viz_Revise_EditDraft.png differ diff --git a/docs/course_authors/source/Images/Viz_Revise_ReplaceorDelete.png b/docs/course_authors/source/Images/Viz_Revise_ReplaceorDelete.png new file mode 100644 index 0000000000..4b6c2920b4 Binary files /dev/null and b/docs/course_authors/source/Images/Viz_Revise_ReplaceorDelete.png differ diff --git a/docs/course_authors/source/Images/Viz_Revise_ViewLiveandPreview.png b/docs/course_authors/source/Images/Viz_Revise_ViewLiveandPreview.png new file mode 100644 index 0000000000..6747a39de5 Binary files /dev/null and b/docs/course_authors/source/Images/Viz_Revise_ViewLiveandPreview.png differ diff --git a/docs/course_authors/source/Images/WordCloud.gif b/docs/course_authors/source/Images/WordCloud.gif new file mode 100644 index 0000000000..b1c15f7ce2 Binary files /dev/null and b/docs/course_authors/source/Images/WordCloud.gif differ diff --git a/docs/course_authors/source/Images/WordCloudExample.gif b/docs/course_authors/source/Images/WordCloudExample.gif new file mode 100644 index 0000000000..a5b26cad97 Binary files /dev/null and b/docs/course_authors/source/Images/WordCloudExample.gif differ diff --git a/docs/course_authors/source/Images/WriteYourOwnGrader.gif b/docs/course_authors/source/Images/WriteYourOwnGrader.gif new file mode 100644 index 0000000000..da50c92b04 Binary files /dev/null and b/docs/course_authors/source/Images/WriteYourOwnGrader.gif differ diff --git a/docs/course_authors/source/Images/WriteYourOwnGraderExample.gif b/docs/course_authors/source/Images/WriteYourOwnGraderExample.gif new file mode 100644 index 0000000000..da50c92b04 Binary files /dev/null and b/docs/course_authors/source/Images/WriteYourOwnGraderExample.gif differ diff --git a/docs/course_authors/source/Images/checklist.png b/docs/course_authors/source/Images/checklist.png new file mode 100644 index 0000000000..e2ecac20df Binary files /dev/null and b/docs/course_authors/source/Images/checklist.png differ diff --git a/docs/course_authors/source/Images/clock_icon.gif b/docs/course_authors/source/Images/clock_icon.gif new file mode 100644 index 0000000000..77f92ef5bb Binary files /dev/null and b/docs/course_authors/source/Images/clock_icon.gif differ diff --git a/docs/course_authors/source/Images/course_info.png b/docs/course_authors/source/Images/course_info.png new file mode 100644 index 0000000000..7aef9d773d Binary files /dev/null and b/docs/course_authors/source/Images/course_info.png differ diff --git a/docs/course_authors/source/Images/course_outline.png b/docs/course_authors/source/Images/course_outline.png new file mode 100644 index 0000000000..94cc56a120 Binary files /dev/null and b/docs/course_authors/source/Images/course_outline.png differ diff --git a/docs/course_authors/source/Images/course_outline_set_grade.png b/docs/course_authors/source/Images/course_outline_set_grade.png new file mode 100644 index 0000000000..2d5b5ae67e Binary files /dev/null and b/docs/course_authors/source/Images/course_outline_set_grade.png differ diff --git a/docs/course_authors/source/Images/course_outline_student_view.png b/docs/course_authors/source/Images/course_outline_student_view.png new file mode 100644 index 0000000000..a67b0879b6 Binary files /dev/null and b/docs/course_authors/source/Images/course_outline_student_view.png differ diff --git a/docs/course_authors/source/Images/course_overview.png b/docs/course_authors/source/Images/course_overview.png new file mode 100644 index 0000000000..aa1fec3689 Binary files /dev/null and b/docs/course_authors/source/Images/course_overview.png differ diff --git a/docs/course_authors/source/Images/drag_drop.png b/docs/course_authors/source/Images/drag_drop.png new file mode 100644 index 0000000000..1a6ade52e2 Binary files /dev/null and b/docs/course_authors/source/Images/drag_drop.png differ diff --git a/docs/course_authors/source/Images/first_course.png b/docs/course_authors/source/Images/first_course.png new file mode 100644 index 0000000000..240c47592e Binary files /dev/null and b/docs/course_authors/source/Images/first_course.png differ diff --git a/docs/course_authors/source/Images/grade_range.png b/docs/course_authors/source/Images/grade_range.png new file mode 100644 index 0000000000..a1b23b385e Binary files /dev/null and b/docs/course_authors/source/Images/grade_range.png differ diff --git a/docs/course_authors/source/Images/grade_range_b.png b/docs/course_authors/source/Images/grade_range_b.png new file mode 100644 index 0000000000..eb6bba1e7f Binary files /dev/null and b/docs/course_authors/source/Images/grade_range_b.png differ diff --git a/docs/course_authors/source/Images/imageresponse_irregularregions.gif b/docs/course_authors/source/Images/imageresponse_irregularregions.gif new file mode 100644 index 0000000000..796ffe1296 Binary files /dev/null and b/docs/course_authors/source/Images/imageresponse_irregularregions.gif differ diff --git a/docs/course_authors/source/Images/imageresponse_multipleregions.gif b/docs/course_authors/source/Images/imageresponse_multipleregions.gif new file mode 100644 index 0000000000..25cf5017b4 Binary files /dev/null and b/docs/course_authors/source/Images/imageresponse_multipleregions.gif differ diff --git a/docs/course_authors/source/Images/latex_upload.png b/docs/course_authors/source/Images/latex_upload.png new file mode 100644 index 0000000000..0caec17b7c Binary files /dev/null and b/docs/course_authors/source/Images/latex_upload.png differ diff --git a/docs/course_authors/source/Images/new_course.png b/docs/course_authors/source/Images/new_course.png new file mode 100644 index 0000000000..962ea4d96b Binary files /dev/null and b/docs/course_authors/source/Images/new_course.png differ diff --git a/docs/course_authors/source/Images/new_course_info.png b/docs/course_authors/source/Images/new_course_info.png new file mode 100644 index 0000000000..911f1cc36c Binary files /dev/null and b/docs/course_authors/source/Images/new_course_info.png differ diff --git a/docs/course_authors/source/Images/open_course.png b/docs/course_authors/source/Images/open_course.png new file mode 100644 index 0000000000..47c2c747f6 Binary files /dev/null and b/docs/course_authors/source/Images/open_course.png differ diff --git a/docs/course_authors/source/Images/schedule.png b/docs/course_authors/source/Images/schedule.png new file mode 100644 index 0000000000..403f772cc9 Binary files /dev/null and b/docs/course_authors/source/Images/schedule.png differ diff --git a/docs/course_authors/source/Images/subsection.png b/docs/course_authors/source/Images/subsection.png new file mode 100644 index 0000000000..d81dab0015 Binary files /dev/null and b/docs/course_authors/source/Images/subsection.png differ diff --git a/docs/course_authors/source/Images/subsection_set_grade.png b/docs/course_authors/source/Images/subsection_set_grade.png new file mode 100644 index 0000000000..74e2a705ad Binary files /dev/null and b/docs/course_authors/source/Images/subsection_set_grade.png differ diff --git a/docs/course_authors/source/Images/textbook_chapters.png b/docs/course_authors/source/Images/textbook_chapters.png new file mode 100644 index 0000000000..ef67c581fd Binary files /dev/null and b/docs/course_authors/source/Images/textbook_chapters.png differ diff --git a/docs/course_authors/source/Images/textbook_new.png b/docs/course_authors/source/Images/textbook_new.png new file mode 100644 index 0000000000..c1752c2d2b Binary files /dev/null and b/docs/course_authors/source/Images/textbook_new.png differ diff --git a/docs/course_authors/source/Images/textbook_tab.png b/docs/course_authors/source/Images/textbook_tab.png new file mode 100644 index 0000000000..62c039a718 Binary files /dev/null and b/docs/course_authors/source/Images/textbook_tab.png differ diff --git a/docs/course_authors/source/Images/units_students.png b/docs/course_authors/source/Images/units_students.png new file mode 100644 index 0000000000..017611a432 Binary files /dev/null and b/docs/course_authors/source/Images/units_students.png differ diff --git a/docs/course_authors/source/Images/video-edit.png b/docs/course_authors/source/Images/video-edit.png new file mode 100644 index 0000000000..f4b01c64b6 Binary files /dev/null and b/docs/course_authors/source/Images/video-edit.png differ diff --git a/docs/course_authors/source/add_syllabus.rst b/docs/course_authors/source/add_syllabus.rst deleted file mode 100644 index 8c94f84946..0000000000 --- a/docs/course_authors/source/add_syllabus.rst +++ /dev/null @@ -1,301 +0,0 @@ -******************************************************* -Add a Syllabus, StaticPage, Update, or Course Handouts -******************************************************* - -Add a Static Page -***************** - -**Static Pages** takes you to a list of the important pages for your course that -you want students to be able to access easily. Static pages usually apply to the -whole course rather than a particular sequence. For example, your static pages -might include your syllabus or information about your grading policy. - -.. image:: Images/image155.png - -When you create a static page, the name of that page appears in your course's -navigation bar at the top of the page, along with **Courseware**, **Course -Info**, and other tabs. For example, the following navigation bar includes a -**Syllabus** static page and a **Projects** static page. - -.. image:: Images/image157.png - - -To add a static page: - -1. On the navigation bar, click **Course Content**, and then click **Static -Pages**. - -.. image:: Images/image159.png - - -2. In the top right corner, click **New Page**. The following entry appears. - -.. image:: Images/image161.png - - -3. On the right side of the box, click **Edit**. The following dialog box opens. - -.. image:: Images/image163.png - -4. In the **display_name** box, type the name that you want to appear in the -navigation bar for your course. - - -5. Replace the placeholder text with your content. - -6. Click **Save**. - - -Add a Schedule -************** - - -To create a schedule for your course, you can create a Google calendar that -students can incorporate into their personal Google calendars, or you can use -HTML to create a dynamic schedule with links that students can click. You can -also include both types of calendar in your course. - -Google Calendar -=============== - - -Your Google calendar should include all release dates and due dates. You can -link to it in your course. Your calendar may look like the following calendar -for BerkeleyX's CS 169.2x course. To see this calendar live, -click -https://www.google.com/calendar/embed?src=edx.org_mcjhp2tv3ul2etfpb43hd388p4@group.calendar.g -oogle.com&ctz=America/New_York_ - -.. image:: Images/image165.png - - -To create a Google calendar, access your Google account, and then click -**Calendar** at the top of the page. You can then enter your schedule -information. You can also create a link to this calendar anywhere in your -course. - -Dynamic HTML Schedule -===================== - -You can create a dynamic HTML schedule page that you update manually as the -course progresses. The template below was adapted from a version created by -Professors Dan Klein and Pieter Abbeel. - -Below is a sample course schedule that shows the way the schedule would look -during week 3 of the course. As you can see, there are no links for material -after week 3, since that information has not yet been released. - -This course uses the following release schedule: - -1. All lessons are released on Mondays. 2. All homework assignments are released -on Wednesdays, and are due on Sunday of the following week. 3. All quizzes are -released on Fridays and due on Sunday of the following week (9 days later). - - -.. image:: Images/image285.png - - -To create a dynamic HTML schedule: - -1. On the navigation bar, click **Course Content**, and then click **Static -Pages**. - -.. image:: Images/image159.png - -2. In the top right corner, click **New Page**. The following entry appears. - -.. image:: Images/image161.png - -3. On the right side of the box, click **Edit**. The following dialog box opens. - -4. In the editor that opens, type **Schedule **in the **display_name** box. - -5. Click the **HTML** tab. - - -.. image:: Images/image163.png - - -6. Go to `Appendix B ` and copy the code for the dynamic -schedule template. - - -7. In the editor in Studio, replace the placeholder code on the HTML tab with -the code for the dynamic schedule template. - - -Course Handouts -*************** - - -Your course handouts are available on Edge from the **Course Handouts** sidebar -on the **Course Info** page. To add these items, you must create a file and -upload the file to the **>Files & Uploads** page. When you do this, a URL is -created for that file. You then use this URL to create a link to the file on the -**Handouts** sidebar. You create this link on the **Course Updates** page. - -.. note:: - - You cannot upload videos to the Files & Uploads page. - - -Upload a File to the Files & Uploads page -========================================= - - -The **Files & Uploads** page lists handouts, images, and other content that you -want to integrate into your course. - - -.. image:: Images/image160.png - - -For example, if you want to include a cartoon in one of your weekly updates, you -upload the image to **Files & Uploads**. When you do this, the file receives its -own URL, and you then use that URL to create a link to the image in the body of -the course. Likewise, if you want to include a handout in the **Course -Handouts** section of the **Course Info** page or in a lesson, you upload the -handout here, and then create a link to the handout under **Course Handouts** or -in the lesson. - - -You can also use the **Files & Uploads** page to keep all of the content for -your course in one place. Content is only visible to students if you create a -link to it. You can thus keep older versions of your content. - - -For example, if you create a Word file to use in your class, and you then create -a PDF copy of that Word file, you can link to the PDF file but keep the Word -file on the **Files Uploads** page. If you later delete the file from your -personal computer, or if a colleague asks you if they can run a version of your -course but change the dates in your handout, you can easily find the Word file -on the **Files Uploads** page. - - -Note that you should be careful when you name files that you add to the **Files -& Uploads** page. Because the file name becomes part of the URL, students can -see the name of the file when they open it. Avoid using file names such as -"AnswerKey.pdf." - - -.. warning:: - - Uploading a file with the same name as a file that is already - uploaded will cause the original file to be overwritten. There is not currently - a warning when you try to upload a file that has the same name. - - -To upload a file to the **Files & Uploads** page: - - -1. On the navigation bar, click **Course Content**, and then click **Files & -Uploads**. - - -2. On the **>Files & Uploads** page, click **Upload New File**. - - -.. image:: Images/image162.png - - -3. In the **Upload New File** dialog box, click **Choose File**. - - -4. In the **Open** dialog box, locate the file that you want, and then click -**Open**. - -To add another file, click **Load Another File**. To close the dialog box, click -the **x** in the top right corner. When you close the dialog box, the file -appears on the **Files & Uploads** page. - - -5. Determine the URL of your newly uploaded file. To do this, on the **Files & -Uploads** page, locate the file in the list. In the **URL** column on the right, -you can see the URL you will need to use to display an image or create a -hyperlink. - - -.. image:: Images/image164.png - - -.. note:: - - Currently, you cannot delete a file after you upload it to the **Files & - Uploads** page. You can replace a file by uploading another file with the same - name, but you cannot delete the file. - - - -Add Items to the Handouts Sidebar -================================= - - -1. On the navigation bar, click **Course Content**, and then click **Updates**. - - -image:: Images/image166.png - - -2. Locate the **Course Handouts** sidebar on the right, and then click **Edit**. - - -.. image:: Images/image168.png - - -3. In the XML box that appears, create links to your files. - - -* To create a link to a document, enter the following syntax, where URL OF FILE -is the URL that you noted in step 5 of **Upload a File** on the **Files & -Uploads Page** and LINK TEXT is the text that you want to appear in the -**Handouts** sidebar. - -.. code-block:: html - -

[LINK TEXT]

- - -* To create a link to an image that you've uploaded, enter the following syntax, -where URL OF FILE is the URL that you noted in step 5 of **Upload a File to -Your Assets Tab**. - -.. code-block:: html - -

- - - -4. Click **Save**. Your files appear under **Course Handouts**. - - -Add an Announcement or Update -***************************** - - - You can add announcements or updates to welcome students to the class, - remind students of exams, notify students of changes in the course schedule, - and call out important steps students need to keep in mind. These updates - appear on the **Course Info** tab on edX or Edge. Because your course - automatically opens to the **Course Info** page, students will see the - update as soon as they sign in. - - - 1. On the **Course Content** menu, click **Updates**. The **Course Updates** - page opens. - - - .. image:: Images/image185.png - - - - 2. Click **New Update**. The following dialog box opens. - - - .. image:: Images/image187.png - - - The content for this box must be formatted in HTML. For a template that you - can use that includes placeholders, see `Appendix A `. - - - 3. Enter your update formatted as HTML, and then click **Save**. diff --git a/docs/course_authors/source/advanced_problems.rst b/docs/course_authors/source/advanced_problems.rst new file mode 100644 index 0000000000..0cad06604e --- /dev/null +++ b/docs/course_authors/source/advanced_problems.rst @@ -0,0 +1,233 @@ +.. _Advanced Problems: + +Advanced Problems +================= + +Advanced problems are problems such as drag and drop, circuit schematic +builder, and math expression problems. These problems appear on the +Advanced tab when you create a new Problem component. Studio provides +templates for these problems, but the problems open directly in the +**Advanced Editor** and have to be created in XML. + +- :ref:`Circuit Schematic Builder` In circuit schematic problems, students + create and modify circuits on an interactive grid and submit + computer-generated analyses of the circuits for grading. +- :ref:`Write-Your-Own-Grader` Write-your-own-grader problems + evaluate students' responses using an embedded Python script that you + create. These problems can be any type. +- :ref:`Drag and Drop` Drag and drop problems require students to drag text + or objects to a specific location on an image. +- :ref:`JavaScript Input` JavaScript input problems allow you to incorporate + problem types that you've created in HTML into Studio via an IFrame. +- :ref:`Image Mapped Input` Image mapped input problems require students to + click a specific location on an image. +- :ref:`Math Expression Input` Math expression input problems require + students to enter a mathematical expression as text, such as + e=m\*c^2. +- :ref:`Problem Written in LaTeX` This problem type allows you to convert + problems that you've already written in LaTeX into the edX format. + Note that this problem type is still a prototype, however, and may + not be supported in the future. +- :ref:`Problem with Adaptive Hint` These problems can give students + feedback or hints based on their responses. Problems with adaptive + hints can be text input or multiple choice problems. + +These problems are easy to access in Studio. To create them, click +**Problem** under **Add New Component**, click the **Advanced** tab, and +then click the name of the problem that you want to create. + +.. _Circuit Schematic Builder: + +Circuit Schematic Builder +------------------------- + +In circuit schematic builder problems, students can arrange circuit +elements such as voltage sources, capacitors, resistors, and MOSFETs on +an interactive grid. They then submit a DC, AC, or transient analysis of +their circuit to the system for grading. + +.. image:: /Images/CircuitSchematicExample.gif + +Create a Circuit Schematic Builder Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#. In the unit where you want to create the problem, click **Problem** + under **Add New Component**, and then click the **Advanced** tab. +#. Click **Circuit Schematic Builder**. +#. In the component that appears, click **Edit**. +#. In the component editor, replace the example code with your own code. +#. Click **Save**. + +.. _Write-Your-Own-Grader: + +Write-Your-Own-Grader ("Custom Python-Evaluated Input") +------------------------------------------------------- + + +In write-your-own-grader problems (also called "custom Python-evaluated +input" problems), the grader evaluates a student's response using a +Python script that you create and embed in the problem. These problems +can be any type. Numerical input and text input problems are the most +popular write-your-own-grader. + +.. image:: Images/WriteYourOwnGraderExample.gif + +Create a Write-Your-Own-Grader Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To create a write-your-own-grader problem: + +#. In the unit where you want to create the problem, click **Problem** + under **Add New Component**, and then click the **Advanced** tab. +#. Click **Custom Python-Evaluated Input**. +#. In the component that appears, click **Edit**. +#. In the component editor, replace the example code with your own code. +#. Click **Save**. + +For more information about write-your-own-grader problems, see `CustomResponse XML and Python +Script `_. + +.. _Drag and Drop: + +Drag and Drop +------------- + +In drag and drop problems, students respond to a question by dragging +text or objects to a specific location on an image. + +.. image:: Images/DragAndDropExample.gif + +Create a Drag and Drop Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To create a drag and drop problem: + +#. In the unit where you want to create the problem, click **Problem** + under **Add New Component**, and then click the **Advanced** tab. +#. Click **Drag and Drop**. +#. In the component that appears, click **Edit**. +#. In the component editor, replace the example code with your own code. +#. Click **Save**. + + +For more information about drag and drop problems, see `XML Format of Drag and Drop Input +`_. + +.. _Image Mapped Input: + +Image Mapped Input +------------------ + +In an image mapped input problem, students click inside a defined area +in an image. You define this area by including coordinates in the body +of the problem. + +.. image:: Images/ImageMappedInputExample.gif + +Create an Image Mapped Input Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To create a image mapped input problem: + +#. In the unit where you want to create the problem, click **Problem** + under **Add New Component**, and then click the **Advanced** tab. +#. Click **Image Mapped Input**. +#. In the component that appears, click **Edit**. +#. In the component editor, replace the example code with your own code. +#. Click **Save**. + +.. _Math Expression Input: + +Math Expression Input +--------------------- + +In math expression input problems, students enter text that represents +a mathematical expression, and Studio changes that text to a symbolic +expression that appears below the field where the student is typing. +Unlike numerical input problems, which only allow integers and a few +select constants, math expression problems can include more complicated +symbolic expressions. + +When you create a math expression input problem for your students in +Studio, you'll use `MathJax `_ to change your +plain text into "beautiful math." For more information about how to use +MathJax in Studio, see *A Brief Introduction to MathJax in +Studio*. + +.. image:: Images/MathExpressionInputExample.gif + +Create a Math Expression Input Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To create a math expression input problem: + +#. In the unit where you want to create the problem, click **Problem** + under **Add New Component**, and then click the **Advanced** tab. +#. Click **Math Expression Input**. +#. In the component that appears, click **Edit**. +#. In the component editor, replace the example code with your own code. +#. Click **Save**. + +For more information, see `Symbolic Response +`_. + +.. _Problem Written in LaTeX: + +Problem Written in LaTeX +------------------------ + +If you have an problem that is already written in LaTeX, you can use +this problem type to easily convert your code into XML. After you paste +your code into the LaTeX editor, you'll only need to make a few minor +adjustments. Note that **this problem type is still a prototype and may +not be supported in the future**, so you should use it with caution. + +***Note** If you want to use LaTeX to typeset mathematical expressions +in problems that you haven't yet written, use any of the other problem +templates together with `MathJax `_. For more +information about how to create mathematical expressions in Studio using +MathJax, see *A Brief Introduction to MathJax in +Studio*. + +.. image:: Images/ProblemWrittenInLaTeX.gif + +Create a Problem Written in LaTeX +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To create a problem written in LaTeX: + +#. In the unit where you want to create the problem, click **Problem** + under **Add New Component**, and then click the **Advanced** tab. +#. Click **Problem Written in LaTeX**. +#. In the component editor that appears, click **Edit**. +#. In the lower left corner of the component editor, click **Launch + LaTeX Source Compiler**. +#. Replace the example code with your own code. +#. In the lower left corner of the LaTeX source compiler, click **Save & + Compile to edX XML**. + +.. _Problem with Adaptive Hint: + +Problem with Adaptive Hint +-------------------------- + +A problem with an adaptive hint evaluates a student's response, then +gives the student feedback or a hint based on that response so that the +student is more likely to answer correctly on the next attempt. These +problems can be text input or multiple choice problems. + +.. image:: Images/ProblemWithAdaptiveHintExample.gif + +Create a Problem with an Adaptive Hint +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To create a problem with an adaptive hint: + +#. In the unit where you want to create the problem, click **Problem** + under **Add New Component**, and then click the **Advanced** tab. +#. Click **Problem with Adaptive Hint**. +#. In the component that appears, click **Edit**. +#. In the component editor, replace the example code with your own code. +#. Click **Save**. + + diff --git a/docs/course_authors/source/appendices/a.rst b/docs/course_authors/source/appendices/a.rst index 18b4fb4e7f..0c59dcba95 100644 --- a/docs/course_authors/source/appendices/a.rst +++ b/docs/course_authors/source/appendices/a.rst @@ -1,6 +1,8 @@ .. raw:: latex \newpage % + +.. _Appendix A: ======================================== APPENDIX A-Template For Course Overview diff --git a/docs/course_authors/source/appendices/b.rst b/docs/course_authors/source/appendices/b.rst index 7e7d985067..560700e3e4 100644 --- a/docs/course_authors/source/appendices/b.rst +++ b/docs/course_authors/source/appendices/b.rst @@ -2,6 +2,7 @@ \newpage % +.. _Appendix B: =========================================== APPENDIX B: Code for Dynamic HTML Schedule diff --git a/docs/course_authors/source/appendices/e.rst b/docs/course_authors/source/appendices/e.rst index 44c747b38c..0dd05fd7dd 100644 --- a/docs/course_authors/source/appendices/e.rst +++ b/docs/course_authors/source/appendices/e.rst @@ -2,6 +2,8 @@ \newpage % +.. _Appendix E: + ========================== APPENDIX E: Problem Types @@ -580,7 +582,7 @@ default. These include: - ``pi`` - ``k``: the Boltzmann constant (~1.38e-23 in Joules/Kelvin) - ``c``: the speed of light in m/s (2.998e8) -- ``T``: typical room temperature (298.15 Kelvin, same as 25C/77F) +- ``T``: the positive difference between 0K and 0°C (285.15) - ``q``: the fundamental charge (~1.602e-19 Coloumbs) Operators and Functions diff --git a/docs/course_authors/source/appendices/f.rst b/docs/course_authors/source/appendices/f.rst new file mode 100644 index 0000000000..94a9258656 --- /dev/null +++ b/docs/course_authors/source/appendices/f.rst @@ -0,0 +1,936 @@ +.. _Appendix F: + +Appendix F - Files for the Example JavaScript Input Problem +=========================================================== + +For the example JavaScript Input problem, you need the following four files: + +- :ref:`webGLDemo.html` +- :ref:`webGLDemo.css` +- :ref:`webGLDemo.js` +- :ref:`three.min.js` + +To create these files, copy the code for each file into a text editor, and +then save each file. Make sure to use the correct file name extension when you save +each file. + +.. _webGLDemo.html: + +webGLDemo.html +-------------- + +:: + + + + + + + + + + + + + +
+ + + + + + + + + +.. _webGLDemo.css: + +webGLDemo.css +------------- + +:: + + #container { + background-color: black; + width: 400px; + height:400px; + } + + +.. _webGLDemo.js: + +webGLDemo.js +------------ + +:: + + var WebGLDemo = (function() { + + var width = 400, height = 400; + var container, renderer, scene, camera, projector, + ambientlight, directionalLight, + cylinder, cube, nonSelectedMaterial, selectedMaterial; + // Revolutions per second + var angularSpeed = 0.5, lastTime = 0; + var state = { + 'selectedObjects': { + 'cylinder': false, + 'cube': false + } + }; + + function init() { + container = document.getElementById('container'); + // Renderer + renderer = new THREE.WebGLRenderer({antialias:true}); + renderer.setSize(width, height); + renderer.setClearColor(0x000000, 1); + container.appendChild(renderer.domElement); + + // Scene + scene = new THREE.Scene(); + + // Camera + camera = new THREE.PerspectiveCamera(45, width/height, 1, 1000); + camera.position.z = 700; + + unselectedMaterial = new THREE.MeshPhongMaterial({ + specular: '#a9fcff', + color: '#00abb1', + emissive: '#006063', + shininess: 100 + }); + + selectedMaterial = new THREE.MeshPhongMaterial({ + specular: '#a9fcff', + color: '#abb100', + emissive: '#606300', + shininess: 100 + }); + + // Cylinder: bottomRadius, topRadius, height, segmentsRadius, segmentsHeight + cylinder = new THREE.Mesh(new THREE.CylinderGeometry(0, 100, 150, 50, 50, false), unselectedMaterial); + cylinder.position.x = -125; + cylinder.overdraw = true; + scene.add(cylinder); + + // Cube + cube = new THREE.Mesh(new THREE.CubeGeometry(120, 120, 120), unselectedMaterial); + cube.position.x = 125; + cube.overdraw = true; + scene.add(cube); + + // Ambient light + ambientLight = new THREE.AmbientLight(0x222222); + scene.add(ambientLight); + + // Directional light + directionalLight = new THREE.DirectionalLight(0xffffff); + directionalLight.position.set(1, 1, 1).normalize(); + scene.add(directionalLight); + + // Used to select element with mouse click + projector = new THREE.Projector(); + + renderer.domElement.addEventListener('click', onMouseClick, false); + + // Start animation + animate(); + } + + // This function is executed on each animation frame + function animate() { + // Request new frame + requestAnimationFrame(animate); + render(); + } + + function render() { + // Update + var time = (new Date()).getTime(); + var timeDiff = time - lastTime; + var angleChange = angularSpeed * timeDiff * 2 * Math.PI / 1000; + cylinder.rotation.x += angleChange; + cylinder.rotation.z += angleChange; + cube.rotation.x += angleChange; + cube.rotation.y += angleChange; + lastTime = time; + + // Render + renderer.render(scene, camera); + } + + function onMouseClick(event) { + var vector = new THREE.Vector3((event.clientX / width) * 2 - 1, + -(event.clientY / height) * 2 + 1, 1); + projector.unprojectVector(vector, camera); + + var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize()), + intersects = raycaster.intersectObjects(scene.children); + + if (intersects.length > 0) { + if (intersects[0].object === cylinder) { + state.selectedObjects.cylinder = !state.selectedObjects.cylinder; + } + else if (intersects[0].object === cube) { + state.selectedObjects.cube = !state.selectedObjects.cube; + } + + updateMaterials(); + } + } + + function updateMaterials() { + if (state.selectedObjects.cylinder) { + cylinder.material = selectedMaterial; + } + else { + cylinder.material = unselectedMaterial; + } + + if (state.selectedObjects.cube) { + cube.material = selectedMaterial; + } + else { + cube.material = unselectedMaterial; + } + } + + init(); + + function getState() { + return JSON.stringify(state); + } + + function setState(stateStr) { + state = JSON.parse(stateStr); + updateMaterials(); + } + + function getGrade() { + // The following return value may or may not be used to grade server-side. + // If getState and setState are used, then the Python grader also gets + // access to the return value of getState and can choose it instead to grade. + return JSON.stringify(state['selectedObjects']); + } + + return { + getState: getState, + setState: setState, + getGrade: getGrade + }; + }()); + + +.. _three.min.js: + +three.min.js +------------ + +:: + + // three.js - http://github.com/mrdoob/three.js + 'use strict';var THREE={REVISION:"62"};self.console=self.console||{info:function(){},log:function(){},debug:function(){},warn:function(){},error:function(){}};String.prototype.trim=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")};THREE.extend=function(a,b){if(Object.keys)for(var c=Object.keys(b),d=0,e=c.length;d>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(a,b,c){if(0===b)this.r=this.g=this.b=c;else{var d=function(a,b,c){0>c&&(c+=1);1c?b:c<2/3?a+6*(b-a)*(2/3-c):a},b=0.5>=c?c*(1+b):c+b-c*b,c=2*c-b;this.r=d(c,b,a+1/3);this.g=d(c,b,a);this.b=d(c,b,a-1/3)}return this},setStyle:function(a){if(/^rgb\((\d+), ?(\d+), ?(\d+)\)$/i.test(a))return a=/^rgb\((\d+), ?(\d+), ?(\d+)\)$/i.exec(a),this.r=Math.min(255,parseInt(a[1],10))/255,this.g=Math.min(255,parseInt(a[2],10))/255,this.b=Math.min(255,parseInt(a[3],10))/255,this;if(/^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i.test(a))return a=/^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i.exec(a),this.r= + Math.min(100,parseInt(a[1],10))/100,this.g=Math.min(100,parseInt(a[2],10))/100,this.b=Math.min(100,parseInt(a[3],10))/100,this;if(/^\#([0-9a-f]{6})$/i.test(a))return a=/^\#([0-9a-f]{6})$/i.exec(a),this.setHex(parseInt(a[1],16)),this;if(/^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test(a))return a=/^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(a),this.setHex(parseInt(a[1]+a[1]+a[2]+a[2]+a[3]+a[3],16)),this;if(/^(\w+)$/i.test(a))return this.setHex(THREE.ColorKeywords[a]),this},copy:function(a){this.r=a.r;this.g= + a.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255*this.r<<16^255*this.g<< + 8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(){var a={h:0,s:0,l:0};return function(){var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),h,g=(f+e)/2;if(f===e)f=h=0;else{var i=e-f,f=0.5>=g?i/(e+f):i/(2-e-f);switch(e){case b:h=(c-d)/i+(cf&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(i-h)/c,this._x=0.25*c, + this._y=(a+e)/c,this._z=(d+g)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-g)/c,this._x=(a+e)/c,this._y=0.25*c,this._z=(h+i)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+g)/c,this._y=(h+i)/c,this._z=0.25*c);this._updateEuler();return this},inverse:function(){this.conjugate().normalize();return this},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this._updateEuler();return this},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x* + this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);return this},multiply:function(a,b){return void 0!==b?(console.warn("DEPRECATED: Quaternion's .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z,f= + a._w,h=b._x,g=b._y,i=b._z,k=b._w;this._x=c*k+f*h+d*i-e*g;this._y=d*k+f*g+e*h-c*i;this._z=e*k+f*i+c*g-d*h;this._w=f*k-c*h-d*g-e*i;this._updateEuler();return this},multiplyVector3:function(a){console.warn("DEPRECATED: Quaternion's .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)},slerp:function(a,b){var c=this._x,d=this._y,e=this._z,f=this._w,h=f*a._w+c*a._x+d*a._y+e*a._z;0>h?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z= + -a._z,h=-h):this.copy(a);if(1<=h)return this._w=f,this._x=c,this._y=d,this._z=e,this;var g=Math.acos(h),i=Math.sqrt(1-h*h);if(0.001>Math.abs(i))return this._w=0.5*(f+this._w),this._x=0.5*(c+this._x),this._y=0.5*(d+this._y),this._z=0.5*(e+this._z),this;h=Math.sin((1-b)*g)/i;g=Math.sin(b*g)/i;this._w=f*h+this._w*g;this._x=c*h+this._x*g;this._y=d*h+this._y*g;this._z=e*h+this._z*g;this._updateEuler();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w}, + fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];this._w=a[3];this._updateEuler();return this},toArray:function(){return[this._x,this._y,this._z,this._w]},clone:function(){return new THREE.Quaternion(this._x,this._y,this._z,this._w)}};THREE.Quaternion.slerp=function(a,b,c,d){return c.copy(a).slerp(b,d)};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0}; + THREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a, + b){if(void 0!==b)return console.warn("DEPRECATED: Vector2's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector2's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-= + a.y;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divideScalar:function(a){0!==a?(a=1/a,this.x*=a,this.y*=a):this.y=this.x=0;return this},min:function(a){this.x>a.x&&(this.x=a.x);this.y>a.y&&(this.y=a.y);return this},max:function(a){this.xb.x&&(this.x=b.x);this.yb.y&&(this.y=b.y); + return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/ + b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a){this.x=a[0];this.y=a[1];return this},toArray:function(){return[this.x,this.y]},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}; + THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+ + a);}},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), + this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x* + b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z,a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12];this.y=a[1]*b+a[5]*c+a[9]*d+a[13];this.z=a[2]*b+a[6]*c+a[10]*d+a[14];return this},applyProjection:function(a){var b=this.x,c=this.y,d=this.z,a=a.elements,e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]); + this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,h=a.z,a=a.w,g=a*b+f*d-h*c,i=a*c+h*b-e*d,k=a*d+e*c-f*b,b=-e*b-f*c-h*d;this.x=g*a+b*-e+i*-h-k*-f;this.y=i*a+b*-f+k*-e-g*-h;this.z=k*a+b*-h+g*-f-i*-e;return this},transformDirection:function(a){var b=this.x,c=this.y,d=this.z,a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]* + b+a[6]*c+a[10]*d;this.normalize();return this},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){0!==a?(a=1/a,this.x*=a,this.y*=a,this.z*=a):this.z=this.y=this.x=0;return this},min:function(a){this.x>a.x&&(this.x=a.x);this.y>a.y&&(this.y=a.y);this.z>a.z&&(this.z=a.z);return this},max:function(a){this.xb.x&&(this.x=b.x);this.y< + a.y?this.y=a.y:this.y>b.y&&(this.y=b.y);this.zb.z&&(this.z=b.z);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())}, + setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},cross:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){var c= + a.x,d=a.y,e=a.z,f=b.x,h=b.y,g=b.z;this.x=d*g-e*h;this.y=e*f-c*g;this.z=c*h-d*f;return this},angleTo:function(a){a=this.dot(a)/(this.length()*a.length());return Math.acos(THREE.Math.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y,a=this.z-a.z;return b*b+c*c+a*a},setEulerFromRotationMatrix:function(){console.error("REMOVED: Vector3's setEulerFromRotationMatrix has been removed in favor of Euler.setFromRotationMatrix(), please update your code.")}, + setEulerFromQuaternion:function(){console.error("REMOVED: Vector3's setEulerFromQuaternion: has been removed in favor of Euler.setFromQuaternion(), please update your code.")},getPositionFromMatrix:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},getScaleFromMatrix:function(a){var b=this.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length(),a=this.set(a.elements[8],a.elements[9],a.elements[10]).length(); + this.x=b;this.y=c;this.z=a;return this},getColumnFromMatrix:function(a,b){var c=4*a,d=b.elements;this.x=d[c];this.y=d[c+1];this.z=d[c+2];return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a){this.x=a[0];this.y=a[1];this.z=a[2];return this},toArray:function(){return[this.x,this.y,this.z]},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}}; + THREE.extend(THREE.Vector3.prototype,{applyEuler:function(){var a=new THREE.Quaternion;return function(b){!1===b instanceof THREE.Euler&&console.error("ERROR: Vector3's .applyEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.");this.applyQuaternion(a.setFromEuler(b));return this}}(),applyAxisAngle:function(){var a=new THREE.Quaternion;return function(b,c){this.applyQuaternion(a.setFromAxisAngle(b,c));return this}}(),projectOnVector:function(){var a=new THREE.Vector3; + return function(b){a.copy(b).normalize();b=this.dot(a);return this.copy(a).multiplyScalar(b)}}(),projectOnPlane:function(){var a=new THREE.Vector3;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new THREE.Vector3;return function(b){a.copy(this).projectOnVector(b).multiplyScalar(2);return this.subVectors(a,this)}}()});THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}; + THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x; + case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector4's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this}, + addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector4's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this}, + applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w,a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){0!==a?(a=1/a,this.x*=a,this.y*=a,this.z*=a,this.w*=a):(this.z=this.y=this.x=0,this.w=1);return this},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b, + this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){var b,c,d,a=a.elements,e=a[0];d=a[4];var f=a[8],h=a[1],g=a[5],i=a[9];c=a[2];b=a[6];var k=a[10];if(0.01>Math.abs(d-h)&&0.01>Math.abs(f-c)&&0.01>Math.abs(i-b)){if(0.1>Math.abs(d+h)&&0.1>Math.abs(f+c)&&0.1>Math.abs(i+b)&&0.1>Math.abs(e+g+k-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;g=(g+1)/2;k=(k+1)/2;d=(d+h)/4;f=(f+c)/4;i=(i+b)/4;e>g&&e>k?0.01>e?(b=0,d=c=0.707106781):(b=Math.sqrt(e),c=d/b,d=f/b):g>k?0.01>g? + (b=0.707106781,c=0,d=0.707106781):(c=Math.sqrt(g),b=d/c,d=i/c):0.01>k?(c=b=0.707106781,d=0):(d=Math.sqrt(k),b=f/d,c=i/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-i)*(b-i)+(f-c)*(f-c)+(h-d)*(h-d));0.001>Math.abs(a)&&(a=1);this.x=(b-i)/a;this.y=(f-c)/a;this.z=(h-d)/a;this.w=Math.acos((e+g+k-1)/2);return this},min:function(a){this.x>a.x&&(this.x=a.x);this.y>a.y&&(this.y=a.y);this.z>a.z&&(this.z=a.z);this.w>a.w&&(this.w=a.w);return this},max:function(a){this.xb.x&&(this.x=b.x);this.yb.y&&(this.y=b.y);this.zb.z&&(this.z=b.z);this.wb.w&&(this.w=b.w);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x* + this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&& + a.w===this.w},fromArray:function(a){this.x=a[0];this.y=a[1];this.z=a[2];this.w=a[3];return this},toArray:function(){return[this.x,this.y,this.z,this.w]},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Euler=function(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||THREE.Euler.DefaultOrder};THREE.Euler.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");THREE.Euler.DefaultOrder="XYZ"; + THREE.Euler.prototype={constructor:THREE.Euler,_x:0,_y:0,_z:0,_order:THREE.Euler.DefaultOrder,_quaternion:void 0,_updateQuaternion:function(){void 0!==this._quaternion&&this._quaternion.setFromEuler(this,!1)},get x(){return this._x},set x(a){this._x=a;this._updateQuaternion()},get y(){return this._y},set y(a){this._y=a;this._updateQuaternion()},get z(){return this._z},set z(a){this._z=a;this._updateQuaternion()},get order(){return this._order},set order(a){this._order=a;this._updateQuaternion()}, + set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this._updateQuaternion();return this},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this._updateQuaternion();return this},setFromRotationMatrix:function(a,b){function c(a){return Math.min(Math.max(a,-1),1)}var d=a.elements,e=d[0],f=d[4],h=d[8],g=d[1],i=d[5],k=d[9],m=d[2],l=d[6],d=d[10],b=b||this._order;"XYZ"===b?(this._y=Math.asin(c(h)),0.99999>Math.abs(h)?(this._x=Math.atan2(-k,d),this._z= + Math.atan2(-f,e)):(this._x=Math.atan2(l,i),this._z=0)):"YXZ"===b?(this._x=Math.asin(-c(k)),0.99999>Math.abs(k)?(this._y=Math.atan2(h,d),this._z=Math.atan2(g,i)):(this._y=Math.atan2(-m,e),this._z=0)):"ZXY"===b?(this._x=Math.asin(c(l)),0.99999>Math.abs(l)?(this._y=Math.atan2(-m,d),this._z=Math.atan2(-f,i)):(this._y=0,this._z=Math.atan2(g,e))):"ZYX"===b?(this._y=Math.asin(-c(m)),0.99999>Math.abs(m)?(this._x=Math.atan2(l,d),this._z=Math.atan2(g,e)):(this._x=0,this._z=Math.atan2(-f,i))):"YZX"===b?(this._z= + Math.asin(c(g)),0.99999>Math.abs(g)?(this._x=Math.atan2(-k,i),this._y=Math.atan2(-m,e)):(this._x=0,this._y=Math.atan2(h,d))):"XZY"===b?(this._z=Math.asin(-c(f)),0.99999>Math.abs(f)?(this._x=Math.atan2(l,i),this._y=Math.atan2(h,e)):(this._x=Math.atan2(-k,d),this._y=0)):console.warn("WARNING: Euler.setFromRotationMatrix() given unsupported order: "+b);this._order=b;this._updateQuaternion();return this},setFromQuaternion:function(a,b,c){function d(a){return Math.min(Math.max(a,-1),1)}var e=a.x*a.x,f= + a.y*a.y,h=a.z*a.z,g=a.w*a.w,b=b||this._order;"XYZ"===b?(this._x=Math.atan2(2*(a.x*a.w-a.y*a.z),g-e-f+h),this._y=Math.asin(d(2*(a.x*a.z+a.y*a.w))),this._z=Math.atan2(2*(a.z*a.w-a.x*a.y),g+e-f-h)):"YXZ"===b?(this._x=Math.asin(d(2*(a.x*a.w-a.y*a.z))),this._y=Math.atan2(2*(a.x*a.z+a.y*a.w),g-e-f+h),this._z=Math.atan2(2*(a.x*a.y+a.z*a.w),g-e+f-h)):"ZXY"===b?(this._x=Math.asin(d(2*(a.x*a.w+a.y*a.z))),this._y=Math.atan2(2*(a.y*a.w-a.z*a.x),g-e-f+h),this._z=Math.atan2(2*(a.z*a.w-a.x*a.y),g-e+f-h)):"ZYX"=== + b?(this._x=Math.atan2(2*(a.x*a.w+a.z*a.y),g-e-f+h),this._y=Math.asin(d(2*(a.y*a.w-a.x*a.z))),this._z=Math.atan2(2*(a.x*a.y+a.z*a.w),g+e-f-h)):"YZX"===b?(this._x=Math.atan2(2*(a.x*a.w-a.z*a.y),g-e+f-h),this._y=Math.atan2(2*(a.y*a.w-a.x*a.z),g+e-f-h),this._z=Math.asin(d(2*(a.x*a.y+a.z*a.w)))):"XZY"===b?(this._x=Math.atan2(2*(a.x*a.w+a.y*a.z),g-e+f-h),this._y=Math.atan2(2*(a.x*a.z+a.y*a.w),g+e-f-h),this._z=Math.asin(d(2*(a.z*a.w-a.x*a.y)))):console.warn("WARNING: Euler.setFromQuaternion() given unsupported order: "+ + b);this._order=b;!1!==c&&this._updateQuaternion();return this},reorder:function(){var a=new THREE.Quaternion;return function(b){a.setFromEuler(this);this.setFromQuaternion(a,b)}}(),fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this._updateQuaternion();return this},toArray:function(){return[this._x,this._y,this._z,this._order]},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},clone:function(){return new THREE.Euler(this._x, + this._y,this._z,this._order)}};THREE.Line3=function(a,b){this.start=void 0!==a?a:new THREE.Vector3;this.end=void 0!==b?b:new THREE.Vector3}; + THREE.Line3.prototype={constructor:THREE.Line3,set:function(a,b){this.start.copy(a);this.end.copy(b);return this},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},center:function(a){return(a||new THREE.Vector3).addVectors(this.start,this.end).multiplyScalar(0.5)},delta:function(a){return(a||new THREE.Vector3).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a, + b){var c=b||new THREE.Vector3;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=THREE.Math.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new THREE.Vector3;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a); + this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)},clone:function(){return(new THREE.Line3).copy(this)}};THREE.Box2=function(a,b){this.min=void 0!==a?a:new THREE.Vector2(Infinity,Infinity);this.max=void 0!==b?b:new THREE.Vector2(-Infinity,-Infinity)}; + THREE.Box2.prototype={constructor:THREE.Box2,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){if(0this.max.x&&(this.max.x=b.x),b.ythis.max.y&&(this.max.y=b.y)}else this.makeEmpty();return this},setFromCenterAndSize:function(){var a=new THREE.Vector2;return function(b,c){var d=a.copy(c).multiplyScalar(0.5); + this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},empty:function(){return this.max.xthis.max.x||a.ythis.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y?!0:!1},getParameter:function(a){return new THREE.Vector2((a.x-this.min.x)/(this.max.x-this.min.x), + (a.y-this.min.y)/(this.max.y-this.min.y))},isIntersectionBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y?!1:!0},clampPoint:function(a,b){return(b||new THREE.Vector2).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new THREE.Vector2;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max); + return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)},clone:function(){return(new THREE.Box2).copy(this)}};THREE.Box3=function(a,b){this.min=void 0!==a?a:new THREE.Vector3(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new THREE.Vector3(-Infinity,-Infinity,-Infinity)}; + THREE.Box3.prototype={constructor:THREE.Box3,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},addPoint:function(a){a.xthis.max.x&&(this.max.x=a.x);a.ythis.max.y&&(this.max.y=a.y);a.zthis.max.z&&(this.max.z=a.z)},setFromPoints:function(a){if(0this.max.x||a.ythis.max.y||a.zthis.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z?!0:!1},getParameter:function(a){return new THREE.Vector3((a.x-this.min.x)/(this.max.x-this.min.x), + (a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},isIntersectionBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y||a.max.zthis.max.z?!1:!0},clampPoint:function(a,b){return(b||new THREE.Vector3).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new THREE.Vector3;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a= + new THREE.Vector3;return function(b){b=b||new THREE.Sphere;b.center=this.center();b.radius=0.5*this.size(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];return function(b){a[0].set(this.min.x,this.min.y, + this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.makeEmpty();this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a); + this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)},clone:function(){return(new THREE.Box3).copy(this)}};THREE.Matrix3=function(a,b,c,d,e,f,h,g,i){this.elements=new Float32Array(9);this.set(void 0!==a?a:1,b||0,c||0,d||0,void 0!==e?e:1,f||0,h||0,g||0,void 0!==i?i:1)}; + THREE.Matrix3.prototype={constructor:THREE.Matrix3,set:function(a,b,c,d,e,f,h,g,i){var k=this.elements;k[0]=a;k[3]=b;k[6]=c;k[1]=d;k[4]=e;k[7]=f;k[2]=h;k[5]=g;k[8]=i;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[3],a[6],a[1],a[4],a[7],a[2],a[5],a[8]);return this},multiplyVector3:function(a){console.warn("DEPRECATED: Matrix3's .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)}, + multiplyVector3Array:function(){var a=new THREE.Vector3;return function(b){for(var c=0,d=b.length;cd?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)},distanceToPoint:function(){var a=new THREE.Vector3;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceTo(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceTo(b)}}(),distanceSqToSegment:function(a,b,c,d){var e=a.clone().add(b).multiplyScalar(0.5),f=b.clone().sub(a).normalize(),h=0.5*a.distanceTo(b), + g=this.origin.clone().sub(e),a=-this.direction.dot(f),b=g.dot(this.direction),i=-g.dot(f),k=g.lengthSq(),m=Math.abs(1-a*a),l,p;0<=m?(g=a*i-b,l=a*b-i,p=h*m,0<=g?l>=-p?l<=p?(h=1/m,g*=h,l*=h,a=g*(g+a*l+2*b)+l*(a*g+l+2*i)+k):(l=h,g=Math.max(0,-(a*l+b)),a=-g*g+l*(l+2*i)+k):(l=-h,g=Math.max(0,-(a*l+b)),a=-g*g+l*(l+2*i)+k):l<=-p?(g=Math.max(0,-(-a*h+b)),l=0a.normal.dot(this.direction)*b?!0:!1},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0==b)return 0==a.distanceToPoint(this.origin)? + 0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){var c=this.distanceToPlane(a);return null===c?null:this.at(c,b)},isIntersectionBox:function(){var a=new THREE.Vector3;return function(b){return null!==this.intersectBox(b,a)}}(),intersectBox:function(a,b){var c,d,e,f,h;d=1/this.direction.x;f=1/this.direction.y;h=1/this.direction.z;var g=this.origin;0<=d?(c=(a.min.x-g.x)*d,d*=a.max.x-g.x):(c=(a.max.x-g.x)*d,d*=a.min.x-g.x);0<=f?(e=(a.min.y-g.y)*f,f*= + a.max.y-g.y):(e=(a.max.y-g.y)*f,f*=a.min.y-g.y);if(c>f||e>d)return null;if(e>c||c!==c)c=e;if(fh||e>d)return null;if(e>c||c!==c)c=e;if(hd?null:this.at(0<=c?c:d,b)},intersectTriangle:function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3,d=new THREE.Vector3;return function(e,f,h,g,i){b.subVectors(f,e);c.subVectors(h,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0< + f){if(g)return null;g=1}else if(0>f)g=-1,f=-f;else return null;a.subVectors(this.origin,e);e=g*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;h=g*this.direction.dot(b.cross(a));if(0>h||e+h>f)return null;e=-g*a.dot(d);return 0>e?null:this.at(e/f,i)}}(),applyMatrix4:function(a){this.direction.add(this.origin).applyMatrix4(a);this.origin.applyMatrix4(a);this.direction.sub(this.origin);this.direction.normalize();return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}, + clone:function(){return(new THREE.Ray).copy(this)}};THREE.Sphere=function(a,b){this.center=void 0!==a?a:new THREE.Vector3;this.radius=void 0!==b?b:0}; + THREE.Sphere.prototype={constructor:THREE.Sphere,set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new THREE.Box3;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).center(d);for(var e=0,f=0,h=b.length;f=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<= + this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new THREE.Vector3;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));return d},getBoundingBox:function(a){a=a||new THREE.Box3;a.set(this.center,this.center);a.expandByScalar(this.radius); + return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius},clone:function(){return(new THREE.Sphere).copy(this)}};THREE.Frustum=function(a,b,c,d,e,f){this.planes=[void 0!==a?a:new THREE.Plane,void 0!==b?b:new THREE.Plane,void 0!==c?c:new THREE.Plane,void 0!==d?d:new THREE.Plane,void 0!==e?e:new THREE.Plane,void 0!==f?f:new THREE.Plane]}; + THREE.Frustum.prototype={constructor:THREE.Frustum,set:function(a,b,c,d,e,f){var h=this.planes;h[0].copy(a);h[1].copy(b);h[2].copy(c);h[3].copy(d);h[4].copy(e);h[5].copy(f);return this},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements,a=c[0],d=c[1],e=c[2],f=c[3],h=c[4],g=c[5],i=c[6],k=c[7],m=c[8],l=c[9],p=c[10],s=c[11],t=c[12],n=c[13],r=c[14],c=c[15];b[0].setComponents(f-a,k-h,s-m,c-t).normalize();b[1].setComponents(f+ + a,k+h,s+m,c+t).normalize();b[2].setComponents(f+d,k+g,s+l,c+n).normalize();b[3].setComponents(f-d,k-g,s-l,c-n).normalize();b[4].setComponents(f-e,k-i,s-p,c-r).normalize();b[5].setComponents(f+e,k+i,s+p,c+r).normalize();return this},intersectsObject:function(){var a=new THREE.Sphere;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere);a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){for(var b=this.planes, + c=a.center,a=-a.radius,d=0;6>d;d++)if(b[d].distanceToPoint(c)e;e++){var f=d[e];a.x=0h&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b= + this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0},clone:function(){return(new THREE.Frustum).copy(this)}};THREE.Plane=function(a,b){this.normal=void 0!==a?a:new THREE.Vector3(1,0,0);this.constant=void 0!==b?b:0}; + THREE.Plane.prototype={constructor:THREE.Plane,set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d, + c);return this}}(),copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return this.orthoPoint(a,b).sub(a).negate()},orthoPoint:function(a, + b){var c=this.distanceToPoint(a);return(b||new THREE.Vector3).copy(this.normal).multiplyScalar(c)},isIntersectionLine:function(a){var b=this.distanceToPoint(a.start),a=this.distanceToPoint(a.end);return 0>b&&0a&&0f||1e;e++)8==e||13==e||18==e||23==e?b[e]="-":14==e?b[e]="4":(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,b[e]=a[19==e?d&3|8:d]);return b.join("")}}(),clamp:function(a,b,c){return ac?c:a},clampBottom:function(a,b){return a=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return 0>a?-1:0this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1: + f+2;k=this.points[c[0]];m=this.points[c[1]];l=this.points[c[2]];p=this.points[c[3]];g=h*h;i=h*g;d.x=b(k.x,m.x,l.x,p.x,h,g,i);d.y=b(k.y,m.y,l.y,p.y,h,g,i);d.z=b(k.z,m.z,l.z,p.z,h,g,i);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a=b.x+b.y}}(); + THREE.Triangle.prototype={constructor:THREE.Triangle,set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return 0.5*a.cross(b).length()}}(),midpoint:function(a){return(a|| + new THREE.Vector3).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return THREE.Triangle.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new THREE.Plane).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return THREE.Triangle.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return THREE.Triangle.containsPoint(a,this.a,this.b,this.c)},equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}, + clone:function(){return(new THREE.Triangle).copy(this)}};THREE.Vertex=function(a){console.warn("THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.");return a};THREE.UV=function(a,b){console.warn("THREE.UV has been DEPRECATED. Use THREE.Vector2 instead.");return new THREE.Vector2(a,b)};THREE.Clock=function(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}; + THREE.Clock.prototype={constructor:THREE.Clock,start:function(){this.oldTime=this.startTime=void 0!==self.performance&&void 0!==self.performance.now?self.performance.now():Date.now();this.running=!0},stop:function(){this.getElapsedTime();this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=void 0!==self.performance&&void 0!==self.performance.now?self.performance.now():Date.now(), + a=0.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime+=a}return a}};THREE.EventDispatcher=function(){}; + THREE.EventDispatcher.prototype={constructor:THREE.EventDispatcher,apply:function(a){a.addEventListener=THREE.EventDispatcher.prototype.addEventListener;a.hasEventListener=THREE.EventDispatcher.prototype.hasEventListener;a.removeEventListener=THREE.EventDispatcher.prototype.removeEventListener;a.dispatchEvent=THREE.EventDispatcher.prototype.dispatchEvent},addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&& + c[a].push(b)},hasEventListener:function(a,b){if(void 0===this._listeners)return!1;var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)?!0:!1},removeEventListener:function(a,b){if(void 0!==this._listeners){var c=this._listeners,d=c[a].indexOf(b);-1!==d&&c[a].splice(d,1)}},dispatchEvent:function(){var a=[];return function(b){if(void 0!==this._listeners){var c=this._listeners[b.type];if(void 0!==c){b.target=this;for(var d=c.length,e=0;ef.scale.x)return s;s.push({distance:t,point:f.position,face:null,object:f})}else if(f instanceof + a.LOD)d.getPositionFromMatrix(f.matrixWorld),t=m.ray.origin.distanceTo(d),k(f.getObjectForDistance(t),m,s);else if(f instanceof a.Mesh){var n=f.geometry;null===n.boundingSphere&&n.computeBoundingSphere();b.copy(n.boundingSphere);b.applyMatrix4(f.matrixWorld);if(!1===m.ray.isIntersectionSphere(b))return s;e.getInverse(f.matrixWorld);c.copy(m.ray).applyMatrix4(e);if(null!==n.boundingBox&&!1===c.isIntersectionBox(n.boundingBox))return s;if(n instanceof a.BufferGeometry){var r=f.material;if(void 0=== + r||!1===n.dynamic)return s;var q,u,w=m.precision;if(void 0!==n.attributes.index)for(var z=n.offsets,B=n.attributes.index.array,D=n.attributes.position.array,x=n.offsets.length,F=n.attributes.index.array.length/3,F=0;Fm.far)||s.push({distance:t,point:q,face:null,faceIndex:null,object:f}));else{D=n.attributes.position.array;F=n.attributes.position.array.length;for(n=0;nm.far)||s.push({distance:t,point:q,face:null,faceIndex:null,object:f}))}}else if(n instanceof a.Geometry){B=f.material instanceof a.MeshFaceMaterial;D=!0===B?f.material.materials:null;w=m.precision;z=n.vertices;x=0;for(F=n.faces.length;xm.far)||s.push({distance:t,point:q,face:A,faceIndex:x,object:f})))}}else if(f instanceof a.Line){w=m.linePrecision;r=w*w;n=f.geometry;null===n.boundingSphere&&n.computeBoundingSphere();b.copy(n.boundingSphere);b.applyMatrix4(f.matrixWorld);if(!1===m.ray.isIntersectionSphere(b))return s;e.getInverse(f.matrixWorld);c.copy(m.ray).applyMatrix4(e);if(n instanceof a.Geometry){z=n.vertices;w=z.length;q=new a.Vector3;u=new a.Vector3;F=f.type===a.LineStrip?1: + 2;for(n=0;nr||(t=c.origin.distanceTo(u),tm.far||s.push({distance:t,point:q.clone().applyMatrix4(f.matrixWorld),face:null,faceIndex:null,object:f}))}}},m=function(a,b,c){for(var a=a.getDescendants(),d=0,e=a.length;de&&0>f||0>h&&0>g)return!1;0>e?c=Math.max(c,e/(e-f)):0>f&&(d=Math.min(d,e/(e-f)));0>h?c=Math.max(c,h/(h-g)):0>g&&(d=Math.min(d,h/(h-g)));if(dg.positionScreen.x||1g.positionScreen.y||1g.positionScreen.z||1< + g.positionScreen.z)}ea=0;for(F=ta.length;ea(ia.positionScreen.x-V.positionScreen.x)*(P.positionScreen.y-V.positionScreen.y)-(ia.positionScreen.y-V.positionScreen.y)*(P.positionScreen.x-V.positionScreen.x),Z===THREE.DoubleSide|| + da===(Z===THREE.FrontSide)){if(p===t){var Da=new THREE.RenderableFace3;s.push(Da);t++;p++;l=Da}else l=s[p++];l.id=U.id;l.v1.copy(V);l.v2.copy(P);l.v3.copy(ia);l.normalModel.copy(M.normal);!1===da&&(Z===THREE.BackSide||Z===THREE.DoubleSide)&&l.normalModel.negate();l.normalModel.applyMatrix3(R).normalize();l.normalModelView.copy(l.normalModel).applyMatrix3(J);l.centroidModel.copy(M.centroid).applyMatrix4(v);ia=M.vertexNormals;V=0;for(P=Math.min(ia.length,3);VA.z&&(z===D?(ta=new THREE.RenderableSprite,B.push(ta),D++,z++,w=ta):w=B[z++],w.id=U.id,w.x=A.x*fa,w.y=A.y*fa,w.z=A.z,w.object=U,w.rotation=U.rotation,w.scale.x=U.scale.x*Math.abs(w.x-(A.x+f.projectionMatrix.elements[0])/(A.w+f.projectionMatrix.elements[12])), + w.scale.y=U.scale.y*Math.abs(w.y-(A.y+f.projectionMatrix.elements[5])/(A.w+f.projectionMatrix.elements[13])),w.material=U.material,x.elements.push(w)));!0===m&&x.elements.sort(b);return x}};THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=void 0!==f?f:0;this.centroid=new THREE.Vector3}; + THREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;bd?-1:1,e.vertexTangents[c]=new THREE.Vector4(z.x,z.y,z.z,d)}this.hasTangents=!0},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;cd;d++)if(e[d]==e[(d+1)%3]){a.push(f);break}}for(f=a.length-1;0<=f;f--){e=a[f];this.faces.splice(e,1);c=0;for(h=this.faceVertexUvs.length;cb.max.x&&(b.max.x=c),db.max.y&&(b.max.y=d),eb.max.z&&(b.max.z=e)}if(void 0===a||0===a.length)this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0)},computeBoundingSphere:function(){var a= + new THREE.Box3,b=new THREE.Vector3;return function(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere);var c=this.attributes.position.array;if(c){for(var d=this.boundingSphere.center,e=0,f=c.length;eQ?-1:1;h[4*a]=J.x;h[4*a+1]=J.y;h[4*a+2]=J.z;h[4*a+3]=N}if(void 0===this.attributes.index||void 0===this.attributes.position||void 0===this.attributes.normal||void 0===this.attributes.uv)console.warn("Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()");else{var b=this.attributes.index.array,c=this.attributes.position.array,d=this.attributes.normal.array,e=this.attributes.uv.array,f=c.length/3;void 0===this.attributes.tangent&& + (this.attributes.tangent={itemSize:4,array:new Float32Array(4*f)});for(var h=this.attributes.tangent.array,g=[],i=[],k=0;ka.length?".":a.join("/"))+"/"},initMaterials:function(a,b){for(var c=[],d=0;da.opacity)i.transparent=a.transparent;void 0!==a.depthTest&&(i.depthTest=a.depthTest);void 0!==a.depthWrite&&(i.depthWrite=a.depthWrite);void 0!==a.visible&&(i.visible=a.visible);void 0!==a.flipSided&&(i.side=THREE.BackSide); + void 0!==a.doubleSided&&(i.side=THREE.DoubleSide);void 0!==a.wireframe&&(i.wireframe=a.wireframe);void 0!==a.vertexColors&&("face"===a.vertexColors?i.vertexColors=THREE.FaceColors:a.vertexColors&&(i.vertexColors=THREE.VertexColors));a.colorDiffuse?i.color=f(a.colorDiffuse):a.DbgColor&&(i.color=a.DbgColor);a.colorSpecular&&(i.specular=f(a.colorSpecular));a.colorAmbient&&(i.ambient=f(a.colorAmbient));a.transparency&&(i.opacity=a.transparency);a.specularCoef&&(i.shininess=a.specularCoef);a.mapDiffuse&& + b&&e(i,"map",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap,a.mapDiffuseAnisotropy);a.mapLight&&b&&e(i,"lightMap",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap,a.mapLightAnisotropy);a.mapBump&&b&&e(i,"bumpMap",a.mapBump,a.mapBumpRepeat,a.mapBumpOffset,a.mapBumpWrap,a.mapBumpAnisotropy);a.mapNormal&&b&&e(i,"normalMap",a.mapNormal,a.mapNormalRepeat,a.mapNormalOffset,a.mapNormalWrap,a.mapNormalAnisotropy);a.mapSpecular&&b&&e(i,"specularMap",a.mapSpecular,a.mapSpecularRepeat, + a.mapSpecularOffset,a.mapSpecularWrap,a.mapSpecularAnisotropy);a.mapBumpScale&&(i.bumpScale=a.mapBumpScale);a.mapNormal?(g=THREE.ShaderLib.normalmap,k=THREE.UniformsUtils.clone(g.uniforms),k.tNormal.value=i.normalMap,a.mapNormalFactor&&k.uNormalScale.value.set(a.mapNormalFactor,a.mapNormalFactor),i.map&&(k.tDiffuse.value=i.map,k.enableDiffuse.value=!0),i.specularMap&&(k.tSpecular.value=i.specularMap,k.enableSpecular.value=!0),i.lightMap&&(k.tAO.value=i.lightMap,k.enableAO.value=!0),k.uDiffuseColor.value.setHex(i.color), + k.uSpecularColor.value.setHex(i.specular),k.uAmbientColor.value.setHex(i.ambient),k.uShininess.value=i.shininess,void 0!==i.opacity&&(k.uOpacity.value=i.opacity),g=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:k,lights:!0,fog:!0}),i.transparent&&(g.transparent=!0)):g=new THREE[g](i);void 0!==a.DbgName&&(g.name=a.DbgName);return g}};THREE.XHRLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager}; + THREE.XHRLoader.prototype={constructor:THREE.XHRLoader,load:function(a,b,c,d){var e=this,f=new XMLHttpRequest;void 0!==b&&f.addEventListener("load",function(c){b(c.target.responseText);e.manager.itemEnd(a)},!1);void 0!==c&&f.addEventListener("progress",function(a){c(a)},!1);void 0!==d&&f.addEventListener("error",function(a){d(a)},!1);void 0!==this.crossOrigin&&(f.crossOrigin=this.crossOrigin);f.open("GET",a,!0);f.send(null);e.manager.itemStart(a)},setCrossOrigin:function(a){this.crossOrigin=a}};THREE.ImageLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager}; + THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b,c,d){var e=this,f=document.createElement("img");void 0!==b&&f.addEventListener("load",function(){e.manager.itemEnd(a);b(this)},!1);void 0!==c&&f.addEventListener("progress",function(a){c(a)},!1);void 0!==d&&f.addEventListener("error",function(a){d(a)},!1);void 0!==this.crossOrigin&&(f.crossOrigin=this.crossOrigin);f.src=a;e.manager.itemStart(a);return f},setCrossOrigin:function(a){this.crossOrigin=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a);this.withCredentials=!1};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);THREE.JSONLoader.prototype.load=function(a,b,c){c=c&&"string"===typeof c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)}; + THREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,h=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(200===f.status||0===f.status){if(f.responseText){var g=JSON.parse(f.responseText),g=a.parse(g,d);c(g.geometry,g.materials)}else console.warn("THREE.JSONLoader: ["+b+"] seems to be unreachable or file there is empty");a.onLoadComplete()}else console.error("THREE.JSONLoader: Couldn't load ["+b+"] ["+f.status+"]");else f.readyState===f.LOADING?e&&(0===h&& + (h=f.getResponseHeader("Content-Length")),e({total:h,loaded:f.responseText.length})):f.readyState===f.HEADERS_RECEIVED&&void 0!==e&&(h=f.getResponseHeader("Content-Length"))};f.open("GET",b,!0);f.withCredentials=this.withCredentials;f.send(null)}; + THREE.JSONLoader.prototype.parse=function(a,b){var c=new THREE.Geometry,d=void 0!==a.scale?1/a.scale:1,e,f,h,g,i,k,m,l,p,s,t,n,r,q,u=a.faces;p=a.vertices;var w=a.normals,z=a.colors,B=0;if(void 0!==a.uvs){for(e=0;ef;f++)l=u[g++],q=r[2*l],l=r[2*l+1],q=new THREE.Vector2(q,l),2!==f&&c.faceVertexUvs[e][h].push(q),0!==f&&c.faceVertexUvs[e][h+1].push(q)}m&&(m=3*u[g++],s.normal.set(w[m++],w[m++],w[m]),n.normal.copy(s.normal));if(t)for(e=0;4>e;e++)m=3*u[g++],t=new THREE.Vector3(w[m++], + w[m++],w[m]),2!==e&&s.vertexNormals.push(t),0!==e&&n.vertexNormals.push(t);k&&(k=u[g++],k=z[k],s.color.setHex(k),n.color.setHex(k));if(p)for(e=0;4>e;e++)k=u[g++],k=z[k],2!==e&&s.vertexColors.push(new THREE.Color(k)),0!==e&&n.vertexColors.push(new THREE.Color(k));c.faces.push(s);c.faces.push(n)}else{s=new THREE.Face3;s.a=u[g++];s.b=u[g++];s.c=u[g++];h&&(h=u[g++],s.materialIndex=h);h=c.faces.length;if(e)for(e=0;ef;f++)l=u[g++],q=r[2*l],l=r[2*l+1], + q=new THREE.Vector2(q,l),c.faceVertexUvs[e][h].push(q)}m&&(m=3*u[g++],s.normal.set(w[m++],w[m++],w[m]));if(t)for(e=0;3>e;e++)m=3*u[g++],t=new THREE.Vector3(w[m++],w[m++],w[m]),s.vertexNormals.push(t);k&&(k=u[g++],s.color.setHex(z[k]));if(p)for(e=0;3>e;e++)k=u[g++],s.vertexColors.push(new THREE.Color(z[k]));c.faces.push(s)}if(a.skinWeights){g=0;for(i=a.skinWeights.length;gG.parameters.opacity&&(G.parameters.transparent=!0);G.parameters.normalMap?(E=THREE.ShaderLib.normalmap,y=THREE.UniformsUtils.clone(E.uniforms), + q=G.parameters.color,v=G.parameters.specular,r=G.parameters.ambient,I=G.parameters.shininess,y.tNormal.value=A.textures[G.parameters.normalMap],G.parameters.normalScale&&y.uNormalScale.value.set(G.parameters.normalScale[0],G.parameters.normalScale[1]),G.parameters.map&&(y.tDiffuse.value=G.parameters.map,y.enableDiffuse.value=!0),G.parameters.envMap&&(y.tCube.value=G.parameters.envMap,y.enableReflection.value=!0,y.uReflectivity.value=G.parameters.reflectivity),G.parameters.lightMap&&(y.tAO.value=G.parameters.lightMap, + y.enableAO.value=!0),G.parameters.specularMap&&(y.tSpecular.value=A.textures[G.parameters.specularMap],y.enableSpecular.value=!0),G.parameters.displacementMap&&(y.tDisplacement.value=A.textures[G.parameters.displacementMap],y.enableDisplacement.value=!0,y.uDisplacementBias.value=G.parameters.displacementBias,y.uDisplacementScale.value=G.parameters.displacementScale),y.uDiffuseColor.value.setHex(q),y.uSpecularColor.value.setHex(v),y.uAmbientColor.value.setHex(r),y.uShininess.value=I,G.parameters.opacity&& + (y.uOpacity.value=G.parameters.opacity),t=new THREE.ShaderMaterial({fragmentShader:E.fragmentShader,vertexShader:E.vertexShader,uniforms:y,lights:!0,fog:!0})):t=new THREE[G.type](G.parameters);t.name=R;A.materials[R]=t}for(R in C.materials)if(G=C.materials[R],G.parameters.materials){J=[];for(q=0;qg.end&&(g.end=e);b||(b=h)}}a.firstAnimation=b}; + THREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){this.geometry.animations||(this.geometry.animations={});this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];c?(this.setFrameRange(c.start,c.end),this.duration=1E3*((c.end-c.start)/b),this.time=0):console.warn("animation["+a+"] undefined")}; + THREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time+=this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||0>this.time)this.direction*=-1,this.time>this.duration&&(this.time=this.duration,this.directionBackwards=!0),0>this.time&&(this.time=0,this.directionBackwards=!1)}else this.time%=this.duration,0>this.time&&(this.time+=this.duration);a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/b),0,this.length-1);a!==this.currentKeyframe&& + (this.morphTargetInfluences[this.lastKeyframe]=0,this.morphTargetInfluences[this.currentKeyframe]=1,this.morphTargetInfluences[a]=0,this.lastKeyframe=this.currentKeyframe,this.currentKeyframe=a);b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b}; + THREE.MorphAnimMesh.prototype.clone=function(a){void 0===a&&(a=new THREE.MorphAnimMesh(this.geometry,this.material));a.duration=this.duration;a.mirroredLoop=this.mirroredLoop;a.time=this.time;a.lastKeyframe=this.lastKeyframe;a.currentKeyframe=this.currentKeyframe;a.direction=this.direction;a.directionBackwards=this.directionBackwards;THREE.Mesh.prototype.clone.call(this,a);return a};THREE.LOD=function(){THREE.Object3D.call(this);this.objects=[]};THREE.LOD.prototype=Object.create(THREE.Object3D.prototype);THREE.LOD.prototype.addLevel=function(a,b){void 0===b&&(b=0);for(var b=Math.abs(b),c=0;c=this.objects[d].distance)this.objects[d-1].object.visible=!1,this.objects[d].object.visible=!0;else break;for(;d=g||(g*=f.intensity,c.add(La.multiplyScalar(g)))}else f instanceof THREE.PointLight&&(h=ua.getPositionFromMatrix(f.matrixWorld),g=b.dot(ua.subVectors(h,a).normalize()),0>=g||(g*=0==f.distance?1:1-Math.min(a.distanceTo(h)/f.distance,1),0!=g&&(g*=f.intensity,c.add(La.multiplyScalar(g)))))}} + function c(a,b,c,d){m(b);l(c);p(d);s(a.getStyle());C.stroke();ra.expandByScalar(2*b)}function d(a){t(a.getStyle());C.fill()}function e(a,b,c,e,f,h,g,j,i,k,m,l,p){if(!(p instanceof THREE.DataTexture||void 0===p.image||0==p.image.width)){if(!0===p.needsUpdate){var n=p.wrapS==THREE.RepeatWrapping,r=p.wrapT==THREE.RepeatWrapping;Ga[p.id]=C.createPattern(p.image,!0===n&&!0===r?"repeat":!0===n&&!1===r?"repeat-x":!1===n&&!0===r?"repeat-y":"no-repeat");p.needsUpdate=!1}void 0===Ga[p.id]?t("rgba(0,0,0,1)"): + t(Ga[p.id]);var n=p.offset.x/p.repeat.x,r=p.offset.y/p.repeat.y,s=p.image.width*p.repeat.x,q=p.image.height*p.repeat.y,g=(g+n)*s,j=(1-j+r)*q,c=c-a,e=e-b,f=f-a,h=h-b,i=(i+n)*s-g,k=(1-k+r)*q-j,m=(m+n)*s-g,l=(1-l+r)*q-j,n=i*l-m*k;0===n?(void 0===fa[p.id]&&(b=document.createElement("canvas"),b.width=p.image.width,b.height=p.image.height,b=b.getContext("2d"),b.drawImage(p.image,0,0),fa[p.id]=b.getImageData(0,0,p.image.width,p.image.height).data),b=fa[p.id],g=4*(Math.floor(g)+Math.floor(j)*p.image.width), + V.setRGB(b[g]/255,b[g+1]/255,b[g+2]/255),d(V)):(n=1/n,p=(l*c-k*f)*n,k=(l*e-k*h)*n,c=(i*f-m*c)*n,e=(i*h-m*e)*n,a=a-p*g-c*j,g=b-k*g-e*j,C.save(),C.transform(p,k,c,e,a,g),C.fill(),C.restore())}}function f(a,b,c,d,e,f,h,g,j,i,k,m,l){var p,n;p=l.width-1;n=l.height-1;h*=p;g*=n;c-=a;d-=b;e-=a;f-=b;j=j*p-h;i=i*n-g;k=k*p-h;m=m*n-g;n=1/(j*m-k*i);p=(m*c-i*e)*n;i=(m*d-i*f)*n;c=(j*e-k*c)*n;d=(j*f-k*d)*n;a=a-p*h-c*g;b=b-i*h-d*g;C.save();C.transform(p,i,c,d,a,b);C.clip();C.drawImage(l,0,0);C.restore()}function h(a, + b,c,d){va[0]=255*a.r|0;va[1]=255*a.g|0;va[2]=255*a.b|0;va[4]=255*b.r|0;va[5]=255*b.g|0;va[6]=255*b.b|0;va[8]=255*c.r|0;va[9]=255*c.g|0;va[10]=255*c.b|0;va[12]=255*d.r|0;va[13]=255*d.g|0;va[14]=255*d.b|0;j.putImageData(Oa,0,0);Ea.drawImage(Pa,0,0);return wa}function g(a,b,c){var d=b.x-a.x,e=b.y-a.y,f=d*d+e*e;0!==f&&(c/=Math.sqrt(f),d*=c,e*=c,b.x+=d,b.y+=e,a.x-=d,a.y-=e)}function i(a){y!==a&&(y=C.globalAlpha=a)}function k(a){v!==a&&(a===THREE.NormalBlending?C.globalCompositeOperation="source-over": + a===THREE.AdditiveBlending?C.globalCompositeOperation="lighter":a===THREE.SubtractiveBlending&&(C.globalCompositeOperation="darker"),v=a)}function m(a){J!==a&&(J=C.lineWidth=a)}function l(a){ba!==a&&(ba=C.lineCap=a)}function p(a){oa!==a&&(oa=C.lineJoin=a)}function s(a){G!==a&&(G=C.strokeStyle=a)}function t(a){R!==a&&(R=C.fillStyle=a)}function n(a,b){if(pa!==a||N!==b)C.setLineDash([a,b]),pa=a,N=b}console.log("THREE.CanvasRenderer",THREE.REVISION);var r=THREE.Math.smoothstep,a=a||{},q=this,u,w,z,B= + new THREE.Projector,D=void 0!==a.canvas?a.canvas:document.createElement("canvas"),x=D.width,F=D.height,A=Math.floor(x/2),O=Math.floor(F/2),C=D.getContext("2d"),E=new THREE.Color(0),I=0,y=1,v=0,G=null,R=null,J=null,ba=null,oa=null,pa=null,N=0,M,Q,K,ca;new THREE.RenderableVertex;new THREE.RenderableVertex;var Fa,Ba,da,Aa,$,ea,V=new THREE.Color,P=new THREE.Color,Z=new THREE.Color,U=new THREE.Color,ka=new THREE.Color,ta=new THREE.Color,ia=new THREE.Color,La=new THREE.Color,Ga={},fa={},Da,Ua,Qa,xa,bb, + cb,Ma,fb,sb,pb,Ha=new THREE.Box2,la=new THREE.Box2,ra=new THREE.Box2,gb=new THREE.Color,sa=new THREE.Color,ga=new THREE.Color,ua=new THREE.Vector3,Pa,j,Oa,va,wa,Ea,Ra=16;Pa=document.createElement("canvas");Pa.width=Pa.height=2;j=Pa.getContext("2d");j.fillStyle="rgba(0,0,0,1)";j.fillRect(0,0,2,2);Oa=j.getImageData(0,0,2,2);va=Oa.data;wa=document.createElement("canvas");wa.width=wa.height=Ra;Ea=wa.getContext("2d");Ea.translate(-Ra/2,-Ra/2);Ea.scale(Ra,Ra);Ra--;void 0===C.setLineDash&&(C.setLineDash= + void 0!==C.mozDash?function(a){C.mozDash=null!==a[0]?a:null}:function(){});this.domElement=D;this.devicePixelRatio=void 0!==a.devicePixelRatio?a.devicePixelRatio:void 0!==self.devicePixelRatio?self.devicePixelRatio:1;this.sortElements=this.sortObjects=this.autoClear=!0;this.info={render:{vertices:0,faces:0}};this.supportsVertexTextures=function(){};this.setFaceCulling=function(){};this.setSize=function(a,b,c){x=a*this.devicePixelRatio;F=b*this.devicePixelRatio;A=Math.floor(x/2);O=Math.floor(F/2); + D.width=x;D.height=F;1!==this.devicePixelRatio&&!1!==c&&(D.style.width=a+"px",D.style.height=b+"px");Ha.set(new THREE.Vector2(-A,-O),new THREE.Vector2(A,O));la.set(new THREE.Vector2(-A,-O),new THREE.Vector2(A,O));y=1;v=0;oa=ba=J=R=G=null};this.setClearColor=function(a,b){E.set(a);I=void 0!==b?b:1;la.set(new THREE.Vector2(-A,-O),new THREE.Vector2(A,O))};this.setClearColorHex=function(a,b){console.warn("DEPRECATED: .setClearColorHex() is being removed. Use .setClearColor() instead.");this.setClearColor(a, + b)};this.getMaxAnisotropy=function(){return 0};this.clear=function(){C.setTransform(1,0,0,-1,A,O);!1===la.empty()&&(la.intersect(Ha),la.expandByScalar(2),1>I&&C.clearRect(la.min.x|0,la.min.y|0,la.max.x-la.min.x|0,la.max.y-la.min.y|0),0>1,ba=I.height>>1,N=F.scale.x*A,E=F.scale.y*O,x=N*R,v=E*ba,ra.min.set(y.x-x,y.y-v),ra.max.set(y.x+x,y.y+v),!1===Ha.isIntersectionBox(ra)?ra.makeEmpty():(C.save(),C.translate(y.x,y.y),C.rotate(-F.rotation), + C.scale(N,-E),C.translate(-R,-ba),C.drawImage(I,0,0),C.restore())):(N=F.object.scale.x,E=F.object.scale.y,N*=F.scale.x*A,E*=F.scale.y*O,ra.min.set(y.x-N,y.y-E),ra.max.set(y.x+N,y.y+E),!1===Ha.isIntersectionBox(ra)?ra.makeEmpty():(t(J.color.getStyle()),C.save(),C.translate(y.x,y.y),C.rotate(-F.rotation),C.scale(N,E),C.fillRect(-1,-1,2,2),C.restore())):J instanceof THREE.SpriteCanvasMaterial&&(x=F.scale.x*A,v=F.scale.y*O,ra.min.set(y.x-x,y.y-v),ra.max.set(y.x+x,y.y+v),!1===Ha.isIntersectionBox(ra)? + ra.makeEmpty():(s(J.color.getStyle()),t(J.color.getStyle()),C.save(),C.translate(y.x,y.y),C.rotate(-F.rotation),C.scale(x,v),J.program(C),C.restore()))}else if(x instanceof THREE.RenderableLine){if(Q=x.v1,K=x.v2,Q.positionScreen.x*=A,Q.positionScreen.y*=O,K.positionScreen.x*=A,K.positionScreen.y*=O,ra.setFromPoints([Q.positionScreen,K.positionScreen]),!0===Ha.isIntersectionBox(ra))if(y=Q,F=K,J=x,x=v,i(x.opacity),k(x.blending),C.beginPath(),C.moveTo(y.positionScreen.x,y.positionScreen.y),C.lineTo(F.positionScreen.x, + F.positionScreen.y),x instanceof THREE.LineBasicMaterial){m(x.linewidth);l(x.linecap);p(x.linejoin);if(x.vertexColors!==THREE.VertexColors)s(x.color.getStyle());else if(v=J.vertexColors[0].getStyle(),J=J.vertexColors[1].getStyle(),v===J)s(v);else{try{var fa=C.createLinearGradient(y.positionScreen.x,y.positionScreen.y,F.positionScreen.x,F.positionScreen.y);fa.addColorStop(0,v);fa.addColorStop(1,J)}catch(oa){fa=v}s(fa)}C.stroke();ra.expandByScalar(2*x.linewidth)}else x instanceof THREE.LineDashedMaterial&& + (m(x.linewidth),l(x.linecap),p(x.linejoin),s(x.color.getStyle()),n(x.dashSize,x.gapSize),C.stroke(),ra.expandByScalar(2*x.linewidth),n(null,null))}else if(x instanceof THREE.RenderableFace3){Q=x.v1;K=x.v2;ca=x.v3;if(-1>Q.positionScreen.z||1K.positionScreen.z||1ca.positionScreen.z||1 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_HEMI_LIGHTS > 0\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif", + lights_lambert_vertex:"vLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\nvLightBack = vec3( 0.0 );\n#endif\ntransformedNormal = normalize( transformedNormal );\n#if MAX_DIR_LIGHTS > 0\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( transformedNormal, dirVector );\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\n#ifdef DOUBLE_SIDED\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\n#endif\n}\n#endif\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\nfloat dotProduct = dot( transformedNormal, lVector );\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\n#ifdef DOUBLE_SIDED\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - worldPosition.xyz ) );\nif ( spotEffect > spotLightAngleCos[ i ] ) {\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\nfloat dotProduct = dot( transformedNormal, lVector );\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\n#ifdef DOUBLE_SIDED\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_HEMI_LIGHTS > 0\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\nvec3 lVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( transformedNormal, lVector );\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\nfloat hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;\nvLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n#ifdef DOUBLE_SIDED\nvLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\n#endif\n}\n#endif\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\n#ifdef DOUBLE_SIDED\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\n#endif", + lights_phong_pars_vertex:"#ifndef PHONG_PER_PIXEL\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\nvarying vec3 vWorldPosition;\n#endif", + lights_phong_vertex:"#ifndef PHONG_PER_PIXEL\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nvPointLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nvSpotLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\nvWorldPosition = worldPosition.xyz;\n#endif", + lights_phong_pars_fragment:"uniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_HEMI_LIGHTS > 0\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n#ifdef PHONG_PER_PIXEL\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#else\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n#ifdef PHONG_PER_PIXEL\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n#else\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\nvarying vec3 vWorldPosition;\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;", + lights_phong_fragment:"vec3 normal = normalize( vNormal );\nvec3 viewPosition = normalize( vViewPosition );\n#ifdef DOUBLE_SIDED\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n#endif\n#ifdef USE_NORMALMAP\nnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\nnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n#if MAX_POINT_LIGHTS > 0\nvec3 pointDiffuse = vec3( 0.0 );\nvec3 pointSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n#ifdef PHONG_PER_PIXEL\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#else\nvec3 lVector = normalize( vPointLight[ i ].xyz );\nfloat lDistance = vPointLight[ i ].w;\n#endif\nfloat dotProduct = dot( normal, lVector );\n#ifdef WRAP_AROUND\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n#else\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\n#endif\npointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\nvec3 pointHalfVector = normalize( lVector + viewPosition );\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\nfloat pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\n#else\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nvec3 spotDiffuse = vec3( 0.0 );\nvec3 spotSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n#ifdef PHONG_PER_PIXEL\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#else\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\nfloat lDistance = vSpotLight[ i ].w;\n#endif\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\nif ( spotEffect > spotLightAngleCos[ i ] ) {\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\nfloat dotProduct = dot( normal, lVector );\n#ifdef WRAP_AROUND\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\n#else\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\n#endif\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\nvec3 spotHalfVector = normalize( lVector + viewPosition );\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\nfloat spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\n#else\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec3 dirDiffuse = vec3( 0.0 );\nvec3 dirSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, dirVector );\n#ifdef WRAP_AROUND\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\n#else\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\n#endif\ndirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\nfloat dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\n#else\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_HEMI_LIGHTS > 0\nvec3 hemiDiffuse = vec3( 0.0 );\nvec3 hemiSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\nvec3 lVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, lVector );\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\nvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\nhemiDiffuse += diffuse * hemiColor;\nvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\nfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\nfloat hemiSpecularWeightSky = specularStrength * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );\nvec3 lVectorGround = -lVector;\nvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\nfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\nfloat hemiSpecularWeightGround = specularStrength * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat dotProductGround = dot( normal, lVectorGround );\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );\nvec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\nhemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\n#else\nhemiSpecular += specular * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;\n#endif\n}\n#endif\nvec3 totalDiffuse = vec3( 0.0 );\nvec3 totalSpecular = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\ntotalDiffuse += dirDiffuse;\ntotalSpecular += dirSpecular;\n#endif\n#if MAX_HEMI_LIGHTS > 0\ntotalDiffuse += hemiDiffuse;\ntotalSpecular += hemiSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalDiffuse += pointDiffuse;\ntotalSpecular += pointSpecular;\n#endif\n#if MAX_SPOT_LIGHTS > 0\ntotalDiffuse += spotDiffuse;\ntotalSpecular += spotSpecular;\n#endif\n#ifdef METAL\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\n#endif", + color_pars_fragment:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_fragment:"#ifdef USE_COLOR\ngl_FragColor = gl_FragColor * vec4( vColor, 1.0 );\n#endif",color_pars_vertex:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n#ifdef GAMMA_INPUT\nvColor = color * color;\n#else\nvColor = color;\n#endif\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n#ifdef BONE_TEXTURE\nuniform sampler2D boneTexture;\nuniform int boneTextureWidth;\nuniform int boneTextureHeight;\nmat4 getBoneMatrix( const in float i ) {\nfloat j = i * 4.0;\nfloat x = mod( j, float( boneTextureWidth ) );\nfloat y = floor( j / float( boneTextureWidth ) );\nfloat dx = 1.0 / float( boneTextureWidth );\nfloat dy = 1.0 / float( boneTextureHeight );\ny = dy * ( y + 0.5 );\nvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\nvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\nvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\nvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\nmat4 bone = mat4( v1, v2, v3, v4 );\nreturn bone;\n}\n#else\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\nmat4 getBoneMatrix( const in float i ) {\nmat4 bone = boneGlobalMatrices[ int(i) ];\nreturn bone;\n}\n#endif\n#endif", + skinbase_vertex:"#ifdef USE_SKINNING\nmat4 boneMatX = getBoneMatrix( skinIndex.x );\nmat4 boneMatY = getBoneMatrix( skinIndex.y );\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n#ifdef USE_MORPHTARGETS\nvec4 skinVertex = vec4( morphed, 1.0 );\n#else\nvec4 skinVertex = vec4( position, 1.0 );\n#endif\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\nskinned \t += boneMatY * skinVertex * skinWeight.y;\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n#ifndef USE_MORPHNORMALS\nuniform float morphTargetInfluences[ 8 ];\n#else\nuniform float morphTargetInfluences[ 4 ];\n#endif\n#endif", + morphtarget_vertex:"#ifdef USE_MORPHTARGETS\nvec3 morphed = vec3( 0.0 );\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n#ifndef USE_MORPHNORMALS\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n#endif\nmorphed += position;\n#endif", + default_vertex:"vec4 mvPosition;\n#ifdef USE_SKINNING\nmvPosition = modelViewMatrix * skinned;\n#endif\n#if !defined( USE_SKINNING ) && defined( USE_MORPHTARGETS )\nmvPosition = modelViewMatrix * vec4( morphed, 1.0 );\n#endif\n#if !defined( USE_SKINNING ) && ! defined( USE_MORPHTARGETS )\nmvPosition = modelViewMatrix * vec4( position, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\nvec3 morphedNormal = vec3( 0.0 );\nmorphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\nmorphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\nmorphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\nmorphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\nmorphedNormal += normal;\n#endif", + skinnormal_vertex:"#ifdef USE_SKINNING\nmat4 skinMatrix = skinWeight.x * boneMatX;\nskinMatrix \t+= skinWeight.y * boneMatY;\n#ifdef USE_MORPHNORMALS\nvec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );\n#else\nvec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );\n#endif\n#endif",defaultnormal_vertex:"vec3 objectNormal;\n#ifdef USE_SKINNING\nobjectNormal = skinnedNormal.xyz;\n#endif\n#if !defined( USE_SKINNING ) && defined( USE_MORPHNORMALS )\nobjectNormal = morphedNormal;\n#endif\n#if !defined( USE_SKINNING ) && ! defined( USE_MORPHNORMALS )\nobjectNormal = normal;\n#endif\n#ifdef FLIP_SIDED\nobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;", + shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\nuniform float shadowDarkness[ MAX_SHADOWS ];\nuniform float shadowBias[ MAX_SHADOWS ];\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nfloat unpackDepth( const in vec4 rgba_depth ) {\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\nfloat depth = dot( rgba_depth, bit_shift );\nreturn depth;\n}\n#endif",shadowmap_fragment:"#ifdef USE_SHADOWMAP\n#ifdef SHADOWMAP_DEBUG\nvec3 frustumColors[3];\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\n#endif\n#ifdef SHADOWMAP_CASCADE\nint inFrustumCount = 0;\n#endif\nfloat fDepth;\nvec3 shadowColor = vec3( 1.0 );\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\nbool inFrustum = all( inFrustumVec );\n#ifdef SHADOWMAP_CASCADE\ninFrustumCount += int( inFrustum );\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\n#else\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n#endif\nbool frustumTest = all( frustumTestVec );\nif ( frustumTest ) {\nshadowCoord.z += shadowBias[ i ];\n#if defined( SHADOWMAP_TYPE_PCF )\nfloat shadow = 0.0;\nconst float shadowDelta = 1.0 / 9.0;\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\nfloat dx0 = -1.25 * xPixelOffset;\nfloat dy0 = -1.25 * yPixelOffset;\nfloat dx1 = 1.25 * xPixelOffset;\nfloat dy1 = 1.25 * yPixelOffset;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\nfloat shadow = 0.0;\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\nfloat dx0 = -1.0 * xPixelOffset;\nfloat dy0 = -1.0 * yPixelOffset;\nfloat dx1 = 1.0 * xPixelOffset;\nfloat dy1 = 1.0 * yPixelOffset;\nmat3 shadowKernel;\nmat3 depthKernel;\ndepthKernel[0][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\ndepthKernel[0][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\ndepthKernel[0][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\ndepthKernel[1][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\ndepthKernel[1][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\ndepthKernel[1][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\ndepthKernel[2][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\ndepthKernel[2][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\ndepthKernel[2][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\nvec3 shadowZ = vec3( shadowCoord.z );\nshadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));\nshadowKernel[0] *= vec3(0.25);\nshadowKernel[1] = vec3(lessThan(depthKernel[1], shadowZ ));\nshadowKernel[1] *= vec3(0.25);\nshadowKernel[2] = vec3(lessThan(depthKernel[2], shadowZ ));\nshadowKernel[2] *= vec3(0.25);\nvec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );\nshadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );\nshadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );\nvec4 shadowValues;\nshadowValues.x = mix( shadowKernel[0][1], shadowKernel[0][0], fractionalCoord.y );\nshadowValues.y = mix( shadowKernel[0][2], shadowKernel[0][1], fractionalCoord.y );\nshadowValues.z = mix( shadowKernel[1][1], shadowKernel[1][0], fractionalCoord.y );\nshadowValues.w = mix( shadowKernel[1][2], shadowKernel[1][1], fractionalCoord.y );\nshadow = dot( shadowValues, vec4( 1.0 ) );\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n#else\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\nfloat fDepth = unpackDepth( rgbaDepth );\nif ( fDepth < shadowCoord.z )\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\n#endif\n}\n#ifdef SHADOWMAP_DEBUG\n#ifdef SHADOWMAP_CASCADE\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\n#else\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\n#endif\n#endif\n}\n#ifdef GAMMA_OUTPUT\nshadowColor *= shadowColor;\n#endif\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\n#endif", + shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n}\n#endif",alphatest_fragment:"#ifdef ALPHATEST\nif ( gl_FragColor.a < ALPHATEST ) discard;\n#endif",linear_to_gamma_fragment:"#ifdef GAMMA_OUTPUT\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\n#endif"}; + THREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b dashSize ) {\ndiscard;\n}\ngl_FragColor = vec4( diffuse, opacity );",THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.fog_fragment,"}"].join("\n")},depth:{uniforms:{mNear:{type:"f",value:1},mFar:{type:"f",value:2E3},opacity:{type:"f", + value:1}},vertexShader:"void main() {\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"uniform float mNear;\nuniform float mFar;\nuniform float opacity;\nvoid main() {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\ngl_FragColor = vec4( vec3( color ), opacity );\n}"},normal:{uniforms:{opacity:{type:"f",value:1}},vertexShader:["varying vec3 vNormal;",THREE.ShaderChunk.morphtarget_pars_vertex,"void main() {\nvNormal = normalize( normalMatrix * normal );", + THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,"}"].join("\n"),fragmentShader:"uniform float opacity;\nvarying vec3 vNormal;\nvoid main() {\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\n}"},normalmap:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:"i",value:0},enableDiffuse:{type:"i",value:0},enableSpecular:{type:"i",value:0},enableReflection:{type:"i",value:0},enableDisplacement:{type:"i", + value:0},tDisplacement:{type:"t",value:null},tDiffuse:{type:"t",value:null},tCube:{type:"t",value:null},tNormal:{type:"t",value:null},tSpecular:{type:"t",value:null},tAO:{type:"t",value:null},uNormalScale:{type:"v2",value:new THREE.Vector2(1,1)},uDisplacementBias:{type:"f",value:0},uDisplacementScale:{type:"f",value:1},uDiffuseColor:{type:"c",value:new THREE.Color(16777215)},uSpecularColor:{type:"c",value:new THREE.Color(1118481)},uAmbientColor:{type:"c",value:new THREE.Color(16777215)},uShininess:{type:"f", + value:30},uOpacity:{type:"f",value:1},useRefract:{type:"i",value:0},uRefractionRatio:{type:"f",value:0.98},uReflectivity:{type:"f",value:0.5},uOffset:{type:"v2",value:new THREE.Vector2(0,0)},uRepeat:{type:"v2",value:new THREE.Vector2(1,1)},wrapRGB:{type:"v3",value:new THREE.Vector3(1,1,1)}}]),fragmentShader:["uniform vec3 uAmbientColor;\nuniform vec3 uDiffuseColor;\nuniform vec3 uSpecularColor;\nuniform float uShininess;\nuniform float uOpacity;\nuniform bool enableDiffuse;\nuniform bool enableSpecular;\nuniform bool enableAO;\nuniform bool enableReflection;\nuniform sampler2D tDiffuse;\nuniform sampler2D tNormal;\nuniform sampler2D tSpecular;\nuniform sampler2D tAO;\nuniform samplerCube tCube;\nuniform vec2 uNormalScale;\nuniform bool useRefract;\nuniform float uRefractionRatio;\nuniform float uReflectivity;\nvarying vec3 vTangent;\nvarying vec3 vBinormal;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nuniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_HEMI_LIGHTS > 0\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif\nvarying vec3 vWorldPosition;\nvarying vec3 vViewPosition;", + THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,"void main() {\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\nvec3 specularTex = vec3( 1.0 );\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\nnormalTex.xy *= uNormalScale;\nnormalTex = normalize( normalTex );\nif( enableDiffuse ) {\n#ifdef GAMMA_INPUT\nvec4 texelColor = texture2D( tDiffuse, vUv );\ntexelColor.xyz *= texelColor.xyz;\ngl_FragColor = gl_FragColor * texelColor;\n#else\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\n#endif\n}\nif( enableAO ) {\n#ifdef GAMMA_INPUT\nvec4 aoColor = texture2D( tAO, vUv );\naoColor.xyz *= aoColor.xyz;\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\n#endif\n}\nif( enableSpecular )\nspecularTex = texture2D( tSpecular, vUv ).xyz;\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\nvec3 finalNormal = tsb * normalTex;\n#ifdef FLIP_SIDED\nfinalNormal = -finalNormal;\n#endif\nvec3 normal = normalize( finalNormal );\nvec3 viewPosition = normalize( vViewPosition );\n#if MAX_POINT_LIGHTS > 0\nvec3 pointDiffuse = vec3( 0.0 );\nvec3 pointSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 pointVector = lPosition.xyz + vViewPosition.xyz;\nfloat pointDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\npointDistance = 1.0 - min( ( length( pointVector ) / pointLightDistance[ i ] ), 1.0 );\npointVector = normalize( pointVector );\n#ifdef WRAP_AROUND\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n#else\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\n#endif\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\n#else\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nvec3 spotDiffuse = vec3( 0.0 );\nvec3 spotSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 spotVector = lPosition.xyz + vViewPosition.xyz;\nfloat spotDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nspotDistance = 1.0 - min( ( length( spotVector ) / spotLightDistance[ i ] ), 1.0 );\nspotVector = normalize( spotVector );\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\nif ( spotEffect > spotLightAngleCos[ i ] ) {\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\n#ifdef WRAP_AROUND\nfloat spotDiffuseWeightFull = max( dot( normal, spotVector ), 0.0 );\nfloat spotDiffuseWeightHalf = max( 0.5 * dot( normal, spotVector ) + 0.5, 0.0 );\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\n#else\nfloat spotDiffuseWeight = max( dot( normal, spotVector ), 0.0 );\n#endif\nspotDiffuse += spotDistance * spotLightColor[ i ] * uDiffuseColor * spotDiffuseWeight * spotEffect;\nvec3 spotHalfVector = normalize( spotVector + viewPosition );\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\nfloat spotSpecularWeight = specularTex.r * max( pow( spotDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( spotVector, spotHalfVector ), 5.0 );\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;\n#else\nspotSpecular += spotDistance * spotLightColor[ i ] * uSpecularColor * spotSpecularWeight * spotDiffuseWeight * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec3 dirDiffuse = vec3( 0.0 );\nvec3 dirSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\n#ifdef WRAP_AROUND\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\n#else\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\n#endif\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\n#else\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_HEMI_LIGHTS > 0\nvec3 hemiDiffuse = vec3( 0.0 );\nvec3 hemiSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\nvec3 lVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, lVector );\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\nvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\nhemiDiffuse += uDiffuseColor * hemiColor;\nvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\nfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\nfloat hemiSpecularWeightSky = specularTex.r * max( pow( hemiDotNormalHalfSky, uShininess ), 0.0 );\nvec3 lVectorGround = -lVector;\nvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\nfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\nfloat hemiSpecularWeightGround = specularTex.r * max( pow( hemiDotNormalHalfGround, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat dotProductGround = dot( normal, lVectorGround );\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlickSky = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );\nvec3 schlickGround = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\nhemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\n#else\nhemiSpecular += uSpecularColor * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;\n#endif\n}\n#endif\nvec3 totalDiffuse = vec3( 0.0 );\nvec3 totalSpecular = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\ntotalDiffuse += dirDiffuse;\ntotalSpecular += dirSpecular;\n#endif\n#if MAX_HEMI_LIGHTS > 0\ntotalDiffuse += hemiDiffuse;\ntotalSpecular += hemiSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalDiffuse += pointDiffuse;\ntotalSpecular += pointSpecular;\n#endif\n#if MAX_SPOT_LIGHTS > 0\ntotalDiffuse += spotDiffuse;\ntotalSpecular += spotSpecular;\n#endif\n#ifdef METAL\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor + totalSpecular );\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor ) + totalSpecular;\n#endif\nif ( enableReflection ) {\nvec3 vReflect;\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\nif ( useRefract ) {\nvReflect = refract( cameraToVertex, normal, uRefractionRatio );\n} else {\nvReflect = reflect( cameraToVertex, normal );\n}\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\n#ifdef GAMMA_INPUT\ncubeColor.xyz *= cubeColor.xyz;\n#endif\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\n}", + THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,"}"].join("\n"),vertexShader:["attribute vec4 tangent;\nuniform vec2 uOffset;\nuniform vec2 uRepeat;\nuniform bool enableDisplacement;\n#ifdef VERTEX_TEXTURES\nuniform sampler2D tDisplacement;\nuniform float uDisplacementScale;\nuniform float uDisplacementBias;\n#endif\nvarying vec3 vTangent;\nvarying vec3 vBinormal;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vWorldPosition;\nvarying vec3 vViewPosition;", + THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,"void main() {",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.skinnormal_vertex,"#ifdef USE_SKINNING\nvNormal = normalize( normalMatrix * skinnedNormal.xyz );\nvec4 skinnedTangent = skinMatrix * vec4( tangent.xyz, 0.0 );\nvTangent = normalize( normalMatrix * skinnedTangent.xyz );\n#else\nvNormal = normalize( normalMatrix * normal );\nvTangent = normalize( normalMatrix * tangent.xyz );\n#endif\nvBinormal = normalize( cross( vNormal, vTangent ) * tangent.w );\nvUv = uv * uRepeat + uOffset;\nvec3 displacedPosition;\n#ifdef VERTEX_TEXTURES\nif ( enableDisplacement ) {\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\ndisplacedPosition = position + normalize( normal ) * df;\n} else {\n#ifdef USE_SKINNING\nvec4 skinVertex = vec4( position, 1.0 );\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\nskinned \t += boneMatY * skinVertex * skinWeight.y;\ndisplacedPosition = skinned.xyz;\n#else\ndisplacedPosition = position;\n#endif\n}\n#else\n#ifdef USE_SKINNING\nvec4 skinVertex = vec4( position, 1.0 );\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\nskinned \t += boneMatY * skinVertex * skinWeight.y;\ndisplacedPosition = skinned.xyz;\n#else\ndisplacedPosition = position;\n#endif\n#endif\nvec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );\nvec4 worldPosition = modelMatrix * vec4( displacedPosition, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\nvWorldPosition = worldPosition.xyz;\nvViewPosition = -mvPosition.xyz;\n#ifdef USE_SHADOWMAP\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n}\n#endif\n}"].join("\n")}, + cube:{uniforms:{tCube:{type:"t",value:null},tFlip:{type:"f",value:-1}},vertexShader:"varying vec3 vWorldPosition;\nvoid main() {\nvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\nvWorldPosition = worldPosition.xyz;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"uniform samplerCube tCube;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\nvoid main() {\ngl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n}"}, + depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,"void main() {",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.default_vertex,"}"].join("\n"),fragmentShader:"vec4 pack_depth( const in float depth ) {\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\nconst vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\nvec4 res = fract( depth * bit_shift );\nres -= res.xxyz * bit_mask;\nreturn res;\n}\nvoid main() {\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\n}"}};THREE.WebGLRenderer=function(a){function b(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){void 0===a.__webglCustomAttributesList&&(a.__webglCustomAttributesList=[]);for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=!0;var h=1;"v2"===f.type?h=2:"v3"===f.type?h=3:"v4"===f.type?h=4:"c"===f.type&&(h=3);f.size=h;f.array=new Float32Array(c*h);f.buffer=j.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=!0}a.__webglCustomAttributesList.push(f)}}} + function c(a,b){var c=b.geometry,h=a.faces3,g=3*h.length,i=1*h.length,k=3*h.length,h=d(b,a),m=f(h),l=e(h),p=h.vertexColors?h.vertexColors:!1;a.__vertexArray=new Float32Array(3*g);l&&(a.__normalArray=new Float32Array(3*g));c.hasTangents&&(a.__tangentArray=new Float32Array(4*g));p&&(a.__colorArray=new Float32Array(3*g));m&&(0l;l++)K.autoScaleCubemaps&&!f?(p=k,q=l,t=c.image[l],w=ac,t.width<=w&&t.height<=w||(z=Math.max(t.width,t.height),u=Math.floor(t.width*w/z),w=Math.floor(t.height*w/z),z=document.createElement("canvas"),z.width=u,z.height=w,z.getContext("2d").drawImage(t,0,0,t.width,t.height,0,0,u,w),t=z),p[q]=t):k[l]=c.image[l];l=k[0];p=0===(l.width&l.width-1)&&0===(l.height&l.height-1);q=v(c.format);t=v(c.type);E(j.TEXTURE_CUBE_MAP, + c,p);for(l=0;6>l;l++)if(f){w=k[l].mipmaps;z=0;for(y=w.length;z=Mb&&console.warn("WebGLRenderer: trying to use "+a+" texture units while this GPU supports only "+Mb);P+=1;return a}function D(a,b,c,d){a[b]=c.r*c.r*d;a[b+1]=c.g*c.g*d;a[b+2]=c.b*c.b*d}function x(a,b,c,d){a[b]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function F(a){a!==xa&&(j.lineWidth(a),xa=a)}function A(a,b,c){Da!==a&&(a?j.enable(j.POLYGON_OFFSET_FILL):j.disable(j.POLYGON_OFFSET_FILL),Da=a); + if(a&&(Ua!==b||Qa!==c))j.polygonOffset(b,c),Ua=b,Qa=c}function O(a){for(var a=a.split("\n"),b=0,c=a.length;bb;b++)j.deleteFramebuffer(a.__webglFramebuffer[b]),j.deleteRenderbuffer(a.__webglRenderbuffer[b]); + else j.deleteFramebuffer(a.__webglFramebuffer),j.deleteRenderbuffer(a.__webglRenderbuffer);K.info.memory.textures--},Fb=function(a){a=a.target;a.removeEventListener("dispose",Fb);Gb(a)},Hb=function(a){void 0!==a.__webglVertexBuffer&&j.deleteBuffer(a.__webglVertexBuffer);void 0!==a.__webglNormalBuffer&&j.deleteBuffer(a.__webglNormalBuffer);void 0!==a.__webglTangentBuffer&&j.deleteBuffer(a.__webglTangentBuffer);void 0!==a.__webglColorBuffer&&j.deleteBuffer(a.__webglColorBuffer);void 0!==a.__webglUVBuffer&& + j.deleteBuffer(a.__webglUVBuffer);void 0!==a.__webglUV2Buffer&&j.deleteBuffer(a.__webglUV2Buffer);void 0!==a.__webglSkinIndicesBuffer&&j.deleteBuffer(a.__webglSkinIndicesBuffer);void 0!==a.__webglSkinWeightsBuffer&&j.deleteBuffer(a.__webglSkinWeightsBuffer);void 0!==a.__webglFaceBuffer&&j.deleteBuffer(a.__webglFaceBuffer);void 0!==a.__webglLineBuffer&&j.deleteBuffer(a.__webglLineBuffer);void 0!==a.__webglLineDistanceBuffer&&j.deleteBuffer(a.__webglLineDistanceBuffer);if(void 0!==a.__webglCustomAttributesList)for(var b in a.__webglCustomAttributesList)j.deleteBuffer(a.__webglCustomAttributesList[b].buffer); + K.info.memory.geometries--},Gb=function(a){var b=a.program;if(void 0!==b){a.program=void 0;var c,d,e=!1,a=0;for(c=ca.length;ad.numSupportedMorphTargets?(l.sort(k),l.length=d.numSupportedMorphTargets):l.length>d.numSupportedMorphNormals?l.sort(k):0===l.length&&l.push([0,0]);for(m=0;mCa;Ca++)Ga=R[Ca],Ma[hb]=Ga.x,Ma[hb+1]=Ga.y,Ma[hb+2]=Ga.z,hb+=3;else for(Ca=0;3>Ca;Ca++)Ma[hb]=U.x,Ma[hb+1]=U.y,Ma[hb+2]=U.z,hb+=3;j.bindBuffer(j.ARRAY_BUFFER,v.__webglNormalBuffer);j.bufferData(j.ARRAY_BUFFER,Ma,D)}if(yb&&Cb&&N){E=0;for(I=aa.length;ECa;Ca++)Ea=$[Ca],bb[Oa]=Ea.x,bb[Oa+1]=Ea.y,Oa+=2;0Ca;Ca++)La=Fa[Ca],cb[Pa]=La.x,cb[Pa+1]=La.y,Pa+=2;0f;f++){a.__webglFramebuffer[f]=j.createFramebuffer();a.__webglRenderbuffer[f]=j.createRenderbuffer();j.texImage2D(j.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var h=a,g=j.TEXTURE_CUBE_MAP_POSITIVE_X+f;j.bindFramebuffer(j.FRAMEBUFFER,a.__webglFramebuffer[f]);j.framebufferTexture2D(j.FRAMEBUFFER,j.COLOR_ATTACHMENT0,g,h.__webglTexture,0);I(a.__webglRenderbuffer[f],a)}c&&j.generateMipmap(j.TEXTURE_CUBE_MAP)}else a.__webglFramebuffer=j.createFramebuffer(),a.__webglRenderbuffer= + a.shareDepthFrom?a.shareDepthFrom.__webglRenderbuffer:j.createRenderbuffer(),j.bindTexture(j.TEXTURE_2D,a.__webglTexture),E(j.TEXTURE_2D,a,c),j.texImage2D(j.TEXTURE_2D,0,d,a.width,a.height,0,d,e,null),d=j.TEXTURE_2D,j.bindFramebuffer(j.FRAMEBUFFER,a.__webglFramebuffer),j.framebufferTexture2D(j.FRAMEBUFFER,j.COLOR_ATTACHMENT0,d,a.__webglTexture,0),a.shareDepthFrom?a.depthBuffer&&!a.stencilBuffer?j.framebufferRenderbuffer(j.FRAMEBUFFER,j.DEPTH_ATTACHMENT,j.RENDERBUFFER,a.__webglRenderbuffer):a.depthBuffer&& + a.stencilBuffer&&j.framebufferRenderbuffer(j.FRAMEBUFFER,j.DEPTH_STENCIL_ATTACHMENT,j.RENDERBUFFER,a.__webglRenderbuffer):I(a.__webglRenderbuffer,a),c&&j.generateMipmap(j.TEXTURE_2D);b?j.bindTexture(j.TEXTURE_CUBE_MAP,null):j.bindTexture(j.TEXTURE_2D,null);j.bindRenderbuffer(j.RENDERBUFFER,null);j.bindFramebuffer(j.FRAMEBUFFER,null)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,c=a.width,a=a.height,e=d=0):(b=null,c=Ma,a=fb,d=bb,e=cb);b!==da&&(j.bindFramebuffer(j.FRAMEBUFFER,b), + j.viewport(d,e,c,a),da=b);sb=c;pb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};THREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=void 0!==c.wrapS?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==c.wrapT?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==c.magFilter?c.magFilter:THREE.LinearFilter;this.minFilter=void 0!==c.minFilter?c.minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=void 0!==c.anisotropy?c.anisotropy:1;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=void 0!==c.format?c.format: + THREE.RGBAFormat;this.type=void 0!==c.type?c.type:THREE.UnsignedByteType;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.generateMipmaps=!0;this.shareDepthFrom=null}; + THREE.WebGLRenderTarget.prototype={constructor:THREE.WebGLRenderTarget,clone:function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.anisotropy=this.anisotropy;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;a.generateMipmaps=this.generateMipmaps;a.shareDepthFrom=this.shareDepthFrom; + return a},dispose:function(){this.dispatchEvent({type:"dispose"})}};THREE.EventDispatcher.prototype.apply(THREE.WebGLRenderTarget.prototype);THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};THREE.WebGLRenderTargetCube.prototype=Object.create(THREE.WebGLRenderTarget.prototype);THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=!0};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};THREE.RenderableFace3=function(){this.id=0;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidModel=new THREE.Vector3;this.normalModel=new THREE.Vector3;this.normalModelView=new THREE.Vector3;this.vertexNormalsLength=0;this.vertexNormalsModel=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsModelView=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.material=this.color=null;this.uvs=[[]];this.z= + 0};THREE.RenderableObject=function(){this.id=0;this.object=null;this.z=0};THREE.RenderableSprite=function(){this.id=0;this.object=null;this.rotation=this.z=this.y=this.x=0;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.id=0;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.vertexColors=[new THREE.Color,new THREE.Color];this.material=null;this.z=0};THREE.GeometryUtils={merge:function(a,b,c){var d,e,f=a.vertices.length,h=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,i=h.vertices,k=a.faces,m=h.faces,a=a.faceVertexUvs[0],h=h.faceVertexUvs[0];void 0===c&&(c=0);b instanceof THREE.Mesh&&(b.matrixAutoUpdate&&b.updateMatrix(),d=b.matrix,e=(new THREE.Matrix3).getNormalMatrix(d));for(var b=0,l=i.length;ba?b(c,e-1):k[e]>8&255,i>>16&255,i>>24&255)),d}d.mipmapCount=1;g[2]&131072&&!1!==b&&(d.mipmapCount=Math.max(1,g[7]));d.isCubemap=g[28]&512?!0:!1;d.width=g[4];d.height=g[3];for(var g=g[1]+4,f=d.width,h=d.height,i=d.isCubemap?6:1,m=0;ml-1?0:l-1,s=l+1>e-1?e-1:l+1,t=0>m-1?0:m-1,n=m+1>d-1?d-1:m+1,r=[],q=[0,0,g[4*(l*d+m)]/255*b];r.push([-1,0,g[4*(l*d+t)]/255*b]);r.push([-1,-1,g[4*(p*d+t)]/255*b]);r.push([0,-1,g[4*(p*d+m)]/255*b]);r.push([1,-1,g[4*(p*d+n)]/255*b]);r.push([1,0,g[4*(l*d+n)]/255*b]);r.push([1,1,g[4*(s*d+n)]/255*b]);r.push([0,1,g[4*(s*d+m)]/255*b]);r.push([-1,1,g[4*(s*d+t)]/255*b]);p=[];t=r.length;for(s=0;se)return null;var f=[],h=[],g=[],i,k,m;if(0=l--){console.log("Warning, unable to triangulate polygon!");break}i=k;e<=i&&(i=0);k=i+1;e<=k&&(k=0);m=k+1;e<=m&&(m=0);var p;a:{var s=p=void 0,t=void 0,n=void 0,r=void 0,q=void 0,u=void 0,w=void 0,z= + void 0,s=a[h[i]].x,t=a[h[i]].y,n=a[h[k]].x,r=a[h[k]].y,q=a[h[m]].x,u=a[h[m]].y;if(1E-10>(n-s)*(u-t)-(r-t)*(q-s))p=!1;else{var B=void 0,D=void 0,x=void 0,F=void 0,A=void 0,O=void 0,C=void 0,E=void 0,I=void 0,y=void 0,I=E=C=z=w=void 0,B=q-n,D=u-r,x=s-q,F=t-u,A=n-s,O=r-t;for(p=0;pi)h=d+1;else if(0b&&(b=0);1=b)return b=c[a]-b,a=this.curves[a],b=1-b/a.getLength(),a.getPointAt(b);a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]}; + THREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;cb?b=g.x:g.xc?c=g.y:g.yd?d=g.z:g.zMath.abs(d.x-c[0].x)&&1E-10>Math.abs(d.y-c[0].y)&&c.splice(c.length-1,1);b&&c.push(c[0]);return c}; + THREE.Path.prototype.toShapes=function(a){var b,c,d,e,f=[],h=new THREE.Path;b=0;for(c=this.actions.length;b + g&&(g+=c.length);g%=c.length;0>h&&(h+=k.length);h%=k.length;e=0<=g-1?g-1:c.length-1;f=0<=h-1?h-1:k.length-1;n=[k[h],c[g],c[e]];n=THREE.FontUtils.Triangulate.area(n);r=[k[h],k[f],c[g]];r=THREE.FontUtils.Triangulate.area(r);l+p>n+r&&(g=s,h=m,0>g&&(g+=c.length),g%=c.length,0>h&&(h+=k.length),h%=k.length,e=0<=g-1?g-1:c.length-1,f=0<=h-1?h-1:k.length-1);l=c.slice(0,g);p=c.slice(g);s=k.slice(h);m=k.slice(0,h);f=[k[h],k[f],c[g]];t.push([k[h],c[g],c[e]]);t.push(f);c=l.concat(s).concat(m).concat(p)}return{shape:c, + isolatedPts:t,allpoints:d}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),d=c.allpoints,e=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,!1),f,h,g,i,k={};f=0;for(h=d.length;fd;d++)i=g[d].x+":"+g[d].y,i=k[i],void 0!==i&&(g[d]=i)}f=0;for(h=e.length;fd;d++)i=g[d].x+":"+g[d].y,i=k[i],void 0!==i&&(g[d]=i)}return c.concat(e)}, + isClockWise:function(a){return 0>THREE.FontUtils.Triangulate.area(a)},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a,b)+this.b3p1(a,c)+this.b3p2(a,d)+ + this.b3p3(a,e)}};THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=Object.create(THREE.Curve.prototype);THREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().sub(this.v1);b.multiplyScalar(a).add(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(){return this.v2.clone().sub(this.v1).normalize()};THREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=Object.create(THREE.Curve.prototype);THREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)}; + THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=Object.create(THREE.Curve.prototype);THREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)}; + THREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.SplineCurve=function(a){this.points=void 0==a?[]:a};THREE.SplineCurve.prototype=Object.create(THREE.Curve.prototype);THREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],d=this.points,e;e=(d.length-1)*a;a=Math.floor(e);e-=a;c[0]=0==a?a:a-1;c[1]=a;c[2]=a>d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b};THREE.EllipseCurve=function(a,b,c,d,e,f,h){this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=f;this.aClockwise=h};THREE.EllipseCurve.prototype=Object.create(THREE.Curve.prototype); + THREE.EllipseCurve.prototype.getPoint=function(a){var b;b=this.aEndAngle-this.aStartAngle;0>b&&(b+=2*Math.PI);b>2*Math.PI&&(b-=2*Math.PI);b=!0===this.aClockwise?this.aEndAngle+(1-a)*(2*Math.PI-b):this.aStartAngle+a*b;a=this.aX+this.xRadius*Math.cos(b);b=this.aY+this.yRadius*Math.sin(b);return new THREE.Vector2(a,b)};THREE.ArcCurve=function(a,b,c,d,e,f){THREE.EllipseCurve.call(this,a,b,c,c,d,e,f)};THREE.ArcCurve.prototype=Object.create(THREE.EllipseCurve.prototype);THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b});THREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)});THREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)});THREE.SplineCurve3=THREE.Curve.create(function(a){this.points=void 0==a?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e,a=(d.length-1)*a;e=Math.floor(a);a-=e;c[0]=0==e?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],h=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,h.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,h.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,h.z,c.z,a);return b});THREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=void 0==a?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e-=a;a+=0a.hierarchy[c].keys[d].time&& + (a.hierarchy[c].keys[d].time=0),void 0!==a.hierarchy[c].keys[d].rot&&!(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)){var g=a.hierarchy[c].keys[d].rot;a.hierarchy[c].keys[d].rot=new THREE.Quaternion(g[0],g[1],g[2],g[3])}if(a.hierarchy[c].keys.length&&void 0!==a.hierarchy[c].keys[0].morphTargets){g={};for(d=0;ds;s++){c=b[s];h=i.prevKey[c];g=i.nextKey[c];if(g.time<=m){if(kd||1d?0:1;if("pos"===c)if(c=a.position,this.interpolationType===THREE.AnimationHandler.LINEAR)c.x=e[0]+(f[0]-e[0])*d,c.y=e[1]+(f[1]-e[1])*d,c.z=e[2]+ + (f[2]-e[2])*d;else{if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)this.points[0]=this.getPrevKeyWith("pos",l,h.index-1).pos,this.points[1]=e,this.points[2]=f,this.points[3]=this.getNextKeyWith("pos",l,g.index+1).pos,d=0.33*d+0.33,e=this.interpolateCatmullRom(this.points,d),c.x=e[0],c.y=e[1],c.z=e[2],this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD&&(d=this.interpolateCatmullRom(this.points,1.01*d), + this.target.set(d[0],d[1],d[2]),this.target.sub(c),this.target.y=0,this.target.normalize(),d=Math.atan2(this.target.x,this.target.z),a.rotation.set(0,d,0))}else"rot"===c?THREE.Quaternion.slerp(e,f,a.quaternion,d):"scl"===c&&(c=a.scale,c.x=e[0]+(f[0]-e[0])*d,c.y=e[1]+(f[1]-e[1])*d,c.z=e[2]+(f[2]-e[2])*d)}}}}; + THREE.Animation.prototype.interpolateCatmullRom=function(a,b){var c=[],d=[],e,f,h,g,i,k;e=(a.length-1)*b;f=Math.floor(e);e-=f;c[0]=0===f?f:f-1;c[1]=f;c[2]=f>a.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];g=a[c[1]];i=a[c[2]];k=a[c[3]];c=e*e;h=e*c;d[0]=this.interpolate(f[0],g[0],i[0],k[0],e,c,h);d[1]=this.interpolate(f[1],g[1],i[1],k[1],e,c,h);d[2]=this.interpolate(f[2],g[2],i[2],k[2],e,c,h);return d}; + THREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,h){a=0.5*(c-a);d=0.5*(d-b);return(2*(b-c)+a+d)*h+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c=h?b.interpolate(c,h):b.interpolate(c,c.time)}this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=!0}}if(this.JITCompile&&void 0===f[0][e]){this.hierarchy[0].updateMatrixWorld(!0);for(a=0;ag?(b=Math.atan2(b.y-a.y,b.x-a.x),a=Math.atan2(c.y-a.y,c.x-a.x),b>a&&(a+=2*Math.PI),c=(b+a)/2,a=-Math.cos(c),c=-Math.sin(c),new THREE.Vector2(a,c)):d.multiplyScalar(g).add(h).sub(a).clone()}function e(c,d){var e,f;for(N=c.length;0<=--N;){e=N;f=N-1;0>f&&(f=c.length-1);for(var g=0,h=s+2*m, + g=0;gMath.abs(c-i)?[new THREE.Vector2(b,1-e),new THREE.Vector2(d,1-f),new THREE.Vector2(k,1-h),new THREE.Vector2(l,1-a)]:[new THREE.Vector2(c,1-e),new THREE.Vector2(i,1-f),new THREE.Vector2(m,1-h),new THREE.Vector2(p,1-a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2; + THREE.ExtrudeGeometry.__v5=new THREE.Vector2;THREE.ExtrudeGeometry.__v6=new THREE.Vector2;THREE.ShapeGeometry=function(a,b){THREE.Geometry.call(this);!1===a instanceof Array&&(a=[a]);this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()};THREE.ShapeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ShapeGeometry.prototype.addShapeList=function(a,b){for(var c=0,d=a.length;cc&&1===a.x&&(a=new THREE.Vector2(a.x-1,a.y));0===b.x&&0===b.z&&(a=new THREE.Vector2(c/2/Math.PI+0.5,a.y));return a.clone()}THREE.Geometry.call(this);for(var c=c||1,d=d||0,g=this,i=0,k=a.length;ip&&(0.2>a&&(d[0].x+=1),0.2>b&&(d[1].x+=1),0.2>m&&(d[2].x+=1));i=0;for(k=this.vertices.length;ic.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();THREE.ArrowHelper.prototype.setLength=function(a){this.scale.set(a,a,a)}; + THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.setHex(a);this.cone.material.color.setHex(a)};THREE.BoxHelper=function(a){var b=[new THREE.Vector3(1,1,1),new THREE.Vector3(-1,1,1),new THREE.Vector3(-1,-1,1),new THREE.Vector3(1,-1,1),new THREE.Vector3(1,1,-1),new THREE.Vector3(-1,1,-1),new THREE.Vector3(-1,-1,-1),new THREE.Vector3(1,-1,-1)];this.vertices=b;var c=new THREE.Geometry;c.vertices.push(b[0],b[1],b[1],b[2],b[2],b[3],b[3],b[0],b[4],b[5],b[5],b[6],b[6],b[7],b[7],b[4],b[0],b[4],b[1],b[5],b[2],b[6],b[3],b[7]);THREE.Line.call(this,c,new THREE.LineBasicMaterial({color:16776960}),THREE.LinePieces); + void 0!==a&&this.update(a)};THREE.BoxHelper.prototype=Object.create(THREE.Line.prototype); + THREE.BoxHelper.prototype.update=function(a){var b=a.geometry;null===b.boundingBox&&b.computeBoundingBox();var c=b.boundingBox.min,b=b.boundingBox.max,d=this.vertices;d[0].set(b.x,b.y,b.z);d[1].set(c.x,b.y,b.z);d[2].set(c.x,c.y,b.z);d[3].set(b.x,c.y,b.z);d[4].set(b.x,b.y,c.z);d[5].set(c.x,b.y,c.z);d[6].set(c.x,c.y,c.z);d[7].set(b.x,c.y,c.z);this.geometry.computeBoundingSphere();this.geometry.verticesNeedUpdate=!0;this.matrixAutoUpdate=!1;this.matrixWorld=a.matrixWorld};THREE.BoundingBoxHelper=function(a,b){var c=b||8947848;this.object=a;this.box=new THREE.Box3;THREE.Mesh.call(this,new THREE.CubeGeometry(1,1,1),new THREE.MeshBasicMaterial({color:c,wireframe:!0}))};THREE.BoundingBoxHelper.prototype=Object.create(THREE.Mesh.prototype);THREE.BoundingBoxHelper.prototype.update=function(){this.box.setFromObject(this.object);this.box.size(this.scale);this.box.center(this.position)};THREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.vertices.push(new THREE.Vector3);d.colors.push(new THREE.Color(b));void 0===f[a]&&(f[a]=[]);f[a].push(d.vertices.length-1)}var d=new THREE.Geometry,e=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors}),f={};b("n1","n2",16755200);b("n2","n4",16755200);b("n4","n3",16755200);b("n3","n1",16755200);b("f1","f2",16755200);b("f2","f4",16755200);b("f4","f3",16755200);b("f3","f1",16755200);b("n1","f1",16755200); + b("n2","f2",16755200);b("n3","f3",16755200);b("n4","f4",16755200);b("p","n1",16711680);b("p","n2",16711680);b("p","n3",16711680);b("p","n4",16711680);b("u1","u2",43775);b("u2","u3",43775);b("u3","u1",43775);b("c","t",16777215);b("p","c",3355443);b("cn1","cn2",3355443);b("cn3","cn4",3355443);b("cf1","cf2",3355443);b("cf3","cf4",3355443);THREE.Line.call(this,d,e,THREE.LinePieces);this.camera=a;this.matrixWorld=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=f;this.update()}; + THREE.CameraHelper.prototype=Object.create(THREE.Line.prototype); + THREE.CameraHelper.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Camera,c=new THREE.Projector;return function(){function d(d,h,g,i){a.set(h,g,i);c.unprojectVector(a,b);d=e.pointMap[d];if(void 0!==d){h=0;for(g=d.length;hd;d++)c.faces[d].color=this.colors[4>d?0:1];d=new THREE.MeshBasicMaterial({vertexColors:THREE.FaceColors,wireframe:!0});this.lightSphere=new THREE.Mesh(c,d);this.add(this.lightSphere); + this.update()};THREE.HemisphereLightHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.HemisphereLightHelper.prototype.dispose=function(){this.lightSphere.geometry.dispose();this.lightSphere.material.dispose()}; + THREE.HemisphereLightHelper.prototype.update=function(){var a=new THREE.Vector3;return function(){this.colors[0].copy(this.light.color).multiplyScalar(this.light.intensity);this.colors[1].copy(this.light.groundColor).multiplyScalar(this.light.intensity);this.lightSphere.lookAt(a.getPositionFromMatrix(this.light.matrixWorld).negate());this.lightSphere.geometry.colorsNeedUpdate=!0}}();THREE.PointLightHelper=function(a,b){this.light=a;this.light.updateMatrixWorld();var c=new THREE.SphereGeometry(b,4,2),d=new THREE.MeshBasicMaterial({wireframe:!0,fog:!1});d.color.copy(this.light.color).multiplyScalar(this.light.intensity);THREE.Mesh.call(this,c,d);this.matrixWorld=this.light.matrixWorld;this.matrixAutoUpdate=!1};THREE.PointLightHelper.prototype=Object.create(THREE.Mesh.prototype);THREE.PointLightHelper.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()}; + THREE.PointLightHelper.prototype.update=function(){this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)};THREE.SpotLightHelper=function(a){THREE.Object3D.call(this);this.light=a;this.light.updateMatrixWorld();this.matrixWorld=a.matrixWorld;this.matrixAutoUpdate=!1;a=new THREE.CylinderGeometry(0,1,1,8,1,!0);a.applyMatrix((new THREE.Matrix4).makeTranslation(0,-0.5,0));a.applyMatrix((new THREE.Matrix4).makeRotationX(-Math.PI/2));var b=new THREE.MeshBasicMaterial({wireframe:!0,fog:!1});this.cone=new THREE.Mesh(a,b);this.add(this.cone);this.update()};THREE.SpotLightHelper.prototype=Object.create(THREE.Object3D.prototype); + THREE.SpotLightHelper.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};THREE.SpotLightHelper.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(){var c=this.light.distance?this.light.distance:1E4,d=c*Math.tan(this.light.angle);this.cone.scale.set(d,d,c);a.getPositionFromMatrix(this.light.matrixWorld);b.getPositionFromMatrix(this.light.target.matrixWorld);this.cone.lookAt(b.sub(a));this.cone.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)}}();THREE.VertexNormalsHelper=function(a,b,c,d){this.object=a;this.size=b||1;for(var b=c||16711680,d=d||1,c=new THREE.Geometry,a=a.geometry.faces,e=0,f=a.length;el;l++){b[0]=m[e[l]];b[1]=m[e[(l+1)%3]];b.sort(d);var p=b.toString();void 0===c[p]&&(f.vertices.push(h[b[0]]),f.vertices.push(h[b[1]]),c[p]=!0)}THREE.Line.call(this,f,new THREE.LineBasicMaterial({color:16777215}),THREE.LinePieces);this.matrixAutoUpdate=!1;this.matrixWorld=a.matrixWorld}; + THREE.WireframeHelper.prototype=Object.create(THREE.Line.prototype);THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=Object.create(THREE.Object3D.prototype);THREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=Object.create(THREE.Object3D.prototype); + THREE.LensFlare.prototype.add=function(a,b,c,d,e,f){void 0===b&&(b=-1);void 0===c&&(c=0);void 0===f&&(f=1);void 0===e&&(e=new THREE.Color(16777215));void 0===d&&(d=THREE.NormalBlending);c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:1,opacity:f,color:e,blending:d})}; + THREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=2*-this.positionScreen.x,e=2*-this.positionScreen.y;for(a=0;ag.end&&(g.end=f);c||(c=i)}}for(i in d)g=d[i],this.createAnimation(i,g.start,g.end,a);this.firstAnimation=c}; + THREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)}; + THREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b}; + THREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time=0,b.active=!0):console.warn("animation["+a+"] undefined")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1}; + THREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;bd.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=d.duration);var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/e),0,d.length-1),h=d.weight; + f!==d.currentFrame&&(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*h,this.morphTargetInfluences[f]=0,d.lastFrame=d.currentFrame,d.currentFrame=f);e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*h;this.morphTargetInfluences[d.lastFrame]=(1-e)*h}}};THREE.LensFlarePlugin=function(){function a(a,c){var d=b.createProgram(),e=b.createShader(b.FRAGMENT_SHADER),f=b.createShader(b.VERTEX_SHADER),g="precision "+c+" float;\n";b.shaderSource(e,g+a.fragmentShader);b.shaderSource(f,g+a.vertexShader);b.compileShader(e);b.compileShader(f);b.attachShader(d,e);b.attachShader(d,f);b.linkProgram(d);return d}var b,c,d,e,f,h,g,i,k,m,l,p,s;this.init=function(t){b=t.context;c=t;d=t.getPrecision();e=new Float32Array(16);f=new Uint16Array(6);t=0;e[t++]=-1;e[t++]=-1; + e[t++]=0;e[t++]=0;e[t++]=1;e[t++]=-1;e[t++]=1;e[t++]=0;e[t++]=1;e[t++]=1;e[t++]=1;e[t++]=1;e[t++]=-1;e[t++]=1;e[t++]=0;e[t++]=1;t=0;f[t++]=0;f[t++]=1;f[t++]=2;f[t++]=0;f[t++]=2;f[t++]=3;h=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,h);b.bufferData(b.ARRAY_BUFFER,e,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,f,b.STATIC_DRAW);i=b.createTexture();k=b.createTexture();b.bindTexture(b.TEXTURE_2D,i);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16, + 0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,k);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE); + b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);0>=b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)?(m=!1,l=a(THREE.ShaderFlares.lensFlare,d)):(m=!0,l=a(THREE.ShaderFlares.lensFlareVertexTexture,d));p={};s={};p.vertex=b.getAttribLocation(l,"position");p.uv=b.getAttribLocation(l,"uv");s.renderType=b.getUniformLocation(l,"renderType");s.map=b.getUniformLocation(l,"map");s.occlusionMap=b.getUniformLocation(l,"occlusionMap");s.opacity= + b.getUniformLocation(l,"opacity");s.color=b.getUniformLocation(l,"color");s.scale=b.getUniformLocation(l,"scale");s.rotation=b.getUniformLocation(l,"rotation");s.screenPosition=b.getUniformLocation(l,"screenPosition")};this.render=function(a,d,e,f){var a=a.__webglFlares,u=a.length;if(u){var w=new THREE.Vector3,z=f/e,B=0.5*e,D=0.5*f,x=16/f,F=new THREE.Vector2(x*z,x),A=new THREE.Vector3(1,1,0),O=new THREE.Vector2(1,1),C=s,x=p;b.useProgram(l);b.enableVertexAttribArray(p.vertex);b.enableVertexAttribArray(p.uv); + b.uniform1i(C.occlusionMap,0);b.uniform1i(C.map,1);b.bindBuffer(b.ARRAY_BUFFER,h);b.vertexAttribPointer(x.vertex,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(x.uv,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(!1);var E,I,y,v,G;for(E=0;EF;F++)z[F]=new THREE.Vector3,u[F]=new THREE.Vector3;z=B.shadowCascadeNearZ[w];B=B.shadowCascadeFarZ[w];u[0].set(-1,-1,z);u[1].set(1,-1,z);u[2].set(-1, + 1,z);u[3].set(1,1,z);u[4].set(-1,-1,B);u[5].set(1,-1,B);u[6].set(-1,1,B);u[7].set(1,1,B);x.originalCamera=p;u=new THREE.Gyroscope;u.position=n.shadowCascadeOffset;u.add(x);u.add(x.target);p.add(u);n.shadowCascadeArray[q]=x;console.log("Created virtualLight",x)}w=n;z=q;B=w.shadowCascadeArray[z];B.position.copy(w.position);B.target.position.copy(w.target.position);B.lookAt(B.target);B.shadowCameraVisible=w.shadowCameraVisible;B.shadowDarkness=w.shadowDarkness;B.shadowBias=w.shadowCascadeBias[z];u=w.shadowCascadeNearZ[z]; + w=w.shadowCascadeFarZ[z];B=B.pointsFrustum;B[0].z=u;B[1].z=u;B[2].z=u;B[3].z=u;B[4].z=w;B[5].z=w;B[6].z=w;B[7].z=w;D[r]=x;r++}else D[r]=n,r++;s=0;for(t=D.length;sw;w++)z=B[w],z.copy(u[w]),THREE.ShadowMapPlugin.__projector.unprojectVector(z,q),z.applyMatrix4(r.matrixWorldInverse),z.xk.x&&(k.x=z.x),z.yk.y&&(k.y=z.y),z.zk.z&& + (k.z=z.z);r.left=i.x;r.right=k.x;r.top=k.y;r.bottom=i.y;r.updateProjectionMatrix()}r=n.shadowMap;u=n.shadowMatrix;q=n.shadowCamera;q.position.getPositionFromMatrix(n.matrixWorld);m.getPositionFromMatrix(n.target.matrixWorld);q.lookAt(m);q.updateMatrixWorld();q.matrixWorldInverse.getInverse(q.matrixWorld);n.cameraHelper&&(n.cameraHelper.visible=n.shadowCameraVisible);n.shadowCameraVisible&&n.cameraHelper.update();u.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);u.multiply(q.projectionMatrix);u.multiply(q.matrixWorldInverse); + g.multiplyMatrices(q.projectionMatrix,q.matrixWorldInverse);h.setFromMatrix(g);b.setRenderTarget(r);b.clear();B=l.__webglObjects;n=0;for(r=B.length;n 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"}}; diff --git a/docs/course_authors/source/change_log.rst b/docs/course_authors/source/change_log.rst index 1a1e3e3d71..c986a58aba 100644 --- a/docs/course_authors/source/change_log.rst +++ b/docs/course_authors/source/change_log.rst @@ -8,14 +8,7 @@ Change Log ============== ================================================================ DATE CHANGE ============== ================================================================ -7/1/2013 Online help and pdf files finalized in Sphinx 1.2b1 - -5/6/2013 Universal change to UTC for all GMT references. Changed “Add Course Catalog Information” to show URL and note that on this page, the course author sees local time from browser. Changed “Invite Students to Register” to reflect new link. - -4/18/13 “Create a Discussion” graphic change - -4/9/13 Changed order of sections (moved “Create a Lesson in Studio” after “Create a New Course”) Added content to “Export or Import a Course,”Create Lesson,” “Create Schedule,” and Upload a File to the "Files & Updates Page” sections. Revised “Add an Announcement" or Update" section. - -3/22/13 Revised “Add Manual Policy Data” section. Added “Appendix C: Time Zones” +12/05/2013 Complete revision of edX Studio documentation and integration + of edX101 content. ============== ================================================================ diff --git a/docs/course_authors/source/checking_student_progress.rst b/docs/course_authors/source/checking_student_progress.rst index 01109bb853..54c5f33cda 100644 --- a/docs/course_authors/source/checking_student_progress.rst +++ b/docs/course_authors/source/checking_student_progress.rst @@ -1,23 +1,23 @@ -************************************************** +.. _Checking Student Progress and Issuing Certificates: + +################################################### Checking Student Progress and Issuing Certificates -************************************************** +################################################### -As will be discussed more in later sections, the grading policy and stored -problem scores are used to record progress through the course, determine +The grading policy and stored problem scores are used to record progress through the course, determine final grades, and issue certificates at the end. This unit will give you some advance information about how the grading policy will be visible to the students during the run of the course and what you will need to do at the end of the course to give out grades. - -Checking Progress as a Student +.. _A Student's View: +****************************** +A Student's View ****************************** - -During the run of a course, students can check their progress by clicking on -the Progress tab of the course on Edge. (This is the same page they would go -to to view subsection problem scores, as described in Viewing Scores.) The +Students can check their progress by clicking on +the **Progress** tab in the course. The student's progress through the graded part of the course is displayed at the top of this page, above the subsection scores, as a chart with entries for all the assignments, total percentage earned in the course so far and @@ -26,17 +26,15 @@ progress through edX101. .. image:: Images/image245.png - + :width: 800 -The student will be able to see from this page that, at the time this -screenshot was taken, edX101 was graded as a Pass/Fail course with a cutoff +The student can see from this page that edX101 was graded as a Pass/Fail course with a cutoff of 34% and that the grading rubric contained one assignment type, called -Learning Sequence, consisting of 11 assignments total. Furthermore, this -picture says that this particular student has only submitted correct -responses to two assignments, and that their current total percent grade in -the course is 6%. By hovering over each progress bar, the student would be -able to get further statistics of how much each assignment was counted as. +Learning Sequence, consisting of 11 assignments total. Furthermore, this particular student has only +submitted correct responses to two assignments, and that her current total percent grade in +the course is 6%. By hovering over each progress bar, the student can +get further statistics of how much each assignment was counted as. As was mentioned in the unit on Viewing Scores, further down on the Progress @@ -46,29 +44,27 @@ down view of the example Progress page for the student in the example above: .. image:: Images/image247.png - + :width: 800 Again, note that point scores from graded sections are called "Problem Scores", while point scores from ungraded sections are called "Practice Scores". -.. raw:: latex - - \newpage % - -Checking Progress of Students as an Instructor +.. _Check Progress of Students as an Instructor: + +********************************************** +Check Progress of Students as an Instructor ********************************************** - -To check the progress of the student through the course, visit the -Instructor dashboard of your course in instructor view on Edge and click on -the Grades page. The Instructor dashboard for courses sometimes changes as +To check the progress of the student, go to the +Instructor Dashboard of your course click +the Grades page. The Instructor Dashboard for courses sometimes changes as more course-specific tools get added. Here is the current view of the top of the Grades page of the Instructor dashboard for edX101: .. image:: Images/image249.png - + :width: 800 Here you see several options for viewing or downloading student grades, viewing individual progress through a course or resetting problem attempts. @@ -84,7 +80,7 @@ viewing individual progress through a course or resetting problem attempts. .. note:: The stored scores visible to you on the Instructor tab and to - the students from the Progress tab in the course on Edge are a snapshot of the + the students from the Progress tab in the course are a snapshot of the current state of the problem score database. They may be slightly out of sync with actual problem scores. (Asynchronicities may happen if, for example, the weight of a live problem was changed during an assignment, and not @@ -92,17 +88,15 @@ viewing individual progress through a course or resetting problem attempts. are usually recomputed at the end of the semester before determining final grades and issuing Certificates. -.. raw:: latex - - \newpage % - - -Assigning Final Grades and Issuing Certificates +.. _Assign Final Grades and Issuing Certificates: + +*********************************************** +Assign Final Grades and Issuing Certificates *********************************************** The final grades of a student in the course and the grading rubric you have set are used to determine whether the student has earned a Certificate of Mastery for the course. The process for issuing Certificates has to be started manually by you or by the edX support team at the end of the -course run. For more information about issuing Certificates, see TBD. +course run. diff --git a/docs/course_authors/source/common_problems.rst b/docs/course_authors/source/common_problems.rst new file mode 100644 index 0000000000..abdbd8f97a --- /dev/null +++ b/docs/course_authors/source/common_problems.rst @@ -0,0 +1,340 @@ +.. _Common Problems: + +Common Problems +=============== + +*Common problems* are typical problems such as multiple choice problems +and other problems whose answers are simple for students to select or +enter. You can create all of these problems using the Simple Editor in +Studio. You don't have to use XML or switch to the Advanced Editor. + +The following are the common problem types in Studio: + +- :ref:`Checkbox` In checkbox problems, students select one or more options + from a list of possible answers. +- :ref:`Dropdown` In dropdown problems, students select one answer from a + dropdown list. +- :ref:`Multiple Choice` Multiple choice problems require students to + select one answer from a list of choices that appear directly below + the question. +- :ref:`Numerical Input` Numerical input problems require answers that + include only integers, fractions, and a few common constants and + operators. +- :ref:`Text Input` In text input problems, students enter a short text + answer to a question. + +These problems are easy to access in Studio. To create them, click +**Problem** under **Add New Component**, click the **Common Problem +Types** tab, and then click the name of the problem. (Note that +**Checkbox** doesn't appear in the list of common problem types. To +create a checkbox problem, you'll click **Blank Common Problem**.) + +.. _Checkbox: + +Checkbox +-------- + +In checkbox problems, the student selects one or more options from a +list of possible answers. The student must select all the options that +apply to answer the problem correctly. Each checkbox problem must have +at least one correct answer. + +.. image:: Images/CheckboxExample.gif + +Create a Checkbox Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#. Under **Add New Component**, click **Problem**. +#. In the **Select Problem Component Type** screen, click **Blank Common + Problem** on the **Common Problem Types** tab. +#. In the Problem component that appears, click **Edit**. +#. In the component editor, replace the default text with the text of your + problem. Enter each answer option on its own line. +#. Select all the answer options, and then click the checkbox button. + + When you do this, brackets appear next to each answer choice. + +#. Add an **x** between the brackets for the correct answer or answers. +#. In the component editor, select the text of the explanation, and then click the + explanation button to add explanation tags around the text. + + .. image:: Images/ProbCompButton_Explanation.gif + +#. On the **Settings** tab, specify the settings that you want. +#. Click **Save**. + +For the example problem above, the text in the Problem component is the +following. + +:: + + Learning about the benefits of preventative healthcare can be particularly + difficult. Check all of the reasons below why this may be the case. + + [x] A large amount of time passes between undertaking a preventative measure + and seeing the result. + [ ] Non-immunized people will always fall sick. + [x] If others are immunized, fewer people will fall sick regardless of a + particular individual's choice to get immunized or not. + [x] Trust in healthcare professionals and government officials is fragile. + + [explanation] + People who are not immunized against a disease may still not fall sick from + the disease. If someone is trying to learn whether or not preventative measures + against the disease have any impact, he or she may see these people and conclude, + since they have remained healthy despite not being immunized, that immunizations + have no effect. Consequently, he or she would tend to believe that immunization + (or other preventative measures) have fewer benefits than they actually do. + [explanation] + + +.. _Dropdown: + +Dropdown +-------- + +Dropdown problems allow the student to choose from a collection of +answer options, presented as a dropdown list. Unlike multiple choice +problems, whose answers are always visible directly below the question, +dropdown problems don't show answer choices until the student clicks +the dropdown arrow. + +.. image:: Images/DropdownExample.gif + +Create a Dropdown Problem +~~~~~~~~~~~~~~~~~~~~~~~~~ + +To create a dropdown problem, follow these steps. + +#. Under **Add New Component**, click **Problem**. +#. In the **Select Problem Component Type** screen, click + **Dropdown** on the **Common Problem Types** tab. +#. In the new Problem component that appears, click **Edit**. +#. Replace the default text with the text for your problem. Enter each of the possible + answers on the same line, separated by commas. +#. Select all the answer options, and then click the dropdown button. + + .. image:: Images/ProbCompButton_Dropdown.gif + + When you do this, a double set of brackets ([[ ]]) appears and surrounds the + answer options. + +#. Inside the brackets, surround the correct answer with parentheses. +#. In the component editor, select the text of the explanation, and then click the + explanation button to add explanation tags around the text. + + .. image:: Images/ProbCompButton_Explanation.gif + +#. On the **Settings** tab, specify the settings that you want. +#. Click **Save**. + +For the example problem above, the text in the Problem component is the +following. + +:: + + What type of data are the following? + + Age: + [[Nominal, Discrete, (Continuous)]] + Age, rounded to the nearest year: + [[Nominal, (Discrete), Continuous]] + Life stage - infant, child, and adult: + [[(Nominal), Discrete, Continuous]] + + +.. _Multiple Choice: + +Multiple Choice +--------------- + +In multiple choice problems, students select one option from a list of +answer options. Unlike with dropdown problems, whose answer choices +don't appear until the student clicks the drop-down arrow, answer +choices for multiple choice problems are always visible directly below +the question. + +.. image:: Images/MultipleChoiceExample.gif + +Create a Multiple Choice Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#. Under **Add New Component**, click **Problem**. +#. In the **Select Problem Component Type** screen, click **Multiple + Choice** on the **Common Problem Types** tab. +#. When the new Problem component appears, click **Edit**. +#. In the component editor, replace the sample problem text with the text of your + problem. Enter each answer option on its own line. +#. Select all the answer options, and then click the multiple choice button. + + .. image:: Images/ProbCompButton_MultChoice.gif + + When you do this, the component editor adds a pair of parentheses next to each + possible answer. + +#. Add an "x" between the parentheses next to the correct answer. + +#. In the component editor, select the text of the explanation, and then click the + explanation button to add explanation tags around the text. + + .. image:: Images/ProbCompButton_Explanation.gif + +#. On the **Settings** tab, specify the settings that you want. +#. Click **Save**. + +For the example problem above, the text in the Problem component is the +following. + +:: + + Lateral inhibition, as was first discovered in the horsehoe crab: + + ( ) is a property of touch sensation, referring to the ability of crabs to + detect nearby predators. + ( ) is a property of hearing, referring to the ability of crabs to detect + low frequency noises. + (x) is a property of vision, referring to the ability of crabs eyes to + enhance contrasts. + ( ) has to do with the ability of crabs to use sonar to detect fellow horseshoe + crabs nearby. + ( ) has to do with a weighting system in the crabs skeleton that allows it to + balance in turbulent water. + + [Explanation] + Horseshoe crabs were essential to the discovery of lateral inhibition, a property of + vision present in horseshoe crabs as well as humans, that enables enhancement of + contrast at edges of objects as was demonstrated in class. In 1967, Haldan Hartline + received the Nobel prize for his research on vision and in particular his research + investigating lateral inhibition using horseshoe crabs. + [Explanation] + +.. _Numerical Input: + +Numerical Input +--------------- + +In numerical input problems, students enter numbers or specific and +relatively simple mathematical expressions to answer a question. + +.. image:: Images/NumericalInputExample.gif + +Note that students' responses don't have to be exact for these problems. You can +specify a margin of error. For more information, see the instructions below. + +Responses for numerical input problems can include integers, fractions, +and constants such as *pi* and *g*. Responses can also include text +representing common functions, such as square root (sqrt) and log base 2 +(log2), as well as trigonometric functions and their inverses, such as +sine (sin) and arcsine (arcsin). For these functions, Studio changes the +text that the student enters into mathematical symbols. The following +example shows the way Studio renders students' text responses in +numerical input problems. To see more examples, scroll down to **Examples**. + +.. image:: Images/Math5.gif + +Create a Numerical Input Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#. Under **Add New Component**, click **Problem**. +#. In the **Select Problem Component Type** screen, click **Numerical + Input** on the **Common Problem Types** tab. +#. When the new Problem component appears, click **Edit**. +#. In the component editor, replace the sample problem text with your own text. + +#. Select the text of the answer, and then click the numerical input button. + + .. image:: Images/ProbCompButton_NumInput.gif + + When you do this, an equal sign appears next to the answer. + +#. (Optional) If you want to include a margin of error, add **+-NUMBER** after the answer. For + example, if you want to include a 2% margin of error, add **+-2%**. + +#. In the component editor, select the text of the explanation, and then click the + explanation button to add explanation tags around the text. + + .. image:: Images/ProbCompButton_Explanation.gif + +#. On the **Settings** tab, specify the settings that you want. +#. Click **Save**. + +For the example problem above, the text in the Problem component is the +following. + +:: + + How many different countries do edX students live in as of May 2013? + + = 193 +- 5% + + [explanation] + As of edX's first birthday, in May 2013, edX students live in 193 different countries. + [explanation] + +**Examples** + +The following are a few more examples of the way that Studio renders numerical input +text that students enter. + +.. image:: Images/Math1.gif +.. image:: Images/Math2.gif +.. image:: Images/Math3.gif +.. image:: Images/Math4.gif + +For more information, see `Formula Equation Input +`_. + +.. _Text input: + +Text Input +---------- + +In text input problems, students enter text into a response field. The +response can include numbers, letters, and special characters such as +punctuation marks. Because the text that the student enters must match +the instructor's specified answer exactly, including spelling and +punctuation, we recommend that you specify more than one attempt for +text input problems to allow for typographical errors. + +.. image:: Images/TextInputExample.gif + +Create a Text Input Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To create a text input problem, follow these steps. + +#. Under **Add New Component**, click **Problem**. +#. In the **Select Problem Component Type** screen, click **Text Input** + on the **Common Problem Types** tab. +#. In the new Problem component that appears, click **Edit**. +#. Replace the default text with the text for your problem. +#. Select the text of the answer, and then click the text input button. + + .. image:: Images/ProbCompButton_TextInput.gif + + When you do this, an equal sign appears next to the answer. + + +#. In the component editor, select the text of the explanation, and then click the + explanation button to add explanation tags around the text. + + .. image:: Images/ProbCompButton_Explanation.gif + +#. On the **Settings** tab, specify the settings that you want. +#. Click **Save**. + +For the example problem above, the text in the Problem component is the +following. + +:: + + What is the technical term that refers to the fact that, when enough people + sleep under a bednet, the disease may altogether disappear? + = herd immunity + + [explanation] + The correct answer is herd immunity. As more and more people use bednets, + the risk of malaria begins to fall for everyone – users and non-users alike. + This can fall to such a low probability that malaria is effectively eradicated + from the group (even when the group does not have 100% bednet coverage). + [explanation] \ No newline at end of file diff --git a/docs/course_authors/source/conf.py b/docs/course_authors/source/conf.py index 90a78f48fd..978a2c0f75 100644 --- a/docs/course_authors/source/conf.py +++ b/docs/course_authors/source/conf.py @@ -23,3 +23,11 @@ templates_path.append('source/_templates') html_static_path.append('source/_static') +# General information about the project. +project = u'Building a Course with edX Studio' +copyright = u'2013, edX Documentation Team' + +# The short X.Y version. +version = '' +# The full version, including alpha/beta/rc tags. +release = '' \ No newline at end of file diff --git a/docs/course_authors/source/create_discussion.rst b/docs/course_authors/source/create_discussion.rst index 3fd7cd63ca..566ac1656b 100644 --- a/docs/course_authors/source/create_discussion.rst +++ b/docs/course_authors/source/create_discussion.rst @@ -1,96 +1,86 @@ +.. _Working with Discussion Components: -******************* -Create a Discussion +################################### +Working with Discussion Components +################################### + +******************* +Overview ******************* -To create a discussion in your course, you create a question and Discussion -component in Studio. You can then encourage the students to respond by seeding -the discussion space on edX or Edge. +You can add a Discussion component to a Unit, to pose a question related to the Unit and give students a chance to respond and interact. + +* :ref:`Create a Discussion Component` +* :ref:`A Student's View of the Discussion` +* :ref:`Seed a Discussion Space in Your Course` +Before you add a Discussion component, it is generally a good idea to add an HTML component that +introduces the topic to be discussed. The Discussion component itself does not contain any text and may be easy for students to overlook. + +.. _Create a Discussion Component: + +***************************** Create a Discussion Component ***************************** -Keep in mind the following best practices when you create a Discussion -component. +.. note:: Before you create a Discussion component, consider that Discussion categories are immediately visible in your forum (on the Discussion tab for your course) when you create them, even though the unit that contains the Discussion component is set to Private. -• Be very sure that you want to add the Discussion component. Discussion -• categories are immediately visible in your forum (on the Discussion tab for -• your course) when you create them, even if the unit that contains the -• Discussion component is set to Private -• When you create an ID for the Discussion component, be very careful—especially -• if you are adding the Discussion component to a running course. Follow the -• format in step 10 below to make sure that the ID is unique across all courses -• on edX. +To create a new HTML component in an existing Unit, ensure the Unit is Private. +For more information on Public and Private Units, see LINK. -• Edit only the fields at the top of the Discussion component edit box. Do not -• change the XML in the large box. +#. Under **Add New Component**, click the **discussion** icon. -To add a Discussion component: - -1. Open Studio. - -2. Make a note of the **Display Name** of the Subsection you are in and the -**Display Name** of the Unit you are in. - -3. At the location in the Unit where you want to start your discussion :doc:`create_html_component` -that contains the question you want students to discuss. - -4. Directly under this new HTML component, click **Discussion** under **Add New -Component.** - -.. image:: Images/image057.png - -5. When the following box appears, click **Discussion Tag.** - -.. image:: Images/image059.png - -6. When the following box appears, click **Edit.** - -.. image:: Images/image061.png - -The following editing box opens. You will change the values in the small boxes, -but you will not change the text in the large box. - -.. image:: Images/image063.png - -.. note:: - - In the future, these boxes may be filled in for you with a default value. - -7. In the **discussion_category** box, type the name of the category that you -want to create for the discussion. You can include spaces. - -8. In the **discussion_target** box, type the name of the subcategory that you -want to create for the discussion. You can include spaces. - -.. note:: - The category and subcategory names only appear in the discussion forum for - your course. They do not appear in the discussion space inside the Unit. - -For example, if you set **discussion_category** to be “The Discussion Component” -and you set **discussion_target** to be “Online Instruction Methods,” the -category and subcategory appear as follow in the category list in the discussion -forum: - -.. image:: Images/image065.png - :width: 300 - -9. In the **display_name** box, type a name for the discussion. The display name -appears when a student hovers the mouse over the ribbon. - -10. Click **Save.** - -.. raw:: latex + .. image:: Images/NewComponent_Discussion.png - \newpage % + The Discussion component is added: + + .. image:: Images/EditDiscussionComponent.png +#. In the Discussion component, click **Edit**. + + The Discussion component editor opens. + + .. image:: Images/DiscussionComponentEditor.png + +#. Follow the guidelines in the editor to fill in the **Discussion Category**, **Display Name**, and **Subcategory**. + +#. Click **Save**. + +.. _A Student's View of the Discussion: + +********************************** +A Student's View of the Discussion +********************************** + +For students, Discussion component names appear in the course ribbon at the top of the page: + +.. image:: Images/DiscussionComponent_LMS_Ribbon.png + +The Discussion space appears under other components in the unit. +It doesn't have a label in the body of the unit. +Instead, students see "Show discussion" or "Hide discussion" on the left, +and a blue **New Post** button on the right. + +In the following example, the Discussion component follows Video and HTML components: + +.. image:: Images/DiscussionComponent_LMS.png + +In the **Discussion** tab at the top of the page, +students can find the category and subcategory of the discussion in the left pane. + +.. image:: Images/DiscussionComponent_Forum.png + + +.. _Seed a Discussion Space in Your Course: + +************************************** Seed a Discussion Space in Your Course ************************************** -When you create a discussion, many students may feel hesitant to be the first to +Many students may feel hesitant to be the first to post an answer to your question. You can get the discussion started by posting your own answer—preferably anonymously or as a student, so that students will be more comfortable replying if they disagree with your post. @@ -98,24 +88,21 @@ more comfortable replying if they disagree with your post. To post as a student, follow the steps below. If you later want to reply as yourself, log back into your usual account and omit steps 1 and 2. -1. Set up a test account on edX or Edge with an e-mail address that is not -associated with your Course Team. +#. Set up a test account on with an e-mail address that is not associated with your Course Team. -2. Go to your course URL and register for your course. +#. Go to your course URL and register for your course. -3. On edX or Edge, locate the Unit that contains the Discussion component. + a. Locate the Unit that contains the Discussion component. -4. In the Unit, locate the discussion space. + b. In the Unit, locate the discussion space. -5. Click **New post.** + c. Click **New post.** -6. Type a title for your post in the Title box, and then enter text for your -post. +3. Type a title for your post in the Title field, and then enter text for your post. -7. If you want to, select the **post anonymously** check box or the **follow -this post** check box. +#. If you want to, select the **post anonymously** check box or the **follow this post** check box. -8. When you are satisfied with your post, click **Add Post.** +#. When you are satisfied with your post, click **Add Post.** Your new post appears at the top of list in the unit. Posts are listed in reverse chronological order. diff --git a/docs/course_authors/source/create_html_component.rst b/docs/course_authors/source/create_html_component.rst index 818873a528..fba6a044ba 100644 --- a/docs/course_authors/source/create_html_component.rst +++ b/docs/course_authors/source/create_html_component.rst @@ -1,249 +1,236 @@ +.. _Working with HTML Components: -************************ + +############################# +Working with HTML Components +############################# + +******************* +Overview +******************* + +You use an HTML component to add and format text for your course. +You can add text, lists, links and images in an HTML component. + +* :ref:`Create an HTML Component` +* :ref:`Work with the Visual and HTML Editors` +* :ref:`Use the Announcement Template` +* :ref:`Import Content from LaTex` +* :ref:`Add a Link in an HTML Component` +* :ref:`Add an Image to an HTML Component` + +.. note:: Ensure you understand the chapter :ref:`Organizing Your Course Content` before working with HTML components. + + +.. _Create an HTML Component: + +***************************** Create an HTML Component -************************ - - .. image:: Images/image067.png - -The HTML component is the most basic component type. These components are the -building blocks of text-based courses. They are used to add information such as -text, lists, links, and images to units. For example, you can use these -components between Problem components to add explanatory text. You can also use -HTML components to import LaTeX code into your course. - -The HTML component editor has two views: **Visual view** and **HTML view.** -Visual view offers you a “what you see is what you get” (WYSIWYG) editor for -editing a pre-formatted version of the text. HTML view gives you a text editor -in which you can edit HTML code directly. - -.. note:: - - Studio processes the HTML code entered when saving it and before rendering - it. Make sure that the component you created looks the way you expect live if - you go back and forth between Visual and HTML view. - -.. raw:: latex - - \newpage % - -Create a Basic HTML Component ***************************** -**To create a basic, blank HTML component:** +To create a new HTML component in an existing Unit, ensure the Unit is Private. +For more information on Public and Private Units, see :ref:`Public and Private Units`. -1. Under Add New Component, click **html**, and then click **Empty.** The -following blank component appears. +#. Under **Add New Component**, click the **html** icon. -.. image:: Images/image069.png + .. image:: Images/NewComponent_HTML.png -2. In the blank component, click **Edit.** The HTML editor opens. +2. In the list that appears, click **Text**. -.. image:: Images/image071.png - -3. Enter the information that you want, and then click **Save.** - -.. note:: - - If you want to enter links to other pages or to images or to edit the - HTML directly, switch to the HTML tab. - -.. raw:: latex + An empty component appears at the bottom of the Unit. + + .. image:: Images/HTMLComponent_Edit.png + +3. In the empty component, click **Edit**. + + The HTML Component Editor opens. - \newpage % + .. image:: Images/HTMLEditor.png -**To create a basic HTML component that includes a template you can use:** +4. Click **Settings** to enter the **Display Name** for the HTML component. -1. Under **Add New Component,** click **html** and then click **Announcement.** + A student sees the Display when hovering your mouse over the icon for the Unit in the Subsection accordian. + + Click **Save** to return to the Component Editor. + +5. Enter text as needed. + +6. Click **Save** to save the HTML component. + +For more information, see: + +* :ref:`Work with the Visual and HTML Editors` +* :ref:`Use the Announcement Template` +* :ref:`Import Content from LaTex` +* :ref:`Add a Link in an HTML Component` +* :ref:`Add an Image to an HTML Component` + +ADD LINKS + +.. _Work with the Visual and HTML Editors: + +***************************************** +Work with the Visual and HTML Editors +***************************************** + +The HTML Component editor has two views: the **Visual view** and the **HTML view.** + +You select the view by clicking the tab in the upper-right of the component Editor. + +.. image:: Images/HTMLEditorTabs.png + +============== +Visual Editor +============== + +The Visual view provides a “what you see is what you get” (WYSIWYG) editor for +editing a pre-formatted version of the text. + +.. image:: Images/HTMLEditor_Visual.png + +Use the buttons at the top of the Visual editor to change the formatting as needed. +For example, you can enclose the title in heading tags, create bulleted or numbered lists, +or apply bold, italic, or underline formatting. + +============== +HTML Editor +============== +The HTML allows you to edit HTML code directly. + +.. image:: Images/HTMLEditor_HTML.png + +.. note:: Studio processes the HTML code entered when saving it and before rendering + it. Make sure that the text you create looks the way you expect if + you go back and forth between the Visual and HTML views. + +.. _Use the Announcement Template: + +************************************ +Use the Announcement Template +************************************ + +When you create a new HTML component, you can select to use a built-in Announcement template. + +When creating the new HTML component, select **Announcement**. + +.. image:: Images/HTML_Component_Type.png + :width: 800 + The following screen opens. .. image:: Images/image073.png -2. Click **Edit.** +Edit the content of the announcement just as you would any HTML component. - The text editor opens in Visual view. Replace the template text with your - announcement text. +.. _Import Content from LaTeX: -.. note:: +************************* +Import Content from LaTeX +************************* - If you want to enter links to other pages or to images or to edit the - HTML directly, switch to the HTML tab. +If LaTeX is enabled for your course, you can create an HTML component from imported LaTeX code. -.. image:: Images/image075.png +Studio uses a third-party LaTeX processor to convert LaTeX code to XML. The LaTeX processor must be up and running. -3. Click **Save.** +1. When creating the new HTML component, select **E-text Written in LaTeX**. -.. raw:: latex - - \newpage % + The new HTML component opens, with an **upload** link: + + .. image:: Images/latex_upload.png + :width: 800 -Create Links -************ +2. To upload a LaTeX file from your computer, click **upload**. -Link to a Handout or Image -========================== + You are prompted to select a file. The file loads in the LaTeX editor. + +3. In the LaTeX editor, click **Save & Compile to edX XML**. -To link to a document, image, or other file that you uploaded to the Files & -Uploads page: + The LaTeX content is added to the HTML component. For example: + + .. image:: Images/Latex_component.png + :width: 800 -1. Create a blank HTML component, and switch to HTML view. -2. In the HTML box, create links to your files. +4. Verify that your newly created component looks the way you want it to. -To create a link to a document, enter the following syntax, where URL OF FILE is -the URL that you noted in step 5 of Upload a File to the Files & Uploads Page -and LINK TEXT is the text that the user will click. :: +You can edit the HTML component with LaTeX as you can any other component. +In the editor, you can launch the LaTeX source compiler. -

[LINK TEXT]

-For example, to create a link to the HTML template for the “About” page document -whose URL is /c4x/edX/edX101/asset/AboutPage_Template.txt, use the following -code. :: +.. _Add a Link in an HTML Component: -

HTML Template for -

+*********************************** +Add a Link in an HTML Component +*********************************** -To create a link to an image that you’ve uploaded, enter the following syntax, -where URL OF FILE is the URL that you noted in step 5 of Upload a File to the -Files & Uploads Page. :: +You can add a link in an HTML component to any file you uploaded for the course. -

+Find any copy the URL of the file in the Files & Uploads page. -For example, to create a link to the CourseImage.jpg file whose URL is -/c4x/edX/edX101/asset/CourseImage.jpg, use the following code. :: +See :ref:`Add Files to a Course` for more information. -

+While editing the HTML component: -When you use this code, the following image appears. +#. Switch to the HTML view. -.. image:: Images/image078.png - :width: 800 +#. To create a link to a document, enter the following syntax, where URL OF FILE is the URL that you copied from the Files & Uploads Page and LINK TEXT is the text that the user will click. + + ``

[LINK TEXT]

`` -3. Click **Save.** Your files or images appear in the component. -.. raw:: latex - - \newpage % - -Link to Course Units -==================== +.. _Add a Link to a Course Unit: -To direct the student to a specific place in your own course, you must add an -HTML link to that unit. To do this: +============================ +Add a Link to a Course Unit +============================ -1. Determine the relative directory of your course. +You can add a link to a course unit in an HTML component. -a. On the Course Settings tab, click the blue your course URL link under Basic - Information. +#. Determine the unit identifier of the unit you're linking to. To do this, open the + unit page in Studio, and locate the **Unit Identifier** field under **Unit Location** in the right pane. -.. image:: Images/image079.png - :width: 800 +#. Copy the unit identifier. -The registration page for your course opens. +#. Open the HTML component where you want to add the link. -b. In the address bar at the top of the page, locate the URL. +#. Select the text that you want to make into the link. -c. Copy the part of the URL after “.org” and before “about”, including the -forward slashes. The syntax is the following. :: +#. Click the link icon in the toolbar. - /courses/[organization]/[course_number]/[course_name]/ +#. In the Insert/Edit Link dialog box, enter the following in the Link URL field. + + Make sure to replace (including the brackets) with the unit + identifier that you copied in step 2, and make sure to include both forward slashes (/). + + ``/jump_to_id/`` -For example, for edX101: How to Create an edX Course from edX, the complete URL -is the following. :: +#. If you want the link to open in a new window, click the drop-down arrow next to + the Target field, and then select Open Link in a New Window. If not, you can leave the default value. + +#. Click **Insert**. - https://edge.edx.org/courses/edX/edX101/How_to_create_an_edX_course/about +#. Save the HTML component and test the link. -The relative directory is the following. :: - /courses/edX/edX101/How_to_create_an_edX_course/ +.. _Add an Image to an HTML Component: -2. Determine the location ID of the target unit. Studio generates the location -ID for each unit when you create the unit. The location ID uses the following -syntax. :: +*********************************** +Add an Image to an HTML Component +*********************************** - i4x:////vertical/ +You can add an any image that you have uploaded for the course to an HTML component. -.. note:: +Find any copy the URL of the image in the Files & Uploads page. - To find the location ID, open the page of the unit you are trying to link - to in Studio and look at the URL in the browser’s address bar. The location ID - is the text in the URL after edit, as in the following example. +See :ref:`Add Files to a Course` for more information. -.. image:: Images/image081.png +While editing the HTML component: +#. Switch to the HTML view. -3. Open the unit that you want to link from. - -4. Under Add New Component, click html, and then click Empty. A new, blank -component appears. - -.. image:: Images/image083.png - :width: 800 - -5. Click **edit**. - -6. In the HTML editor that opens, click the HTML tab. - -7. Next to the number 1, type the following. Replace relative course directory, -location id of unit, and link text with your information. :: - - [link text] - -For example, a link to the “Creating an HTML Component” unit in edx101 -resembles the following :: - - Creating an HTML - - - -.. raw:: latex - - \newpage % - -Import from LaTeX -***************** - -You can create an HTML component from imported LaTeX code. - -.. note:: - - This feature is currently under development. - -1. Under **Add New Component**, click **html**, and then click **E-text Written -in LaTeX.** - -.. image:: Images/image067.png - :width: 800 - -2. In the component that appears, click Edit. - -.. image:: Images/image083.png - :width: 800 - -3. The component editor opens. In the top left corner of the editor, click the -yellow **Edit High Level Source** text. - -.. image:: Images/image085.png - :width: 800 - -4. In the **High Level Source Editing** screen that opens, replace the sample -code with your LaTeX code. - -.. image:: Images/image087.png - :width: 800 - -5. Click **Save and compile to edX XML** to convert the LaTeX code into edX XML -code. - -.. note:: - - Studio uses a third-party LaTeX processor to convert LaTeX code to XML. - The LaTeX processor must be up and running. - -6. Click **Save**. Verify that your newly created component looks the way you -want it to. - +#. To add the image to a document, enter the following syntax, where URL OF FILE is the URL that you copied from the Files & Uploads Page. + + ``

`` diff --git a/docs/course_authors/source/create_lesson.rst b/docs/course_authors/source/create_lesson.rst deleted file mode 100644 index d0974ea8dc..0000000000 --- a/docs/course_authors/source/create_lesson.rst +++ /dev/null @@ -1,128 +0,0 @@ - -************************** -Create a Lesson in Studio -************************** - -Once you have created a course, you are ready to create content for that course. - -.. warning:: - - The alpha version of Studio does not have versioning or automatic - updating of your browser between refreshes. Versioning is planned for future - refresheseleases, but, in the meantime, only one author should edit a unit, in one - browser, on only one tab.  If a unit is open for editing in multiple browser - sessions, the session that saves last will overwrite any previously saved - content without displaying a warning. Also, older browser sessions can overwrite - more recent content, so refresh your browser before you start working every time - you work with a private unit or edit a draft of a public unit. - - -Introduction -************ - -Just as in an offline course, content in an online course is broken down into -smaller pieces. In Studio, these pieces are categories called **sections, -subsections, and units** Units, in turn, are made up of **components** that -contain the actual content of your course. - -Sections, for example, may correspond to weeks in your course, while subsections -often correspond to lessons, homework assignments, or exams. A lesson is an -interwoven selection of units of different types, such as videos, text, images, -discussions, and problems. It is an interactive representation of the material -that you would cover in a typical class period. - -On the **Course Outline** page, you can see all the sections, subsections, and -units in your course at a glance, as well as whether the subsections are public -or private. - - - .. image:: Images/image029.png - :width: 800 - - .. image:: Images/image031.png - :width: 800 - -.. raw:: latex - - \newpage % - -Section -******* - -A section is the topmost category that you use to organize your course. Many -instructors name sections according to the number of weeks in the course—for -example, section 1 is named Week 1, section 2 is named Week 2, and so on. -Sections contain subsections, which in turn contain units. - -You can set an individual release date for each section in your course. None of -the content in the section is visible until its release date has passed. - -For more information about how to create a section, see -:doc:`create_section_sub_section`. - -.. raw:: latex - - \newpage % - -Subsection -********** - -A subsection is a subcategory of a section. Many instructors name subsections -according to the topics in their courses. Subsection names appear along with -section names in the left pane when you view your course on Edge. - - .. image:: Images/image033.png - -You can set subsections to be one of the assignment types that you created when -you set up grading. You can then include assignments in the body of that -subsection. - -You can set an individual release date for each subsection in your course. None -of the content in the subsection is visible until its release date has passed. -If you do not set a release date, the subsection has the same release date as -its section. - -For more information about how to create a subsection, see -:doc:`create_section_sub_section`. - -.. raw:: latex - - \newpage % - -Unit -**** - -A unit is a further category that helps you organize your course materials. -Units contain components, which are the building blocks of lessons. Units do not -appear in the left pane with section and subsection headings. Instead, each unit -appears as a part of the course accordion at the top of the page when you view -your course on Edge. The following page shows a subsection that has two Units. - - .. image:: Images/image035.png - -Note that by default, all units are set to **Private.** To make a unit visible -to students, you have to explicitly change the unit’s visibility to **Public.** -For more information see :doc:`set_content_releasedates` . - -.. raw:: latex - - \newpage % - - -Component -********* - -A component is the part of a unit that contains your actual course content. The -names of all components in a unit appear when you hover over the unit in the -course accordion at the top of the page. - -.. image:: Images/image037.png - :width: 800 - -There are four types of components: Discussion components, HTML components, -Problem components, and Video components. For more information, -see :doc:`create_discussion`, :doc:`create_html_component`, :doc:`create_problem`, and :doc:`create_video` . - - - - diff --git a/docs/course_authors/source/create_new_course.rst b/docs/course_authors/source/create_new_course.rst new file mode 100644 index 0000000000..9e7317cd82 --- /dev/null +++ b/docs/course_authors/source/create_new_course.rst @@ -0,0 +1,360 @@ +.. _Setting up a New Course: + +########################### +Setting up a New Course +########################### + + +******************* +Overview +******************* + +This chapter describes how to create and set up your course: + +#. :ref:`Create a New Course` +#. :ref:`Edit Your Course` +#. :ref:`Use the Course Checklist` +#. :ref:`Add Course Team Members` +#. :ref:`Set Important Dates for Your Course` +#. :ref:`Describe Your Course` +#. :ref:`Add a Course Image` +#. :ref:`Add a Course Video` +#. :ref:`Set Course Requirements` +#. :ref:`Add Files to a Course` +#. :ref:`Add Static Pages` +#. :ref:`Add a Course Update` +#. :ref:`Add Course Handouts` +#. :ref:`Add Textbooks` + +Also see the chapters :ref:`Establish a Grading Policy` and :ref:`Organizing Your Course Content`. + + +.. _Create a New Course: + +******************* +Create a New Course +******************* + +#. Log in to Studio. +#. Click **New Course**. +#. Enter course information as needed and click **Create**. + + .. image:: Images/new_course_info.png + :width: 800 + + .. note:: Enter new course information carefully. This information becomes part of the URL for your course. To change the URL after the course is created, you must contact edX through the Help site (http://help.edge.edx.org). Additionally, because this information becomes part of your course URL, the total number of characters in the following three fields must be 65 or fewer. + + * For **Course Name**, enter the title of your course. For example, the name may be “Sets, Maps and Symmetry Groups". Use title capitalization for the course title. + + * For **Organization**, enter the name of your university. Do not include whitespace or special characters. + + * For **Course Number**, enter both a subject abbreviation and a number. For example, for public health course number 207, enter **PH207**. For math course 101x, enter **Math101x**. Do not include whitespace or special characters in the course number. + + *Note: If your course will be open to the world, be sure to include the "x". If it is exclusively an on-campus offering, do not include the "x".* + +4. Click **Save.** + +You then see the empty Course Outline. + +.. _Edit Your Course: + +************************ +Edit Your Course +************************ +When you create a new course, the course opens in Studio automatically and you can begin editing. + +If you come back to Studio later, your courses are listed on the Studio log in page. + + .. image:: Images/open_course.png + :width: 800 + +To open the course, click the course name. + +When you open a course, you go to the Course Outline. The next topic discusses working with your course outline. + +The rest of this page discusses other tasks you must do to set up your course. + +.. _Use the Course Checklist: + +************************ +Use the Course Checklist +************************ + +You can use a Course Checklist within Studio to help you work through the tasks of building a course. + +Categories of tasks in the Course Checklist include: + +* Getting Started with Studio +* Draft a Rough Course Outline +* Explore edX's Support Tools +* Draft Your Course About Page + +From the **Tools** menu, select **Checklists**. + + .. image:: Images/checklist.png + :width: 800 + + +As shown above for the **Add Course Team Members** task, if you hover over a task, a button is displayed that takes you to the page to complete that task. + +You can expand and collapse sections of this page as needed. + +You can check tasks as you complete them. Studio saves your changes automatically. Other course staff can see your changes. + +.. _Add Course Team Members: + +************************ +Add Course Team Members +************************ + +Course team members are users who help you build your course. + +Only a team member with Admin access can add or remove course team members, or grant Admin access to other team members. + +Other course team members can edit the course and perform all tasks except adding and removing other new team members and granting Admin access. + +.. note:: Any course team member can delete content created by other team members. + +All course team members must be registered with Studio and have an active account. + +To add a course team member: + +#. Ensure you have Admin access. +#. Ensure that the new team member has registered with Studio. +#. From the **Settings** menu, select **Course Team**. +#. Click **Add a New Team Member**. +#. Enter the new team member's email address, then click **ADD USER**. + +.. _Set Important Dates for Your Course: + +*********************************** +Set Important Dates for Your Course +*********************************** +You must set dates and times for enrollment and for the course. + +From the **Settings** menu, select **Schedule and Details**. + +.. image:: Images/schedule.png + +Follow the on-screen text to enter the course and enrollment schedule. + +.. note:: + + The Time fields on this page reflect the current time zone in your browser, depending on your geography. Course start times for students are shown as UTC. + +.. _`Describe Your Course`: + +************************ +Describe Your Course +************************ + +The description of your course appears on the Course Summary page that students see, and includes a course summary, prerequisites, staff information and FAQs. + +#. From the **Settings** menu, select **Schedule & Details**. +#. Scroll down to the **Introducing Your Course** section, then locate the **Course Overview** field. + +.. image:: Images/course_overview.png + :width: 800 + +3. Overwrite the content as needed for your course, following the directions in the boilerplate text. Do not edit HTML tags. For a template that includes placeholders, see :doc:`appendices/a`. + + .. note:: There is no save button. Studio automatically saves your changes. + +4. Click **your course summary page** in the text beneath the field to test how the description will appear to students. + +.. _`Add a Course Image`: + +************************ +Add a Course Image +************************ + +The course image appears on the Course Summary page that students see. + +The course image should be a minimum of 660 pixels in width by 240 pixels in height, and in .JPG or .PNG format. + +#. From the **Settings** menu, select **Schedule & Details**. +#. Scroll down to the **Course Image** section. +#. To select an image from your computer, click **Upload Course Image**, then follow the prompts to find and upload your image. +#. View your course summary page to test how the image will appear to students. + +.. _`Add a Course Video`: + +************************ +Add a Course Video +************************ +The course video appears on the Course Summary page that students see. + + +#. Upload the course video to YouTube. Make note of the code that appears between **watch?v =** and **&feature** in the URL. This code appears in the green box below. + + .. image:: Images/image127.png + :width: 800 + +2. From the **Settings** menu, select **Schedule & Details**. +#. Scroll down to the **Course Introduction Video** section. +#. In the field below the video box, enter the YouTube video ID. When you add the code, the video automatically loads in the video box. Studio automatically saves your changes. +#. View your course summary page to test how the video will appear to students. + +.. _`Set Course Requirements`: + +************************ +Set Course Requirements +************************ +The estimated Effort per Week appears on the Course Summary page that students see. + +#. From the **Settings** menu, select **Schedule & Details**. +#. Scroll down to the **Requirments** section. +#. In the **Hours of Effort per Week** field, enter the number of hours you expect students to work on this course each week. +#. View your course summary page to test how the video will appear to students. + +.. _`Add Files to a Course`: + +********************** +Add Files to a Course +********************** + +You can add files that you want students to access in the course. After you add a file, +you must link to it from a course component, update, or in the course handouts. A file +is only visible to students if you create a link to it. + +.. note:: Because the file name becomes part of the URL, students can see the name of the file when they open it. Avoid using file names such as AnswerKey.pdf. + +.. warning:: If you upload a file with the same name as an existing course file, the original file is overwritten without warning. + +To add a file: + +#. From the **Content** menu, select **Files & Uploads**. +#. Click **Upload New File**. +#. In the **Upload New File** dialog box, click **Choose File**. +#. In the **Open** dialog box, locate the file that you want, and then click **Open**. +#. To add another file, click **Load Another File**. +#. To close the dialog box, click the **x** in the top right corner. + +When you close the dialog box, the new files appear on the **Files & Uploads** page. + +================== +Get the File URL +================== +To link to the file from a course component, update, or the course handout list, you must get the file URL. + +In the **Files & Uploads** page, locate the file. The **URL** column shows the value to use in links. + +You can double click a value in the **URL** column to select the value, then copy it. + +================== +Lock a file +================== +By default, anyone can access a file you upload if they know the URL, even people not enrolled in your class. + +To ensure that those not in your class cannot view the file, click the lock icon. + +================== +Delete a file +================== +To delete a file, click the **x** icon next to the file. You are prompted to confirm the deletion. + +.. warning:: If you have links to a file you delete, those links will be broken. Ensure you change those links before deleting the file. + +.. _`Add Static Pages`: + +**************** +Add Static Pages +**************** +You can add static pages to your course. Each static page appears in your courses navigation bar. +For example, the following navigation bar includes a +**Syllabus** and **Projects** static pages. + +.. image:: Images/image157.png + +You can use static pages for a syllabus, grading policy, course handouts, or any other purpose. + +To create a static page: + +#. From the **Content** menu, select **Static Pages**. +#. Click **New Page**. The following screen opens: + + .. image:: Images/image161.png + :width: 800 + +3. Click **Edit**. + +#. Enter text for your page. You can switch to HTML mode if needed. +#. To edit the Display Name, click **Settings**. +#. Click **Save**. + + +================== +Add a Calendar +================== +You can also use a static page to show a course calendar. + +You can embed a Google calendar. Paste the embed code for the calendar in the static page. + +You can also create a dynamic HTML calendar. See :ref:`Appendix B`. + +.. _`Add a Course Update`: + +********************** +Add a Course Update +********************** + +You add updates to notify students of exams, changes in the course schedule, or anything else of a more urgent nature. + +Students see course updates in **Course Info** tab when they log in to the course: + +.. image:: Images/course_info.png + :width: 800 + +To add a course update: + +#. From the **Content** menu, select **Updates**. +#. Click **New Update**. +#. Enter your update as as HTML. + + .. note:: You must enter the update in HTML. For a template that includes placeholders, see :ref:`Appendix A`. + +4. Click **Save**. + +.. _`Add Course Handouts`: + +********************** +Add Course Handouts +********************** +You can add course handouts that are visible to students on the **Course Info** page. + +.. note:: You must :ref:`Add Files to a Course` before you can add them as course handouts. + +#. From the **Content** menu, select **Updates**. +#. In the **Course Handouts** page, click **Edit**. +#. Edit the HTML to add links to the files you uploaded. See :ref:`Add a Link in an HTML Component` for more information. +#. Click **Save**. + +.. _`Add Textbooks`: + +**************** +Add Textbooks +**************** +You can add textbooks for your course as PDF files. + +Each textbook that you add is displayed to students as a tab in the course navigation bar. + +It's recommended that you upload a separate PDF file for each chapter of your textbook. + +When students open the textbook tab in the course, they can navigate the textbook by chapter: + +.. image:: Images/textbook_chapters.png + :width: 800 + +To add a textbook: + +#. From the **Content** menu, select **Textbooks**. +#. Click **New Textbook**. The following screen opens: + + .. image:: Images/textbook_new.png + :width: 800 + +3. Enter the **Textbook Name**. +#. Enter the first **Chapter Name**. +#. To upload a PDF file from your computer, click **Upload PDF**. Follow the prompts to upload your file. +#. To add addition chapters, click **+Add a Chapter** and repeat steps 3 and 4. +#. Click **Save**. \ No newline at end of file diff --git a/docs/course_authors/source/create_problem.rst b/docs/course_authors/source/create_problem.rst deleted file mode 100644 index 3fe8264b4d..0000000000 --- a/docs/course_authors/source/create_problem.rst +++ /dev/null @@ -1,374 +0,0 @@ - -**************** -Create a Problem -**************** - -Overview -******** - - -The problem component allows you to add interactive, automatically graded exercises to your course content. You can create many different types of problems -in Studio. - -By default, all problems are ungraded practice problems. To change the problems to graded problems, change the assignment type of the subsection. - -To create a problem, determine: - -• The type of problem that you want. - -• The weight to assign to the problem. - -• Whether you want to randomize the problem. - -• How to close the problem-that is, how to set the number of attempts a student has, [as well as set the due date]. - -• How you want to provide feedback to students; show answer on/off. - -This course contains several places with more information about creating exercises and integrating them into your course. - -• `Writing Exercises `_ has more in-depth discussion about problem types, and some general pedagogical considerations for adapting to the online format and a `Gallery of Response Types `_ - -• `Appendix E ` contains XML documentaion for the different problem response types. - -• The `Discussion Forum `_ for this class is a good place to ask questions about exercise types, report any errors or oddities that you may encounter, and get technical support. - -• Creating problems for the online format opens a new playing field in the educational process. A big part of the community aspect of edX is to initiate and grow a `Creative Problems `_ . Please look here to be inspired by new approaches when first making your class. Please also come back to post interesting approaches that you came up with while running your class, and to share with the community what worked well and what did not. - -**Simple Editor and Advanced Editor** - - -Studio offers two interfaces for editing problem components. - -• The **Simple Editor** allows you to edit problems visually, without having to work with XML. - -• The **Advanced Editor** converts the problem to edX's XML standard and allows you to edit that XML directly. For more information about the XML for different problem types, see `Appendix E ` . - - -Some of the simpler problem templates, including multiple choice, open in the Simple Editor and allow you to switch to the Advanced Editor. The more complicated problem types, such as Circuit Response, open in the Advanced Editor. - -.. note:: - - You can switch at any time from the Simple Editor to the Advanced Editor by clicking "Advanced Editor" in the Simple Editor interface. However, there is no way to go back from the Advanced Editor to the Simple Editor without making a new component. - -To open the Advanced Editor, click **Advanced Editor** in the top right corner of the Simple Editor. - -.. image:: Images/image275.png - :width: 600px - - -The following is a multiple choice problem in the Advanced Editor. - -.. image:: Images/image276.png - :width: 600px - -.. raw:: latex - - \newpage % - - -Problem Type -************ - -Links to description of all the different problem types-brief. Then include links to all the XML, etc. - -You may want to create a problem that has more than one response type. For example, you may want to create a multiple choice question, and then ask the -student to explain his or her response. You may also want a student to be able to check the answers to many problems at one time. To accomplish these -tasks, you can include multiple problems inside a single Problem component. (LINK) - -.. raw:: latex - - \newpage % - -Randomizing -*********** - -The **rerandomize** setting determines whether any random variable inputs for a problem are randomized each time a student loads the problem. -(This is only applicable to problems with randomly generated numeric variables.) - -.. raw:: latex - - \newpage % - -Scoring and Weight -****************** - -Problems store a **point score** for submitted responses. The score that a student earns is the number of correct responses the student -submits divided by the maximum score for the problem. The default maximum score, or weight, is the integer number of response type inputs the problem has. -Thus, the weight attribute for a problem with one response type input is set to 1 (one point). You can change the maximum score for an individual problem -by manually changing the problem **weight** attribute to another number. When you do this, the number of points that you specify appears next -to the problem title ( to one decimal precision). - -**WEIGHT: 0 POINTS** - -Scores are stored for all problems, but they only contribute to a student's grade in the course if they are part of a subsection marked as graded. For more -information, see the material on attempts and closing problems in 7B: Feedback and Grading. - -.. raw:: latex - - \newpage % - -**Computing Point Scores** - -The point score of a response for a problem reflects the correctness of the response and is recorded as the number of points earned out of the maximum -possible score for the problem (also known as the problem weight). The formula used for computing the recorded point score is the following: - -• **point score of response = problem weight * (# inputs correct / # total inputs)** - -• **point score of response** is the point score "earned" by this response for the problem. - -• **problem weight** is the maximum possible point score that can be earned for the problem. By default, this is the integer number of response types in that problem. This can be changed to another value by setting the weight attribute of the problem, as described in Setting Problem Attributes. - -• ** # inputs correct** is the number of values for this response that were evaluated as correct by the response type fields. - -• **# total inputs** is the total number of response type fields in the problem. - -.. raw:: latex - - \newpage % - -**Examples** - -The following are some examples of setting problem weight and computing problem scores. - - -**Example 1** - -A problem with two response type inputs and a blank weight attribute has a maximum score of 2.0 points. - -A student response to this problem that consists of one correct input value and one incorrect input value would be marked as having a score of 1.0 points -out of 2.0 points possible. - - -**Example 2** - -A problem with three response type inputs and a weight attribute of 12 has a maximum score of 12.0 points. - -A student response to this problem that consists of one correct input value and two incorrect input values would be marked as having a score of 4.0 points out of 12.0 points possible. - - -**Example 3** - -A problem with four response type inputs and a weight attribute of 2 has a maximum score of 2.0 points. - -A student response to this problem that consists of two correct input values and two incorrect input values would be marked as having a score of 0.5 of a point out of 2.0 points total. - -**PROBLEM: 20.0 POINTS** - -• The weight attribute for this problem has been changed from the default. - -• How many points is the entire problem worth? - -• What number is the weight attribute of this problem set to? - -• How many response inputs does this problem have? - -• What is the default maximum score for this problem? - -• If a response to this problem got one value right and the rest wrong, what score would it be assigned? - -.. raw:: latex - - \newpage % - -Close -***** - -To stop accepting responses and recording points, problems can be **closed.** Closed problems do not display a **Check** button. Students -can still see questions, solutions, and revealed explanations in a closed problem, but they can no longer check their work, submit responses, or change their stored score. - -There are several ways that you can close problems: - -• Set a due date for the problems in a subsection. Note that you cannot set due dates for individual problems -- only for containing subsections (assignments). By default, due dates are not set. To set a due date, see LINK. - -• Specify a grace period for your course. Note that the grace period applies to the entire course. To set a grace period, see LINK. - -• Set the number of attempts for the individual problem component. The attempts setting determines the number of times a student is allowed to check their answer by clicking Check before the problem closes. If this field is left blank, a student has unlimited attempts. If you specify a number for the attempts setting, the number of total allowed and remaining attempts appears next to the Check button for the problem. Problems with a limited number of attempts also always display a Save button that allows response values to be saved without being submitted. When there is only one submission left, the student will receive a warning, and the Check button will be replaced with a Final Check button. When no attempts are left, both the Save and Check button will disappear.For more information, see Problem Attributes. - -• Manually increase the number of attempts left for a given problem for a particular student from the Instructor tab in the live view of your course, when accessed in the Instructor view on Edge. This is recommended only for unusual situations, such as if you have to fix live problems during an exam. - -.. raw:: latex - - \newpage % - -Feedback -******** - -Studio includes several tools to provide feedback to students: the **Check** button, the **Show Answer** button, and the**Attempts** setting. When you use the **Show Answer** button, you can also provide a detailed explanation of the answer. - -TBD-SCREENSHOT OF PROBLEM WITH THESE ELEMENTS CIRCLED - -**Check Button** - -The student clicks the **Check** button to submit a response. The problem module then performs the following steps. - -• Accepts and stores the responses entered into each input. - -• Checks the response values against the correct answers or solutions using an automatic grader. - -• Visually marks the correct responses with a green check mark and the incorrect responses with a red x. - -• Stores the point score earned by this response for this problem for this student. - -If a student wants to save but not submit a response, the student can click **Save**. - -In the following problem, enter a response, and then click **Check**. The problem tells you if your response is correct or incorrect. -Additionally, although you don't see it, a point score is also automatically stored for the response you submit. - -.. image:: Images/image277.png - :width: 600px - -**Show Answer button** - -When a student clicks **Show Answer**, the problem shows the correct answers next to the corresponding response inputs and reveals any -additional explanations that you have provided. **Show Answer** is controlled by the **showanswer** attribute in the problem -editor. It can be set to be never visible, always visible, or visible only when the problem has closed. [Reference: Setting Problem Attributes.] - -In the following problem, the **Show Answer ** button appears after the student has made at least one attempt to answer. Enter a response that you know is wrong, and then click **Check**. - -.. image:: Images/image278.png - :width: 600px - -Now, click **Show Answer** to view the correct answer and its explanation. - -.. image:: Images/image279.png - :width: 600px - - -.. raw:: latex - - \newpage % - - - -Create a Problem -**************** - -.. note:: - - You can also include non-graded exercises throughout your course. - - -To add interactive, automatically graded exercises to your course content, use the Problem component. This component allows you to include an explanation -that the student can see when the student clicks **Show Answer**. - - Studio offers several templates that you can use. Alternatively, you can create your own problem type in XML. - For detailed information about different problem types, see `Appendix E `. - - -1. Under **Add New Component**, click **Problem**. - -.. image:: Images/image096.png - :width: 600px - - -The **Select Problem Component Type** screen appears. By default, the **Common Problem Types** tab is selected. - -.. image:: Images/image097.png - :width: 600px - - -To see a list of more complex problem types, click the **Advanced** tab. - - -.. image:: Images/image099.png - :width: 600px - - -2. Click the problem type that you want. - -.. note:: - - To create your own problem in XML, click "Empty" to open a blank XML editor. - -A new problem component with sample template text appears. - -For example, if you click **Multiple Choice**, the following problem component appears. - -.. image:: Images/image101.png - :width: 600px - - - -3. Click **Edit**. This opens the Simple Editor for the problem component. The following example shows this view for a multiple choice -problem. - -.. image:: Images/image103.jpg - :width: 600px - - -4. Set the problem attributes. - -In the **display_name** box, type the text that you want the student to see when the student hovers over the icon in the bar at the top of the page. This text also appears as a header for the problem. - -a. In the **weight** box, set a weight for the problem. If you want the problem to be a practice problem, set this to zero (0). - -b. In the **rerandomize** box, - -c. In the **attempts** box, specify the number of attempts that you want to allow the student. - -d. In the **showanswer** box, enter one of the following settings. - -.. raw:: latex - - \newpage % - -**Reference** - -• **never** = The Show Answer button is never visible. - -• **closed** = The Show Answer button is not visible if either the due date has passed, or the student has no attempts left. - -• **attempted** = The Show Answer button appears after the student has checked an answer once, regardless of correctness. - -• **always** = The Show Answer button always appears. - - -5. Modify the problem text, and then click **Save** to save and check your work. Make sure to publish the draft you are working on to view the problem live. - -.. raw:: latex - - \newpage % - -Modify a Released Problem -************************* - - **WARNING: Be careful when you modify problems after they have been released!** - -Currently, problems cache the following information per student: - -• The student's last **submitted** response. - -• The score the student earned for that last response. - -• The maximum point score for that problem. - -This information is updated when a student submits a response to a problem. If the student refreshes the **Progress** page, solutions are not re-checked. If a student refreshes the page of a problem, the latest version of the problem statement is loaded, but their previous response is NOT reevaluated. Rather, the previous response is loaded on top of the current problem statement. That is **existing** student responses for a problem are not reevaluated if the problem statement or attributes are changed, until a student goes back and resubmits the problem. Furthermore, as of the time of writing, if the problem weight attribute is changed, stored scores are re-weighted (without rechecking the response) when the student reloads the **Progress** page. - -For example, you may release a problem that has two inputs. After some students have submitted answers, if you change the solution to one of the inputs, the existing student scores are not updated. - -Example: If you change the number of inputs to three, students who submitted answers before the change will have a score of 0, 1, or 2 out of 2.0. Students who submitted answers after the change will have scores of 0, 1, 2, or 3 out of 3.0 for the same problem. - -However, if you go in and change the weight of the problem, the existing scores update when you refresh the **Progress** page. - -Note that the behavior of re-grading in case of error is an edX Edge case. It is dependent on the implementation of grading, and may change. The goal in the future is to include re-grading that will allow some basic updates to live problems, whether or not students have submitted a response. - -.. raw:: latex - - \newpage % - - -Workarounds -=========== - -If you have to modify a released problem in a way that affects grading, you have two options. Note that both options require you to ask your students to go back and resubmit a problem. - - -1. Increase the number of attempts on the problem in the same Problem component. Then ask all the students in your class to redo the problem. - -2. Delete the entire Problem component in Studio and create a new Problem component with the content and settings that you want. Then ask all the students in your course to go back to this assignment and complete problem. - -Check your **Progress** view or the **Instructor** tab on Edge as described in the Viewing Scores unit to see if point scores are being stored as you expect. If there are issues with stored scores that you do not understand or cannot fix, contact support on the Studio help page. - -For a discussion of some trade-offs and some suggestions for cleaner solutions in the future, see the following `discussion thread `_ on the Studio help desk. - -You can include multiple problems of different types inside a single Problem component, even if you select a particular template when you create a problem. A template is simply an XML editor with template text already filled in. You can add to or replace the template text. diff --git a/docs/course_authors/source/create_problem_component.rst b/docs/course_authors/source/create_problem_component.rst new file mode 100644 index 0000000000..37b244f61e --- /dev/null +++ b/docs/course_authors/source/create_problem_component.rst @@ -0,0 +1,404 @@ +.. _Working with Problem Components: + +################################ +Working with Problem Components +################################ + +********* +Overview +********* + +The problem component allows you to add interactive, automatically +graded exercises to your course content. You can create many different +types of problems in Studio. + +All problems receive a point score, but, by default, problems do not count +toward a student's grade. If you want the problems to count toward the +student's grade, change the assignment type of the subsection that contains the +problems. + +.. _Components and the User Interface: + +************************************ +Components and the User Interface +************************************ + +This section contains a description of the various components of a +problem as students see it in the LMS, as well as an introduction to the +Studio user interface for course creators. + +============================== +The Student View of a Problem +============================== + +All problems on the edX platform have several component parts. + +.. image:: Images/AnatomyOfExercise1.gif + +#. **Problem text.** The problem text can contain any standard HTML formatting. + +#. **Response field with the student’s answer.** Students enter answers + in *response fields*. The appearance of the response field depends on + the type of the problem. + +#. **Rendered answer.** For some problem types, Studio uses MathJax to + render plain text as “beautiful math.” + +#. **Check button.** The student clicks **Check** to submit a response + or find out if his answer is correct. If the answer is correct, a green + check mark appears. If it is incorrect, a red X appears. When the + student clicks the **Check button**, Studio saves the grade and current + state of the problem. + +#. **Save button.** The student can click **Save** to save his current + response without submitting it for a grade. This allows the student to + stop working on a problem and come back to it later. + +#. **Show Answer button.** This button is optional. When the student + clicks **Show Answer**, the student sees both the correct answer (see 2 + above) and the explanation (see 10 below). The instructor sets whether + the **Show Answer** button is visible. + +#. **Attempts.** The instructor may set a specific number of attempts or + allow unlimited attempts. + + .. image:: Images/AnatomyOfExercise2.gif + +#. **Feedback.** After a student clicks **Check**, all problems return a + green check mark or a red X. + + .. image:: Images/AnatomyofaProblem_Feedback.gif + +#. **Correct answer.** Most problems require that the instructor specify + a single correct answer. + +#. **Explanation.** The instructor may include an explanation that + appears when a student clicks **Show Answer**. + +#. **Reset button.** This button clears the student input, so that the + problem looks the way it did originally. + +#. **Hide Answer button.** + + .. image:: Images/AnatomyOfExercise3.gif + +#. **Grading.** The instructor may specify whether a group of problems + is graded. If a group of problems is graded, a clock icon appears for + that assignment in the course accordion. + + .. image:: Images/clock_icon.gif + +#. **Due date.** The date that the problem is due. A problem that is + past due does not have a **Check** button. It also does not accept + answers or provide feedback. + +**Note** Problems can be **open** or **closed.** Closed problems do not +have a **Check** button. Students can still see questions, solutions, +and revealed explanations, but they cannot check their work, submit +responses, or change their stored score. + +There are also some attributes of problems that are not immediately +visible. + +- **Randomization.** For some problems, the instructor can specify + whether a problem will use randomly generated numbers that vary from + student to student. +- **Weight.** Different problems in a particular problem set may be + given different weights. + +============================== +The Studio User Interface +============================== + +Studio offers two interfaces for editing problem components: the Simple +Editor and the Advanced Editor. + +- The **Simple Editor** allows you to edit problems visually, without + having to work with XML. +- The **Advanced Editor** converts the problem to edX’s XML standard + and allows you to edit that XML directly. + +**Note** You can switch at any time from the Simple Editor to the +Advanced Editor by clicking **Advanced Editor** in the top right corner +of the Simple Editor interface. However, it is not possible to switch from +the Advanced Editor to the Simple Editor. + +The Simple Editor +~~~~~~~~~~~~~~~~~ +The Common Problem templates, including multiple choice, open in the Simple Editor. The +following image shows a multiple choice problem in the Simple Editor. + +The Simple Editor includes a toolbar that helps you format the text of your problem. +When you select text and then click the formatting buttons, the Simple Editor formats +the text for you automatically. The toolbar buttons are the following: + +1. Create a level 1 heading. +2. Create multiple choice options. +3. Create checkbox options. +4. Create text input options. +5. Create numerical input options. +6. Create dropdown options. +7. Create an explanation that appears when students click **Show Answer**. +8. Open the problem in the Advanced Editor. +9. Open a list of formatting hints. + +The following image shows a multiple choice problem in the Simple Editor. + +.. image:: Images/MultipleChoice_SimpleEditor.gif + +The Advanced Editor +~~~~~~~~~~~~~~~~~~~ +The **Advanced Editor** opens a problem in XML. The Advanced Problem templates, +such as the circuit schematic builder, open directly in the Advanced Editor. + +For more information about the XML for different problem types, see :ref:`Appendix E`. + +The following image shows the multiple choice problem above in the Advanced Editor +instead of the Simple Editor. + +.. image:: Images/MultipleChoice_AdvancedEditor.gif + +.. _Problem Settings: + +****************** +Problem Settings +****************** + +All problems except word cloud and open response assessment problems +have the following settings. These settings appear on the **Settings** tab in +the component editor. (The settings for open response assessments and word clouds +are listed on the page for those problem types.) + +- Display Name +- Maximum Attempts +- Problem Weight +- Randomization +- Show Answer + +.. image:: Images/ProbComponent_Attributes.gif + +=============== +Display Name +=============== + +This setting indicates the name of your problem. The display name +appears as a heading over the problem in the LMS and in the course +ribbon at the top of the page. + +.. image:: Images/ProbComponent_LMS_DisplayName.gif + +============================== +Maximum Attempts +============================== + +This setting specifies the number of times a student can try to answer +the problem. By default, a student has an unlimited number of attempts. + +============================== +Problem Weight +============================== + +**Note** Studio stores scores for all problems, but scores only count +toward a student’s final grade if they are in a subsection that is +graded. + +This setting specifies the maximum number of points possible for the +problem. The problem weight appears next to the problem title. + +.. image:: Images/ProblemWeight_DD.gif + +By default, each response field, or “answer space,” in a Problem +component is worth one point. Any Problem component can have multiple +response fields. For example, the Problem component above +contains one dropdown problem that has three separate questions for students +to answer, and thus has three response fields. + +The following Problem component contains one text input problem, +and has just one response field. + +.. image:: Images/ProblemWeight_TI.gif + +Computing Scores +~~~~~~~~~~~~~~~~ + +The score that a student earns for a problem is the result of the +following formula: + +**Score = Weight × (Correct answers / Response fields)** + +- **Score** is the point score that the student receives. +- **Weight** is the problem’s maximum possible point score. +- **Correct answers** is the number of response fields that contain + correct answers. +- **Response fields** is the total number of response fields in the + problem. + +**Examples** + +The following are some examples of computing scores. + +*Example 1* + +A problem’s **Weight** setting is left blank. The problem has two +response fields. Because the problem has two response fields, the +maximum score is 2.0 points. + +If one response field contains a correct answer and the other response +field contains an incorrect answer, the student’s score is 1.0 out of 2 +points. + +*Example 2* + +A problem’s weight is set to 12. The problem has three response fields. + +If a student’s response includes two correct answers and one incorrect +answer, the student’s score is 8.0 out of 12 points. + +*Example 3* + +A problem’s weight is set to 2. The problem has four response fields. + +If a student’s response contains one correct answer and three incorrect +answers, the student’s score is 0.5 out of 2 points. + +=============== +Randomization +=============== + +This setting only applies to problems that have randomly generated +numeric values. It specifies whether random variable inputs are +randomized when a student loads the problem. + +=============== +Show Answer +=============== + +This setting defines when the problem shows the answer to the student. +This setting has seven options. + ++-------------------+--------------------------------------+ +| **Always** | Always show the answer when the | +| | student clicks the **Show Answer** | +| | button. | ++-------------------+--------------------------------------+ +| **Answered** | Show the answer after the student | +| | has submitted her final answer. | ++-------------------+--------------------------------------+ +| **Attempted** | Show the answer after the student | +| | has tried to answer the problem one | +| | time, whether or not the student | +| | answered the problem correctly. | ++-------------------+--------------------------------------+ +| **Closed** | Show the answer after the student | +| | has used up all his attempts to | +| | answer the problem or the due date | +| | has passed. | ++-------------------+--------------------------------------+ +| **Finished** | Show the answer after the student | +| | has answered the problem correctly, | +| | the student has no attempts left, or | +| | the problem due date has passed. | ++-------------------+--------------------------------------+ +| **Past Due** | Show the answer after the due date | +| | for the problem has passed. | ++-------------------+--------------------------------------+ +| **Never** | Never show the answer. In this case, | +| | the **Show Answer** button does not | +| | appear next to the problem in Studio | +| | or in the LMS. | ++-------------------+--------------------------------------+ + +=============== +Problem Types +=============== + +Studio includes templates for many different types of problems, from +simple multiple choice problems to advanced problems that require the +student to “build” a virtual circuit. Details about each problem type, +including information about how to create the problem, appears in the +page for the problem type. + +- :ref:`Common Problems` appear on the **Common Problem Types** tab when you + create a new Problem component in Studio. You create these problems + using the Simple Editor. +- :ref:`Advanced Problems` appear on the **Advanced** tab when you create a + new Problem component. You create these problems using the Advanced + Editor. +- :ref:`Specialized Problems` are advanced problems that aren’t available by + default. To add these problems, you first have to modify the advanced + settings in your course. The Advanced component then appears under + **Add New Component** in each unit, and these problems are available + in the Advanced component. +- :ref:`Open Response Assessment Problems` are a new kind of problem that allow you, the + students in your course, or a computer algorithm to grade responses in the form + of essays, files such as computer code, and images. + +************************************ +Multiple Problems in One Component +************************************ + +You may want to create a problem that has more than one response type. +For example, you may want to create a numerical input problem, and then +include a multiple choice question about the numerical input problem. +Or, you may want a student to be able to check the answers to +many problems at one time. To do this, you can include multiple problems +inside a single Problem component. The problems can be different types. + +To create multiple problems in one component, create a new Blank +Advanced Problem component, and then paste the XML for each problem in +the component editor. You only need to include the XML for the problem +and its answers. You don’t have to include the code for other elements, +such as the **Check** button. + +Elements such as the **Check**, **Show Answer**, and **Reset** buttons, +as well as the settings that you select for the Problem component, apply +to all of the problems in that component. Thus, if you set the maximum +number of attempts to 3, the student has three attempts to answer +the entire set of problems in the component as a whole rather than three +attempts to answer each problem individually. If a student clicks +**Check**, the LMS scores all of the problems in the component at once. +If a student clicks **Show Answer**, the answers for all the problems in +the component appear. + +************************************ +Modifying a Released Problem +************************************ + +**WARNING: Be careful when you modify problems after they have been +released!** + +After a student submits a response to a problem, Studio stores the +student’s response, the score that the student received, and the maximum +score for the problem. Studio updates these values when a student +submits a new response to a problem. However, if an instructor changes a +problem or its attributes, Studio does not automatically update existing +student information for that problem. + +For example, you may release a problem and specify that its answer is 3. +After some students have submitted responses, you notice that the answer +should be 2 instead of 3. When you update the problem with the correct +answer, Studio doesn’t update scores for students who answered 2 for the +original problem and thus received the wrong score. + +For another example, you may change the number of response fields to +three. Students who submitted answers before the change have a score of +0, 1, or 2 out of 2.0 for that problem. Students who submitted answers +after the change have scores of 0, 1, 2, or 3 out of 3.0 for the same +problem. + +If you change the weight of the problem, however, the existing scores +update when you refresh the **Progress** page. + +=============== +Workarounds +=============== + +If you have to modify a released problem in a way that affects grading, +you have two options. Note that both options require you to ask your +students to go back and resubmit a problem. + +- In the Problem component, increase the number of attempts for the + problem. Then ask all your students to redo the problem. +- Delete the entire Problem component in Studio and create a new + Problem component with the content and settings that you want. Then + ask all your students to complete the new problem. diff --git a/docs/course_authors/source/create_section_sub_section.rst b/docs/course_authors/source/create_section_sub_section.rst deleted file mode 100644 index ebd509d394..0000000000 --- a/docs/course_authors/source/create_section_sub_section.rst +++ /dev/null @@ -1,67 +0,0 @@ - -******************************* -Create a Section and Subsection -******************************* - - -1. Sign in to Studio, and then click the course that you want. - - -2. On the **Course Outline** page, click **New Section.** - - -.. image:: Images/image039.png - :width: 800 - - - -3. In the **New Section** Name box, type a section name, and then click -**Save**. - -.. note:: - - In most courses, the name of the first section is Week 1. - The section that you have created appears on the **Course Outline** page. - -.. image:: Images/image041.png - :width: 800 - - -The name you enter also appears in the navigation ribbon, as follows. - - -.. image:: Images/image043.png - :width: 800 - - -4. To create a new lesson or assessment in your section, click **New -Subsection.** - - -5. In the **New Subsection** box, enter the name for this subsection, and then -click **Save.** - -For example, if you enter **Week 1** as the section title and **Subsection 1** -as the subsection title, you see the following. - - -.. image:: Images/image045.png - :width: 800 - - -If you view your course as a student would see it, you see the following. - - -.. image:: Images/image047.png - :width: 800 - - -6. Click the new subsection that you just created. In this example, you would -click **Subsection 1.** You see the following screen. - - -.. image:: Images/image049.png - :width: 800 - - - diff --git a/docs/course_authors/source/create_seed_wiki b/docs/course_authors/source/create_seed_wiki deleted file mode 100644 index 3eb688f505..0000000000 --- a/docs/course_authors/source/create_seed_wiki +++ /dev/null @@ -1,7 +0,0 @@ - -************************ -Create and Seed the Wiki -************************ - -Create wiki ("seed" the wiki) - \ No newline at end of file diff --git a/docs/course_authors/source/create_seed_wiki.rst b/docs/course_authors/source/create_seed_wiki.rst deleted file mode 100644 index c6c66c923e..0000000000 --- a/docs/course_authors/source/create_seed_wiki.rst +++ /dev/null @@ -1,7 +0,0 @@ - -************************ -Create and Seed the Wiki -************************ - -Create wiki ("seed" the wiki) - diff --git a/docs/course_authors/source/create_unit.rst b/docs/course_authors/source/create_unit.rst deleted file mode 100644 index 5136b935e3..0000000000 --- a/docs/course_authors/source/create_unit.rst +++ /dev/null @@ -1,25 +0,0 @@ - -************* -Create a Unit -************* - - 1. On the **Course Outline** page, click to open the subsection where you want to create the unit. - - 2. Click **New Unit.** The following screen appears. - - .. image:: Images/image051.png - :width: 800 - - - 3. In the **Display Name** box, type the name of the unit. This name appears in the course ribbon at - the top of the screen on Edge. - - Each unit has one or more components. - - -To create a discussion space where you or your students can post questions or participate in a discussion, click **Discussion.** - - -To create a component where you can add text, images, or other content, click **html.** - - -To create a problem for your students to solve, click **Problem.** - - -To add a video, click **Video.** diff --git a/docs/course_authors/source/create_video.rst b/docs/course_authors/source/create_video.rst index 3423f93d8a..d043c552fc 100644 --- a/docs/course_authors/source/create_video.rst +++ b/docs/course_authors/source/create_video.rst @@ -1,60 +1,110 @@ +.. _Working with Video Components: -************** -Create a Video -************** +############################# +Working with Video Components +############################# -Many instructors use videos to take the place of in-class lectures. You can create a video of your lecture, and interweave other components—such as discussions and problems—to promote active learning. -To add a video to the unit, you must upload your video to YouTube, and then create a video component. You can also add a transcript to your video. +******************* +Overview +******************* +You can create a video of your lecture, and add it to your course with other components—such as discussions and problems—to promote active learning. + +You can also associate a timed transcript with your video, which students can read and download. + +When you add a video to your course, you first post the video online, and then create a link to that video in the body of your course. + +* :ref:`Video Formats` +* :ref:`Video Hosting` +* :ref:`Create a Video Component` + + + +.. _Video Formats: + +******************* +Video Formats +******************* + +The edX video player supports videos in .mp4, .ogg, and .mpeg format. + + +.. _Video Hosting: + +******************* +Video Hosting +******************* + +All course videos should be posted to YouTube. +By default, the edX video player accesses your YouTube videos. +However, because YouTube is not available in all locations, we recommend that you also post copies of your videos on a third-party site such as Amazon S3. +When a student views a video in your course, if YouTube is not available in that student's location or if the YouTube video doesn't play, the video on the backup site starts playing automatically. +The student can also click a link to download the video from the backup site. + +You can use any video backup site that you want. Keep in mind, however, that the site where you post the videos may have to handle a lot of traffic. + + +.. _Create a Video Component: + +************************* +Create a Video Component +************************* + +To add a video to the unit, you must obtain the YouTube ID for the video, obtain the URL for the backup video, and then create a video component. + +To determine the YouTube ID for a video, locate the video on YouTube and make a note of the code that appears between **watch?v =** and **&feature** in the URL. +This code appears circled below. + +.. note:: If **&feature** does not appear in the URL, just use the code that follows **watch?v=** in the URL. + +.. image:: Images/VideoComponent_YouTubeCode.png + You can include videos that run at 0.75 speed, 1.25 speed, and 1.50 speed as well as at normal speed. To do this, you must upload each of these videos to YouTube separately. -.. note:: - - YouTube only hosts videos of up to 15 minutes. If you encode a 0.75 speed option, you must make +.. note:: YouTube only hosts videos of up to 15 minutes. If you encode a 0.75 speed option, you must make sure that source video segments are only 11.25 minutes long so that YouTube can host all speeds. YouTube offers paid accounts that relax this restriction. +After you have uploaded the video to YouTube: -1. Upload the video that you want to YouTube. Make note of the code that appears between **watch?v** -= and **&feature** in the URL. This code appears in the green box below. +#. Under **Add New Component**, click the **video** icon. -.. image:: Images/image053.png - :width: 800 px + .. image:: Images/NewComponent_Discussion.png + + The Video component is added: -2. In Studio, go to the unit that you want. + .. image:: Images/VideoComponent_Default.png -3. Under **Add New Component,** click **Video.** -4. In the screen that appears, click **default.** +2. When the new video component appears, click **edit**.** The video editor opens and displays the Basic settings. -5. When the new video component appears, click **edit**.** A video component opens, and a sample video -begins playing automatically. + .. image:: Images/video-edit.png + +3. In the **Display Name** field, enter the name you want students to see when they hover the mouse over the icon unit icon in the course accordian. This text also appears as a header for the video. -6. In the **display_name** box, type the text that you want the student to see when the student hovers -the mouse over the icon in the bar at the top of the page. This text also appears as a headerfor the video. +#. Enter the URL of the YouTube video. -7. Change the codes in the green boxes to the YouTube codes that you noted in step 1. The first -code (immediately to the right of "0.75:") corresponds to the video at 0.75 speed, the next -corresponds to 1.0 speed, etc. + When you enter a video URL, Studio checks to see if a timed transcript for that video exists on edX. + If the transcript exists, Studio automatically associates the transcript with the video. -.. image:: Images/image055.png - :width: 800 + If your video is on YouTube, you can import a timed transcript from YouTube. This YouTube transcript overwrites the edX version of the transcript. + +#. If no transcript exists, click **Upload New Timed Transcript** to upload a transcript file from your computer. -8. Click **Save.** +#. If you want to modify the transcript, click **Download to Edit**. You can then make your changes and upload the new file. -.. note:: +#. To specify additional sources for the video, click **Add more video sources**, and enter the URL and file type for the video. - All videos embedded using the edX player begin playing automatically. - There is currently no way to turn off the autoplay feature. +#. Optionally, click **Advanced** to set the following for the video: + + * **Download Transcript**: the external URL for non-YouTube video transcripts. + * **Download Video**: the external URL to download the video. + * **Start Time** and **End Time** for the video + * **Video Sources**: URLs and filenames for other sources of the video. + * **Youtube ID**: IDs for different speed videos on YouTube. + +#. Click **Save.** -**To add a transcript for your video:** - -1. Save your srt.sjson file as **subs_YOUTUBEID.srt.sjson,** where **YOUTUBEID** is the YouTube ID of your video. - -2. Upload the **subs_YOUTUBEID.srt.sjson** file to the **Files & Uploads** page. - -3. Create a link to this file by following the steps in the Add Items to the Handouts Sidebar -section. diff --git a/docs/course_authors/source/create_welcome_announcement.rst b/docs/course_authors/source/create_welcome_announcement.rst deleted file mode 100644 index 4bf5bbd7ba..0000000000 --- a/docs/course_authors/source/create_welcome_announcement.rst +++ /dev/null @@ -1,14 +0,0 @@ - -**************************************** -Create a Welcome Announcement and E-Mail -**************************************** - - -Send e-mail (welcome and weekly) (surveys?) (TBD) - -Create welcome announcement - -Create landing page announcement (change "landing page" to "Course Info" -page) - -Create discussion forum diff --git a/docs/course_authors/source/establish_course_settings.rst b/docs/course_authors/source/establish_course_settings.rst deleted file mode 100644 index ce63aa9e4e..0000000000 --- a/docs/course_authors/source/establish_course_settings.rst +++ /dev/null @@ -1,232 +0,0 @@ -************************* -Establish Course Settings -************************* - -Add Collaborators -***************** - - - Studio has support for rudimentary collaborative editing of a course. Users must have registered at studio.edge.edx.org, and must have activated their account via the mail link. If a user is not found, you will be notified. - - - Before you add a new user, consider the following. - - - · Invited users have full permissions to edit your course, including deleting content created by anyone else. - - - · Invited users cannot currently grant new permissions on the course. - - - · Editing conflicts are currently not managed. Thus, the state of the course might change between refreshes of the page. - - - To give another user permission to edit your course: - - - 1. On the navigation bar, click **Course Settings**, and then click **Course Team**. - - - .. image:: Images/image115.png - - - - 2. Click **New User**. - - - .. image:: Images/image117.png - - - 3. In the **email** box, type the mail address of the user, and then click **Add User**. - - -.. raw:: latex - - \newpage % - - - -Add Manual Policy Data -********************** - - - - You can add manual policy data on the **Advanced Settings** page. These advanced configuration options are specified using JSON key and value - pairs. - - - You should only add manual policy data if you are very familiar with valid configuration key value pairs and the ways these pairs will affect your course. - Errors on this page can cause significant problems with your course. - - - The edX program managers can help you learn about how to apply these settings. - - - 1. On the navigation bar, click **Course Settings**, and then click **Advanced Settings**. - - - 2. Click **New Manual Policy** . - - - .. image:: Images/image119.png - - - 3. In the **Policy Key** box, enter the policy key. - - - 4. In the **Policy Value** box, enter the value of the policy. - - -.. raw:: latex - - \newpage % - - -Add About Page Information -*************************** - - - To add scheduling information, a description, and other information for your course, use the **Course Settings** menu. - - - .. image:: Images/image121.png - - - This takes you to the - -Schedule and Details Page -========================= - - -1. At the top of this page, you will find a section with the **Basic Information** for your course. It is here that you can locate the title of your course and find the URL for your course, which you can mail to students to invite students to enroll in your course. - - .. image:: Images/image281.png - - -2. In the **Course Schedule** section, enter the date you want your course to start in the **Course Start Date** box, and then enter the time you want your course to start in the **Course** **Start Time** box. - - -.. note:: - - The Course Start Time on this screen will reflect the current time zone in your browser, depending on your geography. Course start times for students will show as UTC on Edge. - - -3. In the **Course Schedule** section, enter the date you want your course to end in the **Course** **End Date** - box, and then enter the time you want your course to end in the **Course** **End Time** box. - - -Add Enrollment Information -========================== - - -1. On the navigation bar, click **Course **Settings, and then click **Schedule & Details** . - - -2. In the **Course Schedule** section, enter the date you want enrollment for your course to start in the **Enrollment Start Date** box, and then enter the time you want enrollment for your course to start in the **Enrollment Start Time** box. - - -3. In the **Course Schedule** section, enter the date you want enrollment for your course to end in the **Enrollment End Date** -box, and then enter the time you want enrollment for your course to end in the **Enrollment End Time** box. - - -.. note:: - - The Enrollment dates on this screen will reflect the current time zone in your browser, depending on your geography. Enrollment times for students will show as UTC on Edge. - - - -Add a Course Overview -===================== - - -1. On the navigation bar, click **Course Settings**, and then click **Schedule & Details** . - - -2. Scroll down to the **Introducing Your Course** section, and then locate the **Course Overview** box. - -.. image:: Images/image123.png - - - - -3. In the **Course Overview** box, enter a description of your course. - - -The content for this box must be formated in HTML. For a template that you -can use that includes placeholders, see :doc:`appendices/a`. - - - -If your course has prerequisites, you can include that information in the course overview. - - -.. note:: - - There is no save button. Studio automatically saves your changes. - - -The following is example content for the **Course Overview** box: - - -.. image:: Images/image125.png - -Add a Descriptive Picture -========================= - -1. Select a high-resolution image that is a minimum of 660 pixels in width by 240 pixels in height. - -2. Change the file name of the picture that you want to use to **images_course_image.jpg**. - -3. Upload the file to the **Files & Uploads** page. - - -The picture that is named **images_course_image.jpg** automatically appears on the course About page. - -Add an About Video -================== - - -You can create an About video that will appear on the **About** page for your course. - - -1. Upload the video that you want to YouTube. Make note of the code that appears between ** watch?v =** and ** &feature** in the URL. This code appears in the green box below. - - -.. image:: Images/image127.png - - -2. On the navigation bar, click **Course Settings**, and then click **Schedule & Details** . - - -3. Scroll down to the **Introducing Your Course** section, and then locate the **Course** **Introduction Video** - field. If you have not already added a video, you see a blank field above an **id** box. - - -.. image:: Images/image129.png - - -4. In the **your YouTube video's ID** box, enter your video code. When you add the code, the video automatically appears in the field above the **your YouTube video's ID** box. - - -.. note:: - - There is no save button. Studio automatically saves your changes. - - -For example, your course introduction video appears as follows. - - -.. image:: Images/image131.png - - -Add Weekly Time Requirements Information -======================================== - - -1. On the navigation bar, click **Course Settings**, and then click **Schedule & Details** . - - -2. Scroll down to the **Requirments** section. - - -3. In the **Hours of Effort per Week** box, enter the number of hours you expect students to work on this course each week. diff --git a/docs/course_authors/source/establish_grading_policy.rst b/docs/course_authors/source/establish_grading_policy.rst index 9e6c5f6fe8..d47fb9be6d 100644 --- a/docs/course_authors/source/establish_grading_policy.rst +++ b/docs/course_authors/source/establish_grading_policy.rst @@ -1,216 +1,165 @@ -*************************** -Establish a Grading Policy -*************************** - +.. _Establish a Grading Policy: -Overview -******** - - -Grades in edX courses are based on homework assignments and exams. - - -Setting up grading in edX Studio has several steps. These steps will be explained in more detail later in the course. To skip to the detailed information, click the links below. - +############################## +Establishing a Grading Policy +############################## -1. Establish an overall grading policy, also see :ref:`Set Grade Brackets`. - -.. image:: Images/image139.png +******************* +Overview +******************* + +Establishing a grading policy takes several steps. You must: + +#. :ref:`grade` +#. :ref:`Set the Grace Period` +#. :ref:`configure` +#. :ref:`set_assignment` +#. :ref:`student_view` + + +.. _grade: + +******************* +Set the Grade Range +******************* + +You must set the grade range for the course. For example, your course can be pass/fail, or can have letter grades A through F. + +To set the grade range, from the **Settings** menu, select **Grading**. + +The control for the grade range is at the top of the Grading page. + +.. image:: Images/grade_range.png + :width: 800 + +The above example shows that you have a pass/fail grade range, with a score of 50 as the cutoff. This is the default setting used when you create a course. + +You use the grade range control to change these settings: + +* To add a grade in the range, click the **+** icon. + + A new grade is added to the range between the existing grades. For example, if you add a grade in the default setting, + the grade range changes to **F** (0 to 50), **B** (50 to 75), and **A** (75 to 100): + + .. image:: Images/grade_range_b.png + :width: 800 + +* To change the score range, hover the mouse over the line dividing two grades, click and drag the line left or right. + + You can see the range numbers of the two grades adjacent to the line change. Release the mouse button when the line is where you want it. -This is done at the course level in the **Course Settings** menu. +* To remove a grade, hover the mouse button over the grade. + + A **remove** link appears above the grade. Click the link. - -Establish whether your course is pass-fail or graded by letter, and what the thresholds are for each grade. - - -Create assignment types for the course and determine the weight of the student's total grade for each assignment type. For example, you may have 10 homework assignments, worth a total of 50% of the grade; three exams, worth a total of 10% of the grade; and one final exam, worth 20% of the grade. By default, Studio includes four assignment types when you create the course: homework, lab, midterm exam, and final exam. You can also create additional assignment types, such as quizzes. + You cannot remove F or A. + +After you make any changes to the grade range, you must click **Save Changes** at the bottom of the page. + + +.. _Set the Grace Period: + +************************* +Set the Grace Period +************************* - -2. Create subsections that contain graded assignments in the body of the course, see :ref:`Create Subsections that Contain Graded Assignments`. - +You can set a grace period that extends homework due dates for your students. -.. image:: Images/image135.png +.. note:: The grace period applies to the whole course; you cannot set a grace period for individual assignments. + +In the Grading page, under **Grading Rules & Policies**, enter a value in the **Grace Period on Deadline** field. Enter the value in Hours:Minutes format. - -Each subsection in your course can be designated as one of the assignment types that you have specified in the grading policy. You can also specify a release date and a due date. - - -.. note:: - - You can create problems in Studio without specifying that the subsection is an assignment type. However, problems do not count toward a student's grade unless you set the subsection as a graded assignment type. +.. _configure: -For more information on creating problems, see `Create a Problem `_ . +****************************** +Configure the Assignment Types +****************************** + +You must create assignment types for your course and determine the weight of the student's total grade for each assignment type. + +For example, you may have: + +* 10 homework assignments, worth a total of 50% of the grade; +* A midterm exam, worth a total of 20% of the grade; +* A final exam, worth 30% of the grade. + +By default, a new course you create has four assignment types: + +* Homework +* Lab +* Midterm Exam +* Final Exam + +You can use these assignment types, modify or remove them, and create new assignment types. + +To create a new assignment type, in the bottom of the Grading page, click **New Assignment Type**, then configure the fields described below. + +========================== +Assignment Type Fields +========================== +You configure the following fields for each assignment type: + +* **Assignment Type Name:** + + The general category of the assignment. This name will be visible to students. -3. In the assignment subsections, create individual problems - -.. image:: Images/image137.png + .. note:: All assignments of a particular type are automatically worth the same amount. Thus, a homework assignment that contains 10 problems is worth the same percentage of a student's grade as a homework assignment that contains 20 problems. -You can then establish the settings for these problems (including the number of attempts a student has and the problem's point value, or weight). +* **Abbreviation:** + + This is the short name that appears next to an assignment on a student's **Progress** tab. + +* **Weight of Total Grade:** + + The assignments of this type together account for the percent value set in **Weight of Total Grade**. + + The total weight of all assignment types must equal 100. + + .. note:: Do not include the percent sign (%) in this field. + + + +* **Total Number:** + + The number of assignments of this type that you plan to include in your course. + + + +* **Number of Droppable** + + The number of assignments of this type that the grader will drop. The grader will drop the lowest-scored assignments first. + + +.. _set_assignment: + +********************************************** +Set the Assignment Type for Graded Subsections +********************************************** +After you configure assignment types, as you are organizing your course, +you set the assignment type for Subsections that contain problems that are to be graded. + +You can designate a Subsection as one, and only one, of the assignment types you configured. You can also set a due date. + +See :ref:`subsections` for instructions on configuring a Subsection. + +Within a graded Subsection, you create problems of the type designated for that Subsection. +You should not mix problems of different assignment types in the same Subsection. + +For example, if you want to create a homework assignment and a lab for a specific topic, create two Subsections. +Set one Subsection as the Homework assignment type and the other as the Lab assignment type. +Both Subsections can contain other content as well as the actual homework or lab problems. + +.. note:: You can create problems in Studio without specifying that the Subsection is an assignment type. However, such problems will not count toward a student's grade. + +See :ref:`Working with Problem Components` for instructions on creating problems. + +.. _student_view: + +************************** +The Student View of Grades +************************** Once a grading policy is in place, students can view both their problem scores and the percent completed and current grade at the top of their **Progress** tab for the course. -Additionally, as an instructor, you can access your students' scores on graded content. On the live published page of your course on Edge (not from the Preview page in Studio), click the **Instructor** tab. Many options appear for viewing or downloading a snapshot of the currently stored student grades. On the **Instructor** tab you can also request a link to a view of the student's individual progress page, including both graded and not graded scores. For more information, see Progress and Certificates. - - -.. _Set-Grade-Brackets: - -Set Grade Brackets -++++++++++++++++++ - -To set the thresholds for course grades: - -1. On the navigation bar, click **Course Settings**, and then click **Grading**. - -2. Under **Overall Grade Range**, click and drag the dividing line between grade divisions to move each threshold up or down. - -.. note:: - - The default grade divisions are Pass and Fail. To add more grade divisions (such as A, B, C, or D), click the plus sign (+). - - -.. image:: Images/image133.png - -To remove a grade division, hover the mouse over the grade division (shown above) and then click the **Remove** link that appears above the grade division. - -.. _Set-Grace-Period: - -Set a Grace Period -++++++++++++++++++ - -You can set a grace period that extends homework due dates for your students. Note that this setting applies to the whole course; you cannot set a grace period for individual assignments. - - -1. On the navigation bar, click **Course Settings**, and then click **Grading**. - - -2. Under **Grading Rules & Policies** enter a value in the **Grace Period on Deadline** box. - - -Create Assignment Types -+++++++++++++++++++++++ - - -By default, Studio includes four assignment types for your course when you create the course: homework, lab, midterm exam, and final exam. You decide the weight of the student's total grade for each assignment type. - - -To set an assignment type: - - -1. On the navigation bar, click **Course Settings**, and then click **Grading**. - - -2. Under **Assignment Types**, locate the settings for the assignment type that you want. - - -If you want to create a new assignment type, scroll to the bottom of the page, and then click **New Assignment Type**. - - -3. Enter values in each of the following boxes. - - -**Assignment Type Name:** -This is a general category of assessment (homework, exam, exercise). All assignments within an assignment type are given equal weight. This name will be visible to students. - - -**Abbreviation:** -This is the short name that will appear next to an assignment on every student's **Progress** tab (see below). - -.. image:: Images/image141.png - - -**Weight of Total Grade:** -The assignments of a particular type together account for the percent value set in **Weight of Total Grade**. - - -**Total Number:** -The number of assignments of that type that you plan to present in your course. - - -**Number of Droppable** -(optional): Specify the number of assignments that the grader will drop. The grader will omit the lowest-scored assignments first. - - -For example, the following course has two types of assignments. The overall course grade is broken down as 40% Homework and 60% Final Exam. There are eight Homework assignments, and the grader will omit the lowest-scored assignment from the final grade. Thus, the seven remaining Homework assignments are each worth 40 7 = 5.8% of the final grade. - -.. image:: Images/image143.png - -Troubleshooting -+++++++++++++++ - -If you have problems creating assignment types, try the following. - -In the **Weight of Total Grade** field, omit the % sign. Be sure that your **Weight of Total Grade** fields add up to 100. - -.. _Create-Graded-Subsections: - - -.. raw:: latex - - \newpage % - -Create Subsections Containing Graded Assignments -************************************************** - -After you establish your grading rubric, you can create a graded assignment or a test for your students. To do this, you must first create a subsections and then set up grading for the subsection. This includes setting the assignment type, the assignment release date, and the due date. - - -.. note:: - - When you set a due date, keep in mind that students will be in different time zones across the world. By default, the time zone appears as UTC-not the student's local time. If you tell your students an assignment is due at 5:00 PM, make sure to specify that the time is 5:00 PM UTC and point them to a time converter. - - -Alternatively, you can :ref:`set a grace period` for your assignments to cover any misunderstandings about time. For example, some classes have set a grace period of 1 day, 6 hours, and 1 minute. This grace period applies to the entire course. - -Keep in mind that a subsection can only have one assignment type. If you want to create a homework assignment and a lab for a specific topic, you would create two subsections for that topic. You would set one subsection as the Homework assignment type and the other as the Lab assignment type. Both subsections can contain other content as well as the actual homework or lab problems. - - -All assignments of a particular type are automatically worth the same amount. Thus, a homework assignment that contains 10 problems is worth the same percentage of a student's grade as a homework assignment that contains 20 problems. If you want the assignment with 20 problems to be worth twice as much as the assignment with 10 problems, you can create two assignments. - - -1. On the navigation bar, click **Course Content**, and then click **Outline**. - - -.. image:: Images/image145.png - - -2. Under **Course Outline**, locate the section where you want to add an assignment. - -3. Under the name of the section, click **New Subsection**. - -4. In the text box, replace **New Subsection** with the name of your subsection, and then click **Save**. - -Click the subsection you want. The edit page for the subsection opens. In the top right corner of the page, locate the **Subsection Settings** box. - - -.. image:: Images/image147.png - -Set the assignment type. To do this, locate the blue link next to **Graded as**. Because all subsections are set to **Not Graded** by default, the text for this link is **NOT GRADED**. - -.. image:: Images/image149.png - -Click this link to open a list of the assignment types that you specified in your grading rubric, and then click the assignment type that you want. - - -.. image:: Images/image151.png - -Set the assignment's release date and time. To set the date, click inside the **Release date** field, and then select the date that you want in the calendar that appears. To set the release time, click inside the time input field, and then specify the time you want. - -Set a due date for the assignment. To do this, click the blue **SET A DUE DATE** link, and click inside the **Due date** box, and then select the date you want in the calendar that appears. To set the time, click inside the time input field, and then specify the time you want. - -Change a Subsection's Assignment Type -+++++++++++++++++++++++++++++++++++++ - -To set the assignment type for a subsection: - -1. On the navigation bar, click **Course Content**, and then click **Course Outline**. - -2. Under **Course Outline**, locate the subsection that you want. - -3. On the right side of the screen, click the blue check mark for the subsection, and then select the assignment type. - -.. image:: Images/image153.png - -.. note:: - - If you change an assignment type name in the Grading page, make sure the assignment type names on the Course Outline still match. +ADD IMAGE \ No newline at end of file diff --git a/docs/course_authors/source/export_import_course.rst b/docs/course_authors/source/export_import_course.rst index db45b4a225..9fc5c3c6f3 100644 --- a/docs/course_authors/source/export_import_course.rst +++ b/docs/course_authors/source/export_import_course.rst @@ -1,116 +1,86 @@ - -************************* -Export or Import a Course -************************* - -Studio has an Import tool and an Export tool that allow you to import and -export courses. +.. _Exporting and Importing a Course: - +##################################### +Exporting and Importing a Course +##################################### + +You can :ref:`Export a Course` and :ref:`Import a Course` through Studio. + +.. _Export a Course: + +*************** Export a Course *************** - -You can export a course that has been created in Studio. You can export a -course for use by another instructor, or you can back up your course. - - -For example, you may create a course in Studio, and then run that course. A -friend or colleague, including a friend from another institution, may be -interested in running their own customized version of that course. You can -export the course that you have created and give it to the other instructor. -That instructor can then import the course, make any changes that are -necessary to reflect that instructor's situation, and then release the -course to students. - - -Or, you may export your course, and then make changes to your course in -Studio. If you later want to revert to the earlier version of your course, -you can import the version that you exported. Be careful if you do this -while you are running your course, as you could lose your students' work. +There are several reasons you may want to export your course: + +* To edit the XML in your course directly +* To create a backup copy of your course, which you can import if you want to revert the course back to a previous state +* To create a copy of your course that you can later import into another course instance and customize +* To share with another instructor for another class When you export your course, Studio creates a **.tar.gz** file that includes the following course data: - -1. Course structure (the order of sections and subsections) - - -2. Individual units - - -3. Individual problems - - -4. Additional pages - - -5. Files on the Files & Uploads page +* Course content (all Sections, Subsections, and Units) +* Course structure +* Individual problems +* Static pages +* Course assets +* Course settings +The following data is not exported with your course: -The exported file does not include the following data: +* User data +* Course team data +* Forum/discussion data +* Certificates + +To export a course: - -1. Student or user data - - -2. Discussion forum data - - -3. Course settings - - -4. Certificates - - -5. Grading information +#. From the **Tools** menu, select **Export**. +#. Click **Export Course Content**. + +When the export completes you can then access the .tar.gz file on your computer. -.. raw:: latex - - \newpage % - +.. _Import a Course: +*************** Import a Course *************** - - .. warning:: - This feature should be used with caution! - Importing a new course will delete all course content currently associated - with your course and replace it with the contents of the uploaded file. - Importing a course cannot be undone. - - -You can import courses that have already been created in Studio. These can -be courses that you or someone else has created and exported. - - -The file that you import must be a **.tar.gz** file that contains, at a -minimum, a Course.xml file in a course data directory. The tar.gz file must -have the same name as the course data directory. + Content of the imported course replaces all the content of this course. + **You cannot undo a course import**. We recommend that you first export the current course, + so you have a backup copy of it. +There are several reasons you may want to import a course: + +* To run a new version of an existing course +* To replace an existing course +* To load a course you developed outside of Studio + + +The course that you import must be in a .tar.gz file (that is, a .tar file compressed with GNU Zip). +This .tar.gz file must contain a course.xml file in a course data directory. The tar.gz file must +have the same name as the course data directory. It may also contain other files. If your course uses legacy layout structures, you may not be able to edit the course in Studio, although it will probably appear correctly on Edge. To make sure that your course is completely editable, ensure that all of your material is embedded in a unit. +The import process has five stages. During the first two stages, you must stay on the Course Import page. +You can leave this page after the Unpacking stage has completed. We recommend, however, +that you don't make important changes to your course until the import operation has completed. To import a course: - -1. On the navigation bar, click **Tools**, and then click **Import**. - - -.. image:: Images/image243.png - - -2. Under **Course to Import**, click **Choose File**. - - -3. Locate the file that you want, and then click **Open**. +#. From the **Tools** menu, select **Import**. +#. Click **Choose a File to Import**. +#. Locate the file that you want, and then click **Open**. +#. Click **Replace my course with the one above**. diff --git a/docs/course_authors/source/get_started.rst b/docs/course_authors/source/get_started.rst index b7d854abe9..138fafb545 100644 --- a/docs/course_authors/source/get_started.rst +++ b/docs/course_authors/source/get_started.rst @@ -1,178 +1,176 @@ .. image:: Images/image001.png + :width: 800 +.. _Getting Started with Studio: ########################### Getting Started with Studio ########################### - -************ -Introduction -************ +*************** +Overview +*************** -Since the launch of edX to our original partners, we have been working to provide opportunities for additional educators to create courses on our platform. The fruits of our efforts are Edge and Studio. These tools are available not only to our edX partners, but to all faculty at consortium universities. +This chapter describes the tools you use to build an edX course, and how to create your first course: -EdX (http://edx.org) is our original, premiere learning portal. Publication to -edX is available on a limited basis, depending on your university’s agreement -with edX. You need specific approval from your university to release your -course on the edX portal. Once a course is released on the edX portal, it -becomes a publicly available massively open online course (MOOC). +* :ref:`What is Studio?` +* :ref:`What is Edge?` +* :ref:`Get Started on Edge` +* :ref:`Use Studio on Edge` +* :ref:`Create Your First Course` +* :ref:`View Your Course on Edge` +* :ref:`Register Your Course on edX.org` + +If you are using an instance of Open edX, some specifics in this chapter may not apply. + +.. _What is Studio?: + +*************** +What is Studio? +*************** + +Studio is the edX tool you use to build your courses. + +You use Studio to create course content, problems, videos, and other resoruces for students. + +With Studio, you can also manage your schedule and course team, set grading policies, publish your course, and more. + +You use Studio directly through your browser. You do not need any additional software. -Edge (http://edge.edx.org) is our newest online learning portal. It is almost identical to edX.org both visibly and functionally. +.. _What is Edge?: -Edge is where you view the content you create with Studio, our course authoring -tool. Courses on Edge cannot be seen publicly; rather, only you, your -colleagues, and the students with whom you explicitly share a course link can -see your course. Instructors are encouraged to use Edge to experiment with -creating courses. You do not need approval to release a course on Edge--you can -create a course and release it immediately. +****************** +What is Edge? +****************** +EdX Edge_ is the site where you can create courses with Studio, then run courses through the edX Learning Management System. -Studio (http://studio.edge.edx.org) is our web-based course authoring tool. It is the easiest way for educators to develop courses for the edX platform. You can create courses in Studio and view and enroll in them instantly on Edge—even before you have finished creating the course. +Visually and functionally, edX Edge is the same as edX.org_. +However, on Edge you can freely publish courses. +There is no course catalog on Edge and other users will not find your course. You must explicitly invite students to participate in your course. +Courses on Edge are not published on edX.org. All course data and accounts on Edge and edX.org are separate. +To publish courses on edX.org, you must have an agreement with edX and specific approval from your university. -**There is a workflow to getting started.** Here is a quick summary: - - - -1. First, go to: https://studio.edge.edx.org. Sign up and create an account. - - -.. image:: Images/image009.png - :width: 800 - - -**then** - - -2. Create a course in Studio. - - -.. image:: Images/image021.png - :width: 800 - - -**then** - - -3. View your course on Edge. - - -.. image:: Images/image027.png - :width: 800 - -.. raw:: latex - - \newpage % - - -***************** -Create an Account -***************** - -To begin using Studio, create an account with a unique user ID and password. A Studio account isn't the same as an edX account. Even if you already have an edX account, you still need to create a separate Studio account. You can use the same e-mail address for both accounts. - -When you create your account on Studio, an account on Edge is automatically created using the same user name and password. You don't have to create separate accounts on Studio and Edge. - -Edge has two views - an Instructor view and a Student view. When you view your course on Edge, you view your course as an instructor, and you see the **Instructor** tab at the top of the page. - -.. image:: Images/image007.png - :width: 800 - - -Your students will view your courses in Student view, which is similar to Instructor view, but does not include the Instructor tab or release dates. - -To create an account: - -1. Go to http://studio.edge.edX.org. The Welcome to edX Studio page opens. - -.. image:: Images/image009.png - :width: 800 +.. _Edge: http://edge.edx.org +.. _edX.org: http://edx.org -2. Scroll to the bottom of the page and click **Sign Up & Start Making an edX Course.** +.. _Get Started on Edge: + +******************* +Get Started on Edge +******************* -.. image:: Images/image011.png - :width: 800 +Go to https://edge.edx.org, click **Register**, and fill out required information to create your account. - -3. In the page that opens, fill in the fields. Required fields are marked with an asterisk (*). +.. note:: Students will see your **Public Username**, not your **Full Name**. +.. note:: If you are at an edX consortium university, you should use your institutional e-mail + address. -.. image:: Images/image013.png - :width: 800 +After you click \ **Create My Account**, you will receive an activation +e-mail message. To finish creating your account, click the link in the e-mail. - -a. In the **Email Address** box, type your e-mail address. -b. In the **Password** box, type a unique password. -c. In the **Public Username** field, type the name you want students to see when you post on the user forum. Most websites call this the "user name". -d. In the **Full Name** box, type your full name. This name only appears in Studio. - Your students will not see this name. -e. Click to select I agree to the Terms of Service. +When you log in to Edge, you can view edX101_. -.. image:: Images/image017.png - :width: 800 +edX101 is both an example of a course you can build with Studio, +and a self-paced walk through of planning, building, and running your own online course. -4. Click **Create My Account & Start Authoring Courses,** After you click this button, the following page opens. +.. _edX101: https://edge.edx.org/courses/edX/edX101/How_to_Create_an_edX_Course/about -.. image:: Images/image015.png - :width: 800 +.. _Use Studio on Edge: -5. To finish creating your account, click the link that you receive in the activation e-mail. When you click this link, the following page opens. +****************** +Use Studio on Edge +****************** -.. image:: Images/image017.png - :width: 800 +You can use Studio_ on Edge to build your own courses. -.. raw:: latex +Go to: https://studio.edge.edx.org. Sign in with the account you created on Edge. + +You must then request access to create courses: + +#. Click the **+** sign to expland the field labeled **Becoming a Course Creator in Studio**. + +#. Click **Request the Ability to Create Courses**. + +EdX then evaluates your request. When course creation permissions are granted, you receive an email message. + +.. _Studio: https://studio.edge.edx.org - \newpage % +.. _Create Your First Course: + +*************************** +Create Your First Course +*************************** -******************* -Create a New Course -******************* +When you receive notice that you can create courses, log into Studio_. -The first time that you log in to Studio, the following page opens. +You see the following page: -.. image:: Images/image017.png - :width: 800 - -Click the **dashboard** link, and the **My Courses** page opens. +.. image:: Images/first_course.png + :width: 800 -.. image:: Images/image021.png - :width: 800 +#. Click **Create Your First Course**. +#. Enter course information as needed and click **Create**. -Once you have created a course in Studio, it will be listed on this page. From here, you can start creating courses immediately by clicking the **New Course** button. + .. image:: Images/new_course_info.png + :width: 800 + .. note:: Enter new course information carefully. This information becomes part of the URL for your course. To change the URL after the course is created, you must contact edX through the Help site (http://help.edge.edx.org). Additionally, because this information becomes part of your course URL, the total number of characters in the following three fields must be 65 or fewer. -To create a new course: + * For **Course Name**, enter the title of your course. For example, the name may be “Sets, Maps and Symmetry Groups". Use title capitalization for the course title. -1. Click **New Course.** A screen opens. + * For **Organization**, enter the name of your university. Do not include whitespace or special characters. + * For **Course Number**, enter both a subject abbreviation and a number. For example, for public health course number 207, enter **PH207**. For math course 101x, enter **Math101x**. Do not include whitespace or special characters in the course number. -.. note:: + *Note: If your course will be open to the world, be sure to include the "x". If it is exclusively an on-campus offering, do not include the "x".* - Enter your new course information carefully. This information becomes part of the URL for your course. To change the URL after the course is created, you must contact edX through the Help site (http://help.edge.edx.org).Additionally, because this information becomes part of your course URL, the total number of characters in the following three fields must be 65 or fewer. +3. Click **Save.** +You then see the empty Course Outline. -2. For **Course Name**, enter the title of your course. For example, the name may be “Sets, Maps and Symmetry Groups". Use title capitalization for the course title. +In your browser’s address bar, notice that the URL of your course includes the course organization, number, and course run. -3. For **Organization**, enter the name of your university. Do not include whitespace or special characters. - -4. For **Course Number**, enter both a subject abbreviation and a number. For example, for public health course number 207, enter "PH207". For math course 101x, enter “Math101x”. Do not include whitespace or special characters in the course number. - - *Note: If your course will be open to the world, be sure to include the "x". If it is exclusively anon-campus offering, do not include the "x".* - -5. Click **Save.** - -.. image:: Images/image025.png - :width: 800 +The rest of this documentation describes how you now build and run your course. But first, lets view your empty course on Edge. + +.. _View Your Course on Edge: -If you click **View Live** your course appears as follows on Edge. +************************ +View Your Course on Edge +************************ +You can now view the course you just created, even though it doesn't have any content. -.. image:: Images/image027.png +In the Course Outline in Studio, click **View Live**. The course opens on Edge. + +You can also go directly to Edge_. Log in if prompted. You see the course you just created listed: + +.. image:: Images/new_course.png :width: 800 -*Note: Although the start date is set to the current date by default, your course will not be advertised, so it will not be visible to the general public. You can change the start date of your course in Studio.* +You can view the course and see that there is no content yet. + +To build your course, keep reading this document. + +.. _Register Your Course on edx.org: + +************************************ +Register Your Course on edX.org +************************************ + +If you're creating your course on **edX**, you must register +for your course. + +#. On the **Course Outline** page, click the blue **View + Live** button in the upper-right corner of your screen. + + Your course registration page opens in a new tab on the LMS. + +#. Click the blue **Register** button to register for your course. +#. In your browser, switch back to the tab that shows Studio. You will + still be on the **Course Outline** page. diff --git a/docs/course_authors/source/index.rst b/docs/course_authors/source/index.rst index 1708770eec..efba027ddc 100755 --- a/docs/course_authors/source/index.rst +++ b/docs/course_authors/source/index.rst @@ -10,37 +10,32 @@ Contents .. toctree:: + :numbered: :maxdepth: 5 read_me get_started - create_lesson - create_section_sub_section - create_unit + create_new_course + establish_grading_policy + organizing_course + create_html_component create_video create_discussion - create_html_component + create_problem_component + common_problems + advanced_problems + javascript_input create_lti - create_problem + specialized_problems + open_response_assessment set_content_releasedates - establish_course_settings - establish_grading_policy - add_syllabus view_course_content - modify_published_content export_import_course - create_welcome_announcement - create_seed_wiki - invite_students_to_register checking_student_progress change_log - - - - Appendices ========== diff --git a/docs/course_authors/source/invite_students_to_register.rst b/docs/course_authors/source/invite_students_to_register.rst deleted file mode 100644 index 4efeee3cf8..0000000000 --- a/docs/course_authors/source/invite_students_to_register.rst +++ /dev/null @@ -1,29 +0,0 @@ - -*************************** -Invite Students to Register -*************************** - -To invite students to register for your course on Edge through the course -registration page, direct students to the registration page, and provide -instructions for completing the registration process. - - -1. Determine the link to your class registration page on Edge. To do this: - - -a. Click the **Settings **tab of your course in Studio, and then locate the -**Course Details** section. - - -b. Under **Basic Information**, you will see a link to email and invite -students to enroll in your course. - - -c. Click "**Invite Your Students**" link. Clicking the link creates an email -template. - - -.. image:: Images/image286.png - - -d. Email this to your chosen mail list. \ No newline at end of file diff --git a/docs/course_authors/source/javascript_input.rst b/docs/course_authors/source/javascript_input.rst new file mode 100644 index 0000000000..639e30a4d2 --- /dev/null +++ b/docs/course_authors/source/javascript_input.rst @@ -0,0 +1,113 @@ +.. _JavaScript Input: + +JavaScript Input +---------------- + +The JavaScript Input problem type allows you to create your own learning tool +using HTML and other standard Internet languages and then add the tool directly +into Studio. When you use this problem type, Studio embeds your tool in an +IFrame so that your students can interact with it in the LMS. You can grade +your students' work using JavaScript and some basic Python, and the grading +is integrated into the edX grading system. + +This problem type doesn't appear in the menu of advanced problems in Studio. To +create a JavaScript input problem type, you'll create a blank advanced problem, +and then enter your code into the component editor. + +.. image:: /Images/JavaScriptInputExample.gif + +Create a JavaScript Input Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#. Create your JavaScript application, and then upload all files associated with + that application to the **Files & Uploads** page. +#. In the unit where you want to create the problem, click **Problem** + under **Add New Component**, and then click the **Advanced** tab. +#. Click **Blank Advanced Problem**. +#. In the component that appears, click **Edit**. +#. Click the **Settings** tab. +#. Set **Maximum Attempts** to a number larger than zero. +#. In the component editor, enter your code. +#. Click **Save**. + +To re-create the example problem above, follow these steps. + +#. Go to :ref:`Appendix F` and create the following files: + + - webGLDemo.html + - webGLDemo.js + - webGLDemo.css + - three.min.js + +#. On the **Files & Uploads** page, upload the four files you just created. +#. Create a new blank advanced problem component. +#. On the **Settings** tab, set **Maximum Attempts** to a number larger than + zero. +#. In the problem component editor, paste the code below. +#. Click **Save.** + + + +JavaScript Input Problem Code +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + + In the image below, click the cone. + + + + + + + + +**Notes** + +- The webGLDemo.js file defines the three JavaScript functions (**WebGLDemo.getGrade**, + **WebGLDemo.getState**, and **WebGLDemo.setState**). + +- The JavaScript input problem code uses **WebGLDemo.getGrade**, **WebGLDemo.getState**, + and **WebGLDemo.setState** to grade, save, or restore a problem. These functions must + be global in scope. + +- **WebGLDemo.getState** and **WebGLDemo.setState** are optional. You only have to define + these functions if you want to conserve the state of the problem. + +- **Width** and **height** represent the dimensions of the IFrame that holds the + application. + +- When the problem opens, the cone and the cube are both blue, or "unselected." When + you click either shape once, the shape becomes yellow, or "selected." To unselect + the shape, click it again. Continue clicking the shape to select and unselect it. + +- The response is graded as correct if the cone is selected (yellow) when the user + clicks **Check**. + +- Clicking **Check** or **Save** registers the problem's current state. \ No newline at end of file diff --git a/docs/course_authors/source/modify_published_content.rst b/docs/course_authors/source/modify_published_content.rst deleted file mode 100644 index fe13490be7..0000000000 --- a/docs/course_authors/source/modify_published_content.rst +++ /dev/null @@ -1,62 +0,0 @@ -*************************** -Modifying Published Content -*************************** - -When you set a Unit to Public, that content appears on edX or Edge when you -view the content as an instructor. If the release date has passed, the -content is also visible to students. - - -If you want to modify content after it has been set to Public, you must -create a draft. The draft does not appear on edX or Edge. However, the draft -does appear when you view your content in Preview mode. - - -To create a draft, open the Unit that you want. Note that no **Edit** button -appears on the page for that Unit, and you cannot make changes to the Unit. - - -.. image:: Images/image231.png - :width: 600 - - -In the right pane, click the blue **edit a draft** link in the **Unit -Settings** box. - - -.. image:: Images/image233.png - :width: 600 - - -After you click **edit a draft**, you can make changes to the Unit. You can -edit existing content or add new content. - - -.. image:: Images/image235.png - :width: 600 - - -If you want to view the version of your content that is currently live, -click **Preview the published version **in the yellow banner at the top of -the page. - - -.. image:: Images/image237.png - :width: 600 - - -If you want to view the draft version that you are working on, click -**Preview** under **Unit Settings**. This opens your course in Preview -mode.**** - - -.. image:: Images/image239.png - :width: 600 - - -When you are done making changes to the Unit, click the blue **replace it -with this draft** link under **Unit Settings**. - - -.. image:: Images/image241.png - :width: 600 diff --git a/docs/course_authors/source/open_response_assessment.rst b/docs/course_authors/source/open_response_assessment.rst new file mode 100644 index 0000000000..438b7fbdaf --- /dev/null +++ b/docs/course_authors/source/open_response_assessment.rst @@ -0,0 +1,636 @@ +.. _Open Response Assessment Problems: + +Open Response Assessment Problems +--------------------------------- + +Introduction to Open Response Assessments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Note** Open response assessments are still in beta. We recommend that +you test them thoroughly in a practice course and only add them to +courses that are **not** already running. Contact your edX Program Manager for more information. + +Open response assessments allow instructors to assess student learning +through questions that may not have definite answers. Tens of thousands +of students can receive feedback on written responses of varying lengths +as well as files, such as computer code or images, that the students +upload. Open response assessment technologies include self assessment, +peer assessment, and artificial intelligence (AI) assessment (sometimes +called "machine assessment" or "machine grading"). With self +assessments, students learn by comparing their answers to a rubric that +you create. With peer assessments, students compare their peers' answers +to the rubric. + +A Few Notes about Open Response Assessments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Open response assessment technology is still in beta.** For a good +experience with open response assessments, you'll need to follow a few +guidelines. + +- Do not create a new open response assessment in a running course. + Only create open response assessments in a test course. +- If your course will include open response assessments, add and + thoroughly test all the open response assessments *before* the course + is live. +- Set open response assessments to be optional, ungraded, or droppable + exercises until you've used the technology a few times and have + become familiar with it. +- Use open response assessments sparingly at first. Only include a few + in your course, and make sure that you have contingency plans in case + you run into problems. + +Finally, if you're at an edX consortium university and you plan to +include open response assessments in a MOOC, make sure to notify your +edX project manager (PM). + +Components of an Open Response Assessment +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +An open response assessment has three elements: + +- The assessment type or types--self, peer, or artificial intelligence + (AI). The type of assessment and the order in which the assessments + run appears in the upper right corner of the ORA problem. In the + following example, the student performs a self assessment, then peers + perform peer assessments, and then an AI assessment runs. + + .. image:: Images/CITL_AssmtTypes.gif + +- The question that you want your students to answer. This appears near + the top of the component, followed by a field where the student + enters a response. + + .. image:: Images/CITLsample.gif + +- A rubric that you design. After the student enters a response and + clicks **Submit**, if the assessment is a self assessment, the + student sees the rubric below his answer and compares his answer to + the rubric. (If the assessment is an AI or peer assessment, the + student sees a "Your response has been submitted" message but doesn't + see the rubric.) + + .. image:: Images/CITL_SA_Rubric.gif + +Open Response Assessment Types +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +There are three types of assessments for ORAs: self assessment, AI +assessment, and peer assessment. + +- Self assessment allows students to answer a question, and then assess + their response according to the rubric you created for the question. +- In AI assessment, a computer algorithm learns how to grade according + to the rubric from 100 or more instructor-graded responses, and + attempts to grade the rest of the student responses in the same way. +- Peer assessment allows students to score each other and provide + feedback, again using the same rubric. + +You can use one or more of these assessments in any problem. You can +also set thresholds within the problem for each assessment, so that a +response with a low score in one assessment does not move on to the next +assessment. + +Effective Questions +~~~~~~~~~~~~~~~~~~~ + +When you write your question, we recommend that you specify an +approximate number of words or sentences that a student's response has +to have in the body of your question. You may also want to provide +information about how to use the LMS. If you require students to upload +a file as a response, you can provide specific instructions about how to +upload and submit their files. You can let students know what to expect +after they submit responses. You can also mention the number of times +that a student will be able to submit a response for the problem. + +Rubrics +~~~~~~~ + +The same rubric is used for all three ORA types, and it can include +anything that you want it to include. + +In Studio, rubrics are arranged by *categories*. Each category has two +or more *options*, and each option has a point value. + +Options must be listed in ascending order starting at 0 points. For +example, in a category with three options, the first option is worth 0 +points, the second is worth 1 point, and the third is worth 2 points. +The person or algorithm that grades the problem selects one value for +each category. + +Different categories in the same problem can have different numbers of +options. + +Create an Open Response Assessment Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Creating an open response assessment is a multi-step process. + +#. Create the component for the open response assessment. +#. Add the question. +#. Add the rubric. +#. Set the assessment type and scoring. +#. Set the problem name. +#. Set other options. +#. Save the problem. +#. Add the peer grading interface (for peer assessments only). +#. Test the problem. + +Each of these steps is described in detail below. + +1. Create the Component +~~~~~~~~~~~~~~~~~~~~~~~ + +#. Add the advanced component for open response assessments. To do this, + add the "peergrading","combinedopenended" key value to the **Advanced + Settings** page. (For more information, see the instructions in + Specialized Problems.) +#. In Studio, open the unit where you want to create the ORA. +#. Under **Add New Component**, click **Advanced**, and then click + **Open Response Assessment**. +#. In the problem component that appears, click **Edit**, and then click + **OK** in the dialog box that appears. +#. The component editor opens. The component editor contains a sample + question ("prompt"), rubric, assessment type specification, and + scoring. You'll replace this sample content with the content for your + problem. + +2. Add the Question +~~~~~~~~~~~~~~~~~~~ + +- In the component editor, locate the [prompt] tags. + + .. image:: Images/ORA_Prompt.gif + +Replace the sample text between the **[prompt]** tags with the text of +your question. When you replace the sample text, make sure you follow +these guidelines to avoid common formatting mistakes. + +- Leave the **[prompt]** tags in place. +- Enclose all text in HTML tags. + +3. Add the Rubric +~~~~~~~~~~~~~~~~~ + +#. In the component editor, locate the [rubric] tags. (The sample rubric + is long, so you'll have to scroll down to locate the second tag.) + + .. image:: Images/ORA_Rubric.gif + +#. Replace the sample rubric with the text of your rubric. Make sure to + do the following. + +- Include the beginning and ending [rubric] tags. +- Precede the categories with a plus (+) sign. +- Precede the options with a minus (-) sign. + +- List the option that scores zero points first, followed by the option + that scores one point, and so on. + + For example, your rubric might resemble the following rubric. + +:: + + [rubric] + + + Writing Applications + - The essay loses focus, has little information or supporting details, and the organization makes it difficult to follow. + - The essay presents a mostly unified theme, includes sufficient information to convey the theme, and is generally organized well. + + + Language Conventions + - The essay demonstrates a reasonable command of proper spelling and grammar. + - The essay demonstrates superior command of proper spelling and grammar. + + [rubric] + +4. Set the Assessment Type and Scoring +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To set the assessment type and scoring for your open response +assessment, you'll enter code that specifies the type and order of +assessments to use along with the scoring thresholds for each +assessment. The code uses the following format. + +:: + + [tasks] + (Type 1), ({min-max}Type 2), ({min-max}Type 3) + [tasks] + +- The **[tasks]** tags surround the code. +- **Type 1**, **Type 2**, and **Type 3** are the names of the types of + assessments. Assessments run in the order in which they're listed. +- **min** is the point value the response must receive in the previous + assessment to move to this assessment. Note that you do not define a + scoring threshold for the first assessment, because there is no + required previous assessment. +- **max** is the maximum point value for the assessment. The maximum + score is the second number in the pair of numbers for each assessment + after the first assessment. + +For example, a problem might contain the following code. + +:: + + [tasks] + (Self), ({5-7}Peer), ({4-7}AI) + [tasks] + +The problem that includes this code has the following characteristics. + +- The problem has a self assessment, a peer assessment, and then an AI + assessment. +- The maximum score for the problem is 7. +- To advance to the peer assessment, the response must have a self + assessment score of 5 or greater. +- To advance to the AI assessment, the response must have a peer + assessment score of 4 or greater. + +Set the Type and Scoring +^^^^^^^^^^^^^^^^^^^^^^^^ + +#. In the component editor, locate the [tasks] tags. + + .. image:: Images/ORA_Tasks.gif + +#. Replace the sample code with the code for your problem. + +5. Set the Problem Name +~~~~~~~~~~~~~~~~~~~~~~~ + +The name of the problem appears as a heading above the problem in the +courseware. It also appears in the list of problems on the **Staff +Grading** page. + +.. image:: Images/ORA_ProblemName1.gif + +To change the name: + +#. In the upper-right corner of the component editor, click + **Settings**. +#. In the **Display Name** field, replace **Open Response Assessment** + with the name of your problem. + +6. Set Other Options +~~~~~~~~~~~~~~~~~~~~ + +If you want to change the problem settings, which include the number of +responses a student has to peer grade and whether students can upload +files as part of their response, click the **Settings** tab, and then +specify the options that you want. + +.. image:: Images/ORA_Settings.gif + +Open response assessments include the following settings. + ++---------------------------------------------+--------------------------------------------------------------------+ +| **Allow "overgrading" of peer submissions** | This setting applies only to peer grading. If all of the responses | +| | for a question have been graded, the instructor can allow | +| | additional students to grade responses that were previously | +| | graded. This can be helpful if an instructor feels that peer | +| | grading has helped students learn, or if some students haven't | +| | graded the required number of responses yet, but all available | +| | responses have been graded. | ++---------------------------------------------+--------------------------------------------------------------------+ +| **Allow File Uploads** | This setting specifies whether a student can upload a file, such | +| | as an image file or a code file, as a response. Files can be of | +| | any type. | ++---------------------------------------------+--------------------------------------------------------------------+ +| **Disable Quality Filter** | This setting applies to peer grading and AI grading. When the | +| | quality filter is disabled (when this value is set to True), | +| | Studio allows submissions that are of "poor quality" (such as | +| | responses that are very short or that have many spelling or | +| | grammatical errors) to be peer graded. For example, you may | +| | disable the quality filter if you want students to include URLs to | +| | external content—otherwise Studio sees a URL, which may contain a | +| | long string of seemingly random characters, as a misspelled word. | +| | When the quality filter is enabled (when this value is set to | +| | False), Studio does not allow poor-quality submissions to be peer | +| | graded. | ++---------------------------------------------+--------------------------------------------------------------------+ +| **Display Name** | This name appears in two places in the LMS: in the course ribbon | +| | at the top of the page and above the exercise. | ++---------------------------------------------+--------------------------------------------------------------------+ +| **Graded** | This setting specifies whether the problem counts toward a | +| | student's grade. By default, if a subsection is set as a graded | +| | assignment, each problem in that subsection is graded. However, if | +| | a subsection is set as a graded assignment, and you want this | +| | problem to be a "test" problem that doesn't count toward a | +| | student's grade, you can change this setting to **False**. | ++---------------------------------------------+--------------------------------------------------------------------+ +| **Maximum Attempts** | This setting specifies the number of times the student can try to | +| | answer the problem. Note that each time a student answers a | +| | problem, the student's response is graded separately. If a student | +| | submits two responses to a peer-assessed problem (for example, by | +| | using the **New Submission** button after her first response | +| | receives a bad grade or because she wants to change her original | +| | response), and the problem requires three peer graders, three | +| | separate peer graders will have to grade each of the student's two | +| | responses. We thus recommend keeping the maximum number of | +| | attempts for each question low. | ++---------------------------------------------+--------------------------------------------------------------------+ +| **Maximum Peer Grading Calibrations** | This setting applies only to peer grading. You can set the maximum | +| | number of responses a student has to "practice grade" before the | +| | student can start grading other students' responses. The default | +| | value is 6, but you can set this value to any number from 1 to 20. | +| | This value must be greater than or equal to the value set for | +| | **Minimum Peer Grading Calibrations**. | ++---------------------------------------------+--------------------------------------------------------------------+ +| **Minimum Peer Grading Calibrations** | This setting applies only to peer grading. You can set the minimum | +| | number of responses a student has to "practice grade" before the | +| | student can start grading other students' responses. The default | +| | value is 3, but you can set this value to any number from 1 to 20. | +| | This value must be less than or equal to the value set for | +| | **Maximum Peer Grading Calibrations**. | ++---------------------------------------------+--------------------------------------------------------------------+ +| **Peer Graders per Response** | This setting applies only to peer grading. This setting specifies | +| | the number of times a response must be graded before the score and | +| | feedback are available to the student who submitted the response. | ++---------------------------------------------+--------------------------------------------------------------------+ +| **Peer Track Changes** | This setting is new and still under development. This setting | +| | applies only to peer grading. When this setting is enabled (set to | +| | **True**), peer graders can make inline changes to the responses | +| | they're grading. These changes are visible to the student who | +| | submitted the response, along with the rubric and comments for the | +| | problem. | ++---------------------------------------------+--------------------------------------------------------------------+ +| **Problem Weight** | This setting specifies the number of points the problem is worth. | +| | By default, each problem is worth one point. | ++---------------------------------------------+--------------------------------------------------------------------+ +| **Required Peer Grading** | This setting specifies the number of responses that each student | +| | who submits a response has to grade before the student receives a | +| | grade for her response. This value can be the same as the value | +| | for the **Peer Graders per Response** setting, but we recommend | +| | that you set this value higher than the **Peer Graders per | +| | Response** setting to make sure that every student's work is | +| | graded. (If no responses remain to be graded, but a student still | +| | needs to grade responses, you can set the **Allow "overgrading" of | +| | peer submissions** setting to allow more students to grade | +| | previously graded responses.) | ++---------------------------------------------+--------------------------------------------------------------------+ + +7. Save the Problem +~~~~~~~~~~~~~~~~~~~ + +- After you have created the prompt and the rubric, set the assessment + type and scoring, changed the name of the problem, and specified any + additional settings, click **Save**. + + The component appears in Studio. In the upper right corner, you can + see the type of assessments that you have set for this problem. + +.. image:: Images/ORA_Component.gif + +8. Add the Peer Grading Interface (for peer assessments only) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can add just one peer grading interface for the whole course, or you +can add a separate peer grading interface for each individual problem. + +Add a Single Peer Grading Interface for the Course +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When you add just one peer grading interface for the entire course, we +recommend that you create that peer grading interface in its own section +so that students can find it easily. Students will be able to access all +the ORA problems for the course through this peer grading interface. + +#. Create a new section, subsection, and unit. You can use any names + that you want. One course used "Peer Grading Interface" for all + three. +#. Under **Add New Component** in the new unit, click **Advanced**, and + then click **Peer Grading Interface**. + + A new Peer Grading Interface component appears. + +#. To see the peer grading interface in the course, set the visibility + of the unit to **Public**, and then click **View Live**. + + The following page opens. + + .. image:: Images/PGI_Single.gif + + When students submit responses for peer assessments in your course, + the names of the problems appear in this interface. + +Add the Peer Grading Interface to an Individual Problem +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When you add a peer grading interface for an individual problem, you +must add the identifier for the problem to that peer grading interface. +If you don't add the identifier, the interface will show all of the peer +assessments in the course. + +Note that the peer grading interface doesn't have to appear under the +problem you want it to be associated with. As long as you've added the +identifier of the problem, the peer grading interface will be associated +with the problem, even if you include the peer grading interface in a +later unit (for example, if you want the problem to be due after a +week). + +#. Open the unit that contains the ORA. +#. If the visibility of the unit is set to Public, click **View Live**. + If the visibility is set to Private, click **Preview**. The unit + opens in the LMS in a new tab. Make sure you're in Staff view rather + than Student view. +#. Scroll down to the bottom of the ORA, and then click **Staff Debug + Info**. +#. In the image that opens, locate the string of alphanumeric characters + to the right of the word **location**. Press CTRL+C to copy this + string, starting with **i4x**. + + .. image:: Images/PA_StaffDebug_Location.gif + +#. Switch back to the unit in Studio. If the visibility of the unit is + set to **Public**, change the visibility to **Private**. +#. Scroll to the bottom of the unit, click **Advanced** under **Add New + Component**, and then click **Peer Grading Interface**. +#. On the Peer Grading Interface component that opens, click **Edit**. +#. In the Peer Grading Interface component editor, click **Settings**. +#. In the **Link to Problem Location** field, paste the string of + alphanumeric characters that you copied in step 4. Then, change the + **Show Single Problem** setting to **True**. + + .. image:: Images/PGI_CompEditor_Settings.gif + +#. Click **Save** to close the component editor. + +9. Test the Problem +~~~~~~~~~~~~~~~~~~~ + +Test your problem by adding and grading a response. + +#. In Studio, open the unit that contains your ORA problem. +#. Under **Unit Settings**, change the **Visibility** setting to + **Public**, and then click **View Live**. + + When you click **View Live**, the unit opens in the LMS in a new tab. + +#. In the LMS, locate your ORA question, and then type your response in + the Response field under the question. + + .. image:: Images/ThreeAssmts_NoResponse.gif + + Note that when you view your ORA problem in the LMS as an instructor, + you see the following message below the problem. This message never + appears to students. + + .. image:: Images/ORA_DuplicateWarning.gif + +#. Test the problem to make sure that it works as expected. + +To test your open response assessment, you may want to sign into your +course as a student, using an account that's different from the account +that you use as an instructor. + +- If you want to keep your course open as an instructor when you sign + in as a student, either open a window in Incognito Mode in Firefox or + Chrome or use a different browser to access your course. For example, + if you used Firefox to create the course, use Chrome when you sign in + as a student. +- If you don't need to keep your course open, sign out of your course, + and then sign back in using a different account. Note that if you do + this, you can't make changes to your course without signing out and + signing back in as an instructor. + +Grade an Open Response Assessment Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You'll grade student responses to both AI assessments and peer +assessments from the **Staff Grading** page in the LMS. Take a moment to +familiarize yourself with the features of this page. + +The Staff Grading Page +^^^^^^^^^^^^^^^^^^^^^^^ + +When a response is available for you to grade, a yellow exclamation mark +appears next to **Open Ended Panel** at the top of the screen. + +.. image:: Images/OpenEndedPanel.gif + +To access the **Staff Grading** page, click **Open Ended Panel**. + +When the **Open Ended Console** page opens, click **Staff Grading**. +Notice the **New submissions to grade** notification. + +.. image:: Images/OpenEndedConsole_NewSubmissions.gif + +When the **Staff Grading** page opens, information about your open +response assessment appears in several columns. + +.. image:: Images/ProblemList-DemoCourse.gif + ++----------------------------------------------------+--------------------------------------------------------------------+ +| **Problem Name** | The name of the problem. Click the name of the problem to open it. | +| | Problems in your course do not appear under **Problem Name** on | +| | the **Staff Grading** page until at least one response to the | +| | problem has been submitted and is available to grade. | ++----------------------------------------------------+--------------------------------------------------------------------+ +| **Graded** | The number of responses for that problem that you have already | +| | graded. Even if the AI algorithm has graded all available | +| | responses, you can still grade the responses that the algorithm | +| | designates as low-confidence responses by clicking the problem | +| | name in the list. | ++----------------------------------------------------+--------------------------------------------------------------------+ +| **Available to grade** | The total number of ungraded student submissions. | ++----------------------------------------------------+--------------------------------------------------------------------+ +| **Required** | The number of responses remaining to be graded to train the | +| | algorithm for AI or to calibrate the responses for peer grading. | +| | If your open response assessment calls for both AI and peer | +| | assessment, the 20 responses that you grade for the peer | +| | assessment count toward the 100 responses for the AI assessment. | ++----------------------------------------------------+--------------------------------------------------------------------+ +| **Progress** | A visual indication of your progress through the grading process. | ++----------------------------------------------------+--------------------------------------------------------------------+ + +Grade Responses +^^^^^^^^^^^^^^^ + +#. Go to the **Staff Grading** page. +#. Under **Problem Name**, click the name of the problem that you want. + + When the problem opens, the information about the number of responses + that are still available to grade, that have been graded, and that an + instructor is required to grade appears under the problem name. You + can also find out about the AI algorithm's error rate. The error rate + is a calculation of the difference between the scores that AI + algorithm provides and the scores that the instructor provides. + + .. image:: Images/ResponseToGrade.gif + +#. In the rubric below the response, select the option that best + describes the response. +#. If applicable, add additional feedback. + + - You can provide comments for the student in the **Written + Feedback** field. + - If you do not feel that you can grade the response (for example, + if you're a member of course staff but you would rather have the + instructor grade the response), you can click **Skip** to skip it. + - If the response contains inappropriate content, you can select the + **Flag as inappropriate content for later review** check box. + Flagged content is accessed on the **Staff Grading** page. If + necessary, course staff can ban a student from peer grading. + + .. image:: Images/AdditionalFeedback.gif + +#. When you are done grading the response, click **Submit**. + +When your course is running, another response opens automatically after +you grade the first response, and a message appears at the top of the +page. + +.. image:: Images/FetchingNextSubmission.gif + +After you've graded all responses for this problem, **No more +submissions to grade** appears on the page. + +.. image:: Images/NoMoreSubmissions.gif + +Click **Back to problem list** to return to the list of problems. You +can also wait for a few minutes and click **Re-check for submissions** +to see if any other students have submitted responses. + +Access Scores and Feedback +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You access your scores for your responses to AI and peer assessment +problems through the **Open Ended Console** page. + +#. From any page in the LMS, click the **Open Ended Panel** tab at the + top of the page. + + .. image:: Images/OpenEndedPanel.gif + +#. On the **Open Ended Console** page, click **Problems You Have + Submitted**. + + .. image:: Images/ProblemsYouHaveSubmitted.gif + +#. On the **Open Ended Problems** page, check the **Status** column to + see whether your responses have been graded. +#. When grading for a problem has been finished, click the name of a + problem in the list to see your score for that problem. When you + click the name of the problem, the problem opens in the courseware. + +For both AI and peer assessments, the score appears below your response +in an abbreviated version of the rubric. For peer assessments, you can +also see the written feedback that your response received from different +graders. + +**Graded AI Assessment** + +.. image:: Images/AI_ScoredResponse.gif + +**Graded Peer Assessment** + +.. image:: Images/Peer_ScoredResponse.gif + +If you want to see the full rubric for either an AI or peer assessment, +click **Toggle Full Rubric**. + +**Note** For a peer assessment, if you haven't yet graded enough +problems to see your score, you receive a message that lets you know how +many problems you still need to grade. + +.. image:: Images/FeedbackNotAvailable.gif diff --git a/docs/course_authors/source/organizing_course.rst b/docs/course_authors/source/organizing_course.rst new file mode 100644 index 0000000000..73ef085cc1 --- /dev/null +++ b/docs/course_authors/source/organizing_course.rst @@ -0,0 +1,219 @@ +.. _Organizing Your Course Content: + +############################### +Organizing Your Course Content +############################### + +.. _How a Course is Organized: + +************************* +How a Course is Organized +************************* + +You organize your course in the following hierarchy: + +- :ref:`Sections`, which contain + - :ref:`Subsections`, which contain + - :ref:`Units`, which contain + - :ref:`Components`, which contain your actual course content. + + +Studio provides you with flexibility when organizing your course. +A common course model is for Sections to correspond to weeks, and for Subsections to correspond to lessons. + +================== +The Course Outline +================== + +In Studio, you view your course organization through the Course Outline. + +To open the Course Outline, from the **Content** menu, select **Outline**. + +The following example shows a course outline with callouts to identify the different course elements: + +.. image:: Images/course_outline.png + :width: 800 + +The following example shows how a student would view this course content: + +.. image:: Images/course_outline_student_view.png + :width: 800 + +.. _Sections: + +******** +Sections +******** + +A Section is the topmost category in your course. A Section can represent a time-period in your course, or another organizing principle. + +To create a Section: + +#. In the Course Outline, click **New Section**. +#. In the field that opens at the top of the outline, enter the new Section name. +#. Click **Save**. + +The new, empty Section is placed at the bottom of the course outline. +You must now add Subsections to the Section. + +Whether or not students see the new Section depends on the release date. +See LINK for more information on releasing your course. + +.. _Subsections: + +**************** +Subsections +**************** + +Sections are divided into Subsections. A Subsection may represent a topic in your course, or another organizing principle. + +You can set a Subsection to an assignment type that you created when +you set up grading. You can then include assignments in the body of that +Subsection. For more information on grading, see LINK. + +To create a Subsection: + +#. Within the Section, click **New Subsection**. +#. In the field that opens at the bottom of the section, enter the new Subsection name. +#. Click **Save**. + +The new, empty Subsection is placed at the bottom of the Section. +You must now add Units to the Subsection. + +Whether or not students see the new Subsection depends on its release date. +See LINK for more information on releasing your course. + + +================== +Edit a subsection +================== + +You can add and delete Subsections, and select the grading policy, directly from the Course Outline. + +You can also open the Subsection in its own page, to perform those tasks as well as to +set the Subsection release date, set a due date, preview a draft of the Subsection, or view the live course. + +Click on the Subsection title. The Subsection opens in its own page: + + .. image:: Images/subsection.png + :width: 800 + + +======================= +Set the Grading Policy +======================= + +You can designate a Subsection as one of the assignment types that you specified in the grading policy. + +You set the grading policy for the Subsection from the Course Outline or from the Subsection page. + +From the Course Outline, click the checkmark next to the Subsection. Then select a grading policy from the popup menu: + + .. image:: Images/course_outline_set_grade.png + :width: 800 + +From the Subsection page, click the text next to the **Graded as** label, then select a grading policy from the popup menu: + + .. image:: Images/subsection_set_grade.png + :width: 800 + +See :ref:`Establish a Grading Policy` for more information. + + +================== +Set the Due Date +================== + +For Subsections that contain graded problems, you can set a due date. Students must complete the problems in the Subsection before the due date to get credit. + +#. From the Subsection page, click **SET A DUE DATE**. The Due Day and Due Time fields appear. +#. Place the cursor in the Due Date field, and pick a day from the popup calendar. +#. Place the cursor in the Due Time field and pick a time. + +.. note:: When you set a due date, keep in mind that students will be in different time zones. By default, the time zone appears as UTC, not the student's local time. If you tell your students an assignment is due at 5:00 PM, make sure to specify that the time is 5:00 PM UTC and point them to a time converter. + +Alternatively, you can :ref:`Set the Grace Period` for your assignments to cover any misunderstandings about time. For example, some classes have set a grace period of 1 day, 6 hours, and 1 minute. The grace period applies to all assignments. + +For more information, see :ref:`Establish a Grading Policy`. + +.. _Units: + +****** +Units +****** + +Subsections are divided into Units. A Unit contains one or more Components. + +For students, each Unit in the Subsection is represented as a link on the accordian at the top of the page. +The following page shows a Subsection that has nine Units: + +.. image:: Images/units_students.png + :width: 800 + +.. warning:: + + Studio does not have versioning or automatic + updating of your browser between refreshes. Versioning is planned for future + releases, but, in the meantime, only one author should edit a unit, in one + browser, on only one tab. If a unit is open for editing in multiple browser + sessions, the session that saves last will overwrite any previously saved + content without displaying a warning. Also, older browser sessions can overwrite + more recent content, so refresh your browser before you start working every time + you work with a private unit or edit a draft of a public unit. + + +To create a Unit from the Course Outline or the Subsection page: + +#. Within the Subsection, click **New Unit**. +#. Enter the Display Name that students will see. +#. Click a Component type to add a the first Component in the Unit. + .. image:: Images/Unit_DisplayName_Studio.png + +#. Follow the instructions for the type of Component, listed below. +#. By default, the Unit visibility is **Private**, meaning students will not be able to see the Unit. Unless you want to publish the Unit to students immediately, leave this setting. See LINK for more information on releasing your course. + +The Unit with the single Component is placed at the bottom of the Subsection. + +.. _Components: + +********** +Components +********** + +A component is the part of a unit that contains your actual course content. A unit can can contain one or more components + +A student can view the name of all components in a unit by hovering over the unit icon in the accordian at the top of the page. + +You add the first component when creating the unit. + +To add another component to the unit: + +#. If the Unit is Public, change the **Visibility** setting to **Private**. You cannot modify a Public Unit. +#. In the **Add New Component** panel at the bottom of the Unit, click the type of Component to add. + .. image:: Images/Unit_DisplayName_Studio.png +#. Follow the instructions for the type of Component: + + * :ref:`Working with HTML Components` + * :ref:`Working with Video Components` + * :ref:`Working with Discussion Components` + * :ref:`Working with Problem Components` + + + +.. _Reorganize Your Course: + +********************** +Reorganize Your Course +********************** + +You can reorganize your course by dragging and dropping elements in the Course Outline. + +To move a Section, Subsection, or Unit, click the mouse on the element's handle on the right side of the outline, then move the element to the new location. +Element handles are highlighed in the following image: + + .. image:: Images/drag_drop.png + :width: 800 + +When you move a course element, a blue line indicates the new position. You can move a Subsection to a new Section, and a Unit to a new Subsection. + +You can reorganize Components within a Unit in the same way. \ No newline at end of file diff --git a/docs/course_authors/source/read_me.rst b/docs/course_authors/source/read_me.rst index c305df3f4e..b414160d13 100644 --- a/docs/course_authors/source/read_me.rst +++ b/docs/course_authors/source/read_me.rst @@ -2,17 +2,17 @@ Read Me ******* -The edX "Getting Started with Studio" help and PDF documentation is created -using Sphinx_ and LaTeX_. You, the user community, can help update and revise +The edX *Building a course with Studio* documentation is created +using RST_ files and Sphinx_. You, the user community, can help update and revise this documentation project on GitHub:: https://github.com/edx/edx-platform/tree/master/docs/course_authors/source To suggest a revision, fork the project, make changes in your fork, and submit a pull request back to the original project: this is known as the `GitHub Flow`_. -All pull requests will need approval from an engineering contact at edX. For -more information, contact edX at docs@edx.org. +All pull requests need approval from edX. For more information, contact edX at docs@edx.org. .. _Sphinx: http://sphinx-doc.org/ .. _LaTeX: http://www.latex-project.org/ .. _`GitHub Flow`: https://github.com/blog/1557-github-flow-in-the-browser +.. _RST: http://docutils.sourceforge.net/rst.html \ No newline at end of file diff --git a/docs/course_authors/source/set_content_releasedates.rst b/docs/course_authors/source/set_content_releasedates.rst index b55afc1e8c..24755e9abc 100644 --- a/docs/course_authors/source/set_content_releasedates.rst +++ b/docs/course_authors/source/set_content_releasedates.rst @@ -1,82 +1,163 @@ +.. _Publishing Your Course: -***************************************** -Set Content Release Dates and Visibility -***************************************** +########################### +Publishing Your Course +########################### -The release schedule for course material is determined by setting release dates -for sections and subsections. +When you have set up your course, established a grading system, and organized your course content, +you are ready to publish your course and make it available to students. -Section -******* +Understanding the content your students can view, and knowing how to change what students can view, is complex. +Read the following sections carefully: - To set the release date for a section: +* :ref:`Understanding Content Students Can View` +* :ref:`Release Dates` +* :ref:`Public and Private Units` +* :ref:`Modifying Public Units` - 1. On the **Course Content** menu, click **Course Outline**. - 2. Find the section you are looking for in the course outline. +.. _Understanding Content Students Can View: - 3. Under **Will Release**, click **Edit**, and then change the date. - .. image:: Images/image280.png +****************************************** +Understanding Content Students Can View +****************************************** -Subsection -********** +When you create a course on Studio, students cannot see any of your course content until the course start date has passed. +After the course start date has passed, whether a student can see your course materials depends on two settings that you can control: release dates and visibility. + +* The **Release Date**. Sections and subsections have release dates. If the current date + of a section or subsection is before the release date, the content of that course element is + not yet published, and not visible to students. + + For a student to view a subsection, both it and its containing section must be have a release date + earlier than the current date. It is possible that a section is released, but a subsection within it + is not released. In this case, students cannot view that subsection. + + Course staff can see sections and subsections before the release date in the LMS. + +* The unit must be **Public**. All units have a **Visibility** setting that is **Public** or **Private**. + When you create a unit, it is **Private** by default. + + Students cannot view a **Private** unit, even if the containing section and subsection are released. + + Students cannot view a **Public** unit if the containing section and subsection are *not* released. + + Course staff *cannot* see Private units in the LMS. + +In summary, for students to see content, the unit must be **Public**, and the containing section and +subsection must be released. If all these criteria are not met, students do not see that unit. + +Continue reading this chapter for more details. + + +.. _Release Dates: + +******************* +Release Dates +******************* + +Release dates specify the dates when content is available to students. +Release dates are set at the section and subsection levels. +Neither a section nor its contents are visible to students until the release date passes. +However, course staff can see content in the LMS regardless of its release date. + +======================================== +Set the Release Date for a Section +======================================== + +You can set release date and time for each section. +Before the release date and time, students are not able to view any content in that section. + +To set a release date for a section: + +#. In the **Will Release:** field next to the section title, click **Edit**. +#. Enter the release date in MM/DD/YYYY format, and the UTC time. +#. Click **Save**. + + +======================================== +Set the Release Date for a Subsection +======================================== Subsections inherit the release date of the section they are in, but you can change this date so that different subsections are released at different times. Note that if the release date for a subsection falls before the release date for the section that contains it, students will not be able to see the subsection -until the release date for the *section *has passed. Section release dates +until the release date for the *section* has passed. Section release dates override subsection release dates. - To set the release date for a subsection: +To set the release date for a subsection: - 1. Click to open the subsection. +#. Open the subsection. +#. Locate the **Subsection Settings** box in the top right corner. +#. Enter the release date in MM/DD/YYYY format, and the UTC time. - 2. Locate the **Subsection Settings** box in the top right corner. - 3. Under **Release Date**, change the date. +================================================ +Synch the Release Date for a Subsection +================================================ -Unit -**** - -Individual units inherit the release date of the subsection they are in, but -have an additional **Visibility** setting that can be set to **Public** or -**Private**. Private units are never visible to students. +You or other course staff could inadvertantly set the release date for a subsection +earlier than the release date for the containing section. In this situation, the subsection is +not released until the section is released. -.. note:: +To help you keep your course and release dates organized, Studio flags subsections with earlier release dates +than their containing section. In this situation, when you open the subsection, in the Subsection Settings, +you see the following message: -You can modify private units directly. To modify a unit that is marked -Public you must create a draft. +``The date above differs from the release date of
-
. Sync to
.`` -For more information, see :doc:`modify_published_content` . +Click **Sync to
** to have the subsection inherit the later section release date. + +.. _Public and Private Units: + +************************* +Public and Private Units +************************* + +Units are released at the release date of the subsection they are in. + +In addition, unites have a **Visibility** setting that you can set to **Public** or +**Private**. + +When you create a unit, it is Private by default. +A Private unit is never visible to students, even if it is contained by a subsection that has been released. + +When you change the visibility setting of a unit from Private to Public, you publish the unit and its contents. +You must set the Visibility to Public for students to be able to see the unit. + +Course staff cannot see Private units in the LMS. + + +.. _Modifying Public Units: + +************************* +Modifying Public Units +************************* + +To make revisions to a unit that has been published, you create and edit a draft of that unit. +To create a draft, go to the unit's page, and then click **edit a draft** in the right pane. + +.. image:: Images/Viz_Revise_EditDraft.png + :width: 800 + +When you edit a draft of a unit, you can view the unit's contents in two ways. + +* To view the already-published content as it appears in the live course, click **View the Live Version** in the upper-right corner of the page. +* To view the unpublished content as you're working on it, click **Preview**. + +.. image:: Images/Viz_Revise_ViewLiveandPreview.png + :width: 800 + +When you're ready to publish the draft of your revised content, +click **replace it with this draft** in the right pane. + +If you decide you don't want to keep the revised content, click **Delete Draft**. + +.. image:: Images/Viz_Revise_ReplaceorDelete.png + +.. Warning:: Historical versions of units are not stored by Studio. After you replace the live version with a new draft, you cannot revert the unit to the previous version. - - - To change the **Visibility** setting for a private unit: - - - 1. Click to open the unit. - - - 2. Locate the **Unit Settings** box in the top right corner. - - - 3. For **Visibility**, select **Public**. - - - To change the **Visibility** setting for a public unit: - - - 1. Click to open the unit. - - - 2. Locate the **Unit Settings** box in the top right corner. - - - 3. Under **Unit Settings**, click **edit a draft**. - - - 4. For **Visibility**, select **Private**. \ No newline at end of file diff --git a/docs/course_authors/source/specialized_problems.rst b/docs/course_authors/source/specialized_problems.rst new file mode 100644 index 0000000000..ee0bdf4235 --- /dev/null +++ b/docs/course_authors/source/specialized_problems.rst @@ -0,0 +1,238 @@ +.. _Specialized Problems: + +Specialized Problems +==================== + +Specialized problems are advanced problems such as annotations, open +response assessments, and word clouds. These problems are available +through the Advanced component in Studio. To add the Advanced component +to your course, you'll modify your course's advanced settings. The +Advanced component then appears under **Add New Component** in each +unit. + +- :ref:`Annotation` Annotation problems ask students to respond to + questions about a specific block of text. The question appears above + the text when the student hovers the mouse over the highlighted text + so that students can think about the question as they read. +- :ref:`Open Response Assessment` Open response assessment problems allow students + to enter short answer or essay responses that students or a computer + algorithm can then grade. +- :ref:`Word Cloud` Word cloud problems show a colorful graphic of the + words that students enter as responses to a prompt. + + +**Add the Advanced Component to Your Course** + +By default, when you create a new component in Studio, you see the +following options. + +.. image:: Images/AddNewComponent.gif + +To create a specialized problem, you must first add the Advanced +component to your course. To do this, follow these steps. + +#. On the **Settings** menu, click **Advanced Settings**. + +#. On the **Advanced Settings** page, locate the **Manual Policy + Definition** section, and then locate the **advanced_modules** + policy key (this key is at the top of the list). + + .. image:: Images/AdvancedModulesEmpty.gif + +#. Under **Policy Value**, place your cursor between the brackets, and + then enter the value for the type of problem that you want to create. + Make sure to include the quotation marks, but not the period. + + - For annotations, enter **"annotatable"**. + + - For open response assessments, enter + **"combinedopenended","peergrading"**. (Include the comma but no + spaces between the words.) + + - For word clouds, enter **"word_cloud"**. + + You can enter more than one problem type at a time. When you do, + make sure to surround each problem type with quotation marks and + separate each problem type with a comma, but do not include any + spaces. + + For example, if you wanted to add annotations, open response + assessments, and word cloud problems in your course, you would enter + the following between the brackets. + + :: + + "annotatable","combinedopenended","peergrading","word_cloud" + + .. image:: Images/AdvSettings_Before.gif + +#. At the bottom of the page, click **Save Changes**. + + The page refreshes automatically. At the top of the page, you see a + notification that your changes have been saved. + + The text in the **Policy Value** field now appears as follows. + + .. image:: Images/AdvSettings_After.gif + +#. Return to the unit where you want to add the specialized problem. The + list of possible components now contains an Advanced component. + + .. image:: Images/AdvancedComponent.gif + +When you click the Advanced component, you see the following list. + +.. image:: Images/SpecProbs_List.gif + +You can now create annotations, open response assessments, and word +clouds in your course. More information about how to create each problem +is provided in the page for that problem type. + +.. _Annotation: + +Annotation +---------- + + +In an annotation problem, the instructor highlights specific text +inside a larger text block and then asks questions about that text. The +questions appear when students hover the mouse over the highlighted +text. The questions also appear in a section below the text block, along +with space for students' responses. + +.. image:: Images/AnnotationExample.gif + +Create an Annotation Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +To create an annotation problem: + +Add the Annotation advanced component. To do this, add the "annotatable" +key value to the **Advanced Settings** page. (For more information, see +the instructions in :ref:`Specialized Problems`.) + +Add the **Instructions** and **Guided Discussion** segments of the +problem. + + +#. In the unit where you want to create the problem, click **Advanced** + under **Add New Component**. +#. In the list of problem types, click **Annotation**. +#. In the component that appears, click **Edit**. +#. In the component editor, replace the example code with your own code. +#. Click **Save**. + + +Add the **Annotation problem** segment of the problem. + + +#. Under the Annotation component, create a new blank Advanced Problem + component. +#. Paste the following code in the Advanced Problem component, replacing + placeholders with your own information. + + + :: + + + + + PLACEHOLDER: Text of annotation + PLACEHOLDER: Text of question + PLACEHOLDER: Type your response below: + PLACEHOLDER: In your response to this question, which tag below + do you choose? + + + + + + + + +

PLACEHOLDER: Detailed explanation of solution

+
+
+ +#. Click **Save**. + + +.. _Open Response Assessment: + +Open Response Assessment +------------------------ + + +In open response assessments, tens of thousands of students can receive feedback +on written responses of varying lengths as well as files, such as computer code or +images, that the students upload. + + +Because open response assessments are more complex than most other problem types, +they have a separate section. For more information about these problems, see +:ref:`Open Response Assessment Problems`. + + + +.. _Word Cloud: + +Word Cloud +---------- + + +In a word cloud problem, students enter words into a field in response +to a question or prompt. The words all the students have entered then +appear instantly as a colorful graphic, with the most popular responses +appearing largest. The graphic becomes larger as more students answer. +Students can both see the way their peers have answered and contribute +their thoughts to the group. + + +For example, the following word cloud was created from students' +responses to a question in a HarvardX course. + +.. image:: Images/WordCloudExample.gif + +Create a Word Cloud Problem +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To create a word cloud problem: + + +#. Add the Word Cloud advanced component. To do this, add the + "word_cloud" key value to the **Advanced Settings** page. (For more + information, see the instructions in :ref:`Specialized Problems`.) +#. In the unit where you want to create the problem, click **Advanced** + under **Add New Component**. +#. In the list of problem types, click **Word Cloud**. +#. In the component that appears, click **Edit**. +#. In the component editor, specify the settings that you want. You can + leave the default value for everything except **Display Name**. + + + - **Display Name**: The name that appears in the course ribbon and + as a heading above the problem. + - **Inputs**: The number of text boxes into which students can enter + words, phrases, or sentences. + - **Maximum Words**: The maximum number of words that the word cloud + displays. If students enter 300 different words but the maximum is + set to 250, only the 250 most commonly entered words appear in the + word cloud. + - **Show Percents**: The number of times that students have entered + a given word as a percentage of all words entered appears near + that word. + + +#. Click **Save**. + + +For more information, see `Xml Format of "Word Cloud" Module +`_. \ No newline at end of file diff --git a/docs/course_authors/source/view_course_content.rst b/docs/course_authors/source/view_course_content.rst index 9f5dac88af..7f98568e1a 100644 --- a/docs/course_authors/source/view_course_content.rst +++ b/docs/course_authors/source/view_course_content.rst @@ -1,340 +1,80 @@ -******************* -View Course Content -******************* +.. _Testing Your Course: -When you create a course on Studio, you can control when students can see -the content of your course. This means that you can continue building a -course, but students won't be able to see the changes you make until you -make those changes available. You can set release dates that control when -content is released to the internet. You can also set the visibility of -specific Units (a subdivision that helps you organize your course content) -to Public or Private. By default, all content is set to Private. - - -Your content is not visible to students on edX or Edge until three -conditions are met: +########################### +Testing Your Course +########################### -1. The course start date has passed. +The way your course looks in Studio is not the way students see and experience your course. -2. The release dates for the Section and Subsection that contain the - content have passed. - - -* Sections and Subsections are categories that you use to organize your -course. For example, Sections may correspond to weeks in your course, while -Subsections may correspond to the topics in your course. - - -* Neither a Section nor its contents are visible until the release date -passes. If the release date for the Section has passed, but the release date -for the Subsection has not passed, the student can see the Section heading -in the left pane. However, the student cannot see the Subsection heading or -any of the Subsection's content. - - -* Subsections inherit the release date of the Section they are in, but you -can change this date so that individual Subsections are released at different -times after the Section has been released. - - -.. image:: Images/image189.png - - -.. image:: Images/image191.png +Therefore, as and after you develop course content, you must view and test your course from a students' point of view. - -3. You set the Unit that contains the content to Public.** By default, all -Units are set to Private. - - -There are four ways of viewing your course on edX or Edge while you are -still creating it: - - -* In Studio +From within Studio, you can test your course in two ways: +* :ref:`Preview Your Course` +* :ref:`View Your Live Course` -.. note:: +.. _Preview Your Course: - The way your course looks in Studio is not the way it looks to students on - edX or Edge. +*********************** +Preview Your Course +*********************** - -* On edX or Edge in Preview mode - - Any content that is set to Private is only visible in Preview mode. - - -* On edX or Edge as an Instructor - - When you view content as an instructor, you see the **Instructor** tab at the - the top of the screen. - - -* On edX or Edge as a Student - -.. raw:: latex - - \newpage % - - -Outline View -============ - - -When you want to see the overall organization of your course in Studio, you can -go to the **Course Outline **page. On the**Course Outline **page, you can -see the "macro" outline of your course, down to individual Units. - - -.. image:: Images/image193.png - - -.. raw:: latex - - \newpage % - -Subsection View -=============== - -You can also view content by Subsection. In this view, you can see the name -of the Subsection and the Units that the Subsection contains. You can see if -the Section is graded or not graded; if it is graded, you can see the -assignment type of the Subsection. You can also see if the individual Units -are set to Public or Private. Private Units appear in light gray text with -"PRIVATE" next to the Unit name. All other Units are Public. - - -.. image:: Images/image195.png - - -.. raw:: latex - - \newpage % - -Unit View -========= - -When you want to see the actual text, problems, and other content in your -course, you can open an individual Unit. You then see the Components for -that Unit. You can see this content whether it is set to Public or Private, -and whether or not the release date has passed. - - -The following example shows the Studio view of two Units in the "What Does -an edX Course Look Like?" Subsection. - - -The following Unit is set to Public. The release date for the Subsection has -passed. - - -.. image:: Images/image197.png - - -The following Unit is set to Private. The release date for the Subsection -has passed. - - -.. image:: Images/image199.png - - -If you change the release date for the "What Does an edX Course Look Like?" -Subsection to a date in the future (in this example, January 1, 2099), you -still see both Units in Studio. - - -Public Unit -^^^^^^^^^^^ - - - -.. image:: Images/image201.png - - -Private Unit -^^^^^^^^^^^^ - - - -.. image:: Images/image203.png - - - -.. raw:: latex - - \newpage % - - -Preview Mode -============ - -When you view your course on edX or Edge using Preview mode, you see all the +When you view your course through Preview mode, you see all the Units of your course, regardless of whether they are set to Public or Private and regardless of whether the release dates have passed. -**Using Preview mode is the only way to see content that is set to Private +Using Preview mode is the only way to see content that is set to Private **as a student would see it.** You can enter Preview mode in two ways. - -1. On any Subsection page, click** Preview Drafts**. - - +* On any subsection page, click **Preview Drafts**. + .. image:: Images/image205.png + :width: 800 +* On any Unit page, click **Preview**. -2. On any Unit page, click **Preview**. - - -The following example shows the **Preview** button on a page for a Unit that +The following example shows the **Preview** button for a unit that is set to Public. - .. image:: Images/image207.png + :width: 800 -The following example shows the **Preview** button on a page for a Unit that +The following example shows the **Preview** button for a unit that is set to Private. - .. image:: Images/image209.png + :width: 800 -Example -======= - -The following example shows the first Unit of the "What Does an edX Course -Look Like?" Subsection in Preview mode. - - -.. image:: Images/image211.png - - -Remember that the release date for the Subsection is in the past. However, -even if you change the release date for the "What Does an edX Course Look -Like?" Subsection to a date in the future, you still see both Units in -Preview. - - -In the "What Does an edX Course Look Like?" Subsection, Unit 1 ("Welcome to -edX 101") is set to Public, and Unit 2 ("New edX Information") is set to -Private. Both Units appear in the course ribbon at the top of the screen. - - -.. image:: Images/image213.png +.. _View Your Live Course: -When you click Unit 2 in the course ribbon, you see the content in Unit 2: - - -.. image:: Images/image215.png - -**On edX or Edge as an Instructor** - -When you view your course on edX or Edge as an instructor: - - -* You see all the Units of your course that you have set to Public. -* Release dates do not matter. - - -You do not see Units that are set to Private. - - -Additionally, at the top of the page on edX or Edge, you can see the -**Instructor** tab. - - -To view your course on edX or Edge as an instructor, click **View Live**. The -**View Live **button is available in three places.** ** - -The **Course Outline** page. - - -.. image:: Images/image217.png - - -Any Subsection page. - - -.. image:: Images/image219.png - - - -The Unit page, if the Unit is Public. - - -.. image:: Images/image221.png - -Example -======= - -The following example shows the first Unit of the "What Does an edX Course -Look Like?" Subsection as if you were viewing it on edX or Edge as an -instructor. Notice the **Instructor** tab at the top of the page. - - -.. image:: Images/image223.png - - -The release date for the "What Does an edX Course Look Like?" Subsection is -set to January 1, 2099. However, you still see this Unit on edX or Edge as -an instructor. - - -On the other hand, remember that Unit 1 is set to Public, and Unit 2 is set -to Private. Unit 2 does not appear in the course ribbon at the top of the -screen. Instead, the next public unit, **Tabs**, appears. - - -.. image:: Images/image225.png - -**On edX or Edge as a Current Student** - -When you view your course as a current student would see it, you can only -see material that meets all three publishing conditions: - - -The course start date has passed. - - -* The release dates for the Section and Subsection have passed. - -* The Unit that contains the material is set to Public. - - -You can use this view to make sure that material does not appear in your -course prematurely. - - -To view your course as a student, set up a test account on edX or Edge with -an e-mail address that is not associated with your Course Team, and then go -to your course URL and register for your course. +*********************** +View Your Live Course +*********************** -Example -======= +When you view your course as an staff member (that is, using the same account you use to build the course in Studio), +you see all the units of your course that are set to **Public**, regardless of the release dates of the containing section or subsection. -The following example shows the first Unit of the "What Does an edX Course -Look Like?" Subsection as if you were viewing it on edX or Edge as a -student. Notice that the **Instructor** tab does not appear at the top of -the page. +You do not see units that are set to **Private**. To see Private units, you must use Preview mode as described above. +You can view the live course from three different places in Studio: -.. image:: Images/image227.png +* The **Course Outline** page. + + .. image:: Images/image217.png + :width: 800 +* Any Subsection page. -Remember that Unit 1 is set to Public, and Unit 2 is set to Private. Unit 2 -does not appear in the course ribbon at the top of the screen. Instead, the -next public unit, **Tabs**, appears. + .. image:: Images/image219.png + :width: 800 +* The Unit page, if the Unit is Public. -.. image:: Images/image229.png - - -If you change the release date of the Subsection to a future date (such as -January 1, 2099), the student cannot see it. - - -If you set the Unit to Private, the student cannot see it. + .. image:: Images/image221.png + :width: 800 +