_ZN4Ogre15CompositionPass15setThreadGroupsERKNS_6VectorILi3EiEE:
  315|     41|        void setThreadGroups(const Vector3i& g) { mThreadGroups = g; }
_ZN4Ogre15CompositionPass13setCameraNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  318|    118|        void setCameraName(const String& name) { mRenderScene.cameraName = name; }
_ZN4Ogre15CompositionPass20setAlignCameraToFaceEb:
  321|     74|        void setAlignCameraToFace(bool val) { mRenderScene.alignCameraToFace = val; }
_ZN4Ogre15CompositionPass8InputTexC2Ev:
  240|  41.6k|            InputTex() : mrtIndex(0) {}
_ZN4Ogre15CompositionPass8InputTexC2ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEm:
  242|  1.73k|                : name(_name), mrtIndex(_mrtIndex) {}
_ZN4Ogre15CompositionPass12MaterialDataC2Ev:
  340|  2.60k|            MaterialData() : identifier(0) {}
_ZN4Ogre15CompositionPass15RenderSceneDataC2Ev:
  358|  2.60k|                : firstRenderQueue(RENDER_QUEUE_BACKGROUND), lastRenderQueue(RENDER_QUEUE_TRANSPARENTS),
  359|  2.60k|                  alignCameraToFace(false)
  360|  2.60k|            {
  361|  2.60k|            }
_ZN4Ogre15CompositionPass9ClearDataC2Ev:
  379|  2.60k|                : buffers(FBT_COLOUR | FBT_DEPTH), colour(ColourValue::ZERO), automaticColour(false),
  380|  2.60k|                  depth(1.0f), stencil(0)
  381|  2.60k|            {
  382|  2.60k|            }
_ZN4Ogre15CompositionPass8QuadDataC2Ev:
  401|  2.60k|                : cornerModified(false), rect(-1, 1, 1, -1), farCorners(false), farCornersViewSpace(false)
  402|  2.60k|            {
  403|  2.60k|            }

_ZN4Ogre21CompositionTargetPass14setOutputSliceEi:
   75|    303|        void setOutputSlice(int slice) { mOutputSlice = slice; }
_ZNK4Ogre21CompositionTargetPass9getPassesEv:
  141|  1.17k|        const Passes& getPasses() const {
  142|  1.17k|            return mPasses;
  143|  1.17k|        }

_ZNK4Ogre28ExternalTextureSourceManager16getCurrentPlugInEv:
   67|      7|        ExternalTextureSource* getCurrentPlugIn( void ) const { return mCurrExternalTextureSource; }

_ZN4Ogre17GpuProgramManager16createParametersEv:
  163|  3.26k|        static GpuProgramParametersPtr createParameters(void) { return std::make_shared<GpuProgramParameters>(); }

_ZNK4Ogre11LodStrategy7getNameEv:
  103|      8|        const String& getName() const { return mName; }

_ZN4Ogre13OptimisedUtilC2Ev:
   64|      2|        OptimisedUtil(void) {}

_ZN4Ogre34RenderSystemCapabilitiesSerializer22addCapabilitiesMappingERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12CapabilitiesE:
  100|     43|        {
  101|     43|            mCapabilitiesMap.emplace(name, cap);
  102|     43|        }
_ZN4Ogre34RenderSystemCapabilitiesSerializer14addKeywordTypeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS0_21CapabilityKeywordTypeE:
  117|     31|        {
  118|     31|            mKeywordTypeMap.emplace(keyword, type);
  119|     31|        }
_ZN4Ogre34RenderSystemCapabilitiesSerializer18addSetStringMethodERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEMNS_24RenderSystemCapabilitiesEFvS9_E:
  132|      4|        {
  133|      4|            mSetStringMethodDispatchTable.emplace(keyword, method);
  134|      4|        }
_ZN4Ogre34RenderSystemCapabilitiesSerializer15addSetIntMethodERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEMNS_24RenderSystemCapabilitiesEFvtE:
  152|     10|        {
  153|     10|            mSetIntMethodDispatchTable.emplace(keyword, method);
  154|     10|        }
_ZN4Ogre34RenderSystemCapabilitiesSerializer16addSetBoolMethodERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEMNS_24RenderSystemCapabilitiesEFvbE:
  172|      1|        {
  173|      1|            mSetBoolMethodDispatchTable.emplace(keyword, method);
  174|      1|        }
_ZN4Ogre34RenderSystemCapabilitiesSerializer16addSetRealMethodERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEMNS_24RenderSystemCapabilitiesEFvfE:
  192|      1|        {
  193|      1|            mSetRealMethodDispatchTable.emplace(keyword, method);
  194|      1|        }

_ZNK4Ogre15ResourceManager15getLoadingOrderEv:
  383|   232k|        Real getLoadingOrder(void) const override { return mLoadOrder; }

_ZN4Ogre22ScriptCompilerListenerD2Ev:
  383|      1|        virtual ~ScriptCompilerListener() {}

_ZN4Ogre16ScriptTranslator7getRealERKNS_9SharedPtrINS_12AbstractNodeEEEPf:
   72|  3.29k|        {
   73|  3.29k|#if OGRE_DOUBLE_PRECISION == 0
   74|  3.29k|            return getFloat(node, result);
   75|       |#else
   76|       |            return getDouble(node, result);
   77|       |#endif
   78|  3.29k|        }

_ZN4Ogre9SharedPtrINSt3__14listINS0_INS_12ConcreteNodeEEENS1_9allocatorIS4_EEEEEC2IS7_EERKNS1_10shared_ptrIT_EE:
   59|  15.9k|        SharedPtr(const shared_ptr<Y>& r) : shared_ptr<T>(r) {}
_ZN4Ogre9SharedPtrINS_10DataStreamEEC2INS_16MemoryDataStreamEEEPT_:
   50|  5.80k|        explicit SharedPtr(Y* ptr) : shared_ptr<T>(ptr) {}

_ZN4Ogre7TextureD2Ev:
  144|   213k|        virtual ~Texture() {}

_ZN4Ogre21DefaultTextureManager10createImplERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEmS9_bPNS_20ManualResourceLoaderEPKNS1_3mapIS7_S7_NS1_4lessIS7_EENS5_INS1_4pairIS8_S7_EEEEEE:
  446|   213k|        {
  447|   213k|            return new NullTexture(this, name, handle, group);
  448|   213k|        }
_ZN4Ogre21DefaultTextureManager11NullTextureC2EPNS_15ResourceManagerERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEmSC_:
  435|   213k|                : Texture(creator, name, handle, group)
  436|   213k|            {
  437|   213k|            }
_ZN4Ogre14TextureManager20getDefaultNumMipmapsEv:
  399|   223k|        {
  400|   223k|            return mDefaultNumMipmaps;
  401|   223k|        }
_ZN4Ogre14TextureManager18_createSamplerImplEv:
  416|  4.72k|        virtual SamplerPtr _createSamplerImpl() { return std::make_shared<Sampler>(); }

_ZN4Ogre9ASTCCodec7startupEv:
  165|      1|	{
  166|      1|		if (!msInstance)
  ------------------
  |  Branch (166:7): [True: 1, False: 0]
  ------------------
  167|      1|		{
  168|      1|			msInstance = OGRE_NEW ASTCCodec();
  169|      1|			Codec::registerCodec(msInstance);
  170|      1|		}
  171|       |
  172|      1|        LogManager::getSingleton().logMessage(LML_NORMAL,
  173|      1|                                              "ASTC codec registering");
  174|      1|	}
_ZN4Ogre9ASTCCodecC2Ev:
  187|      1|        mType("astc")
  188|      1|    { 
  189|      1|    }
_ZNK4Ogre9ASTCCodec7getTypeEv:
  273|      1|    {
  274|      1|        return mType;
  275|      1|    }

_ZN4Ogre14ArchiveManager12getSingletonEv:
   40|      3|    {  
   41|       |        assert( msSingleton );  return ( *msSingleton );  
   42|      3|    }
_ZN4Ogre14ArchiveManagerC2Ev:
   45|      1|    {
   46|      1|    }
_ZN4Ogre14ArchiveManager17addArchiveFactoryEPNS_14ArchiveFactoryE:
  126|      3|    {
  127|      3|        mArchFactories.emplace(factory->getType(), factory);
  128|      3|        LogManager::getSingleton().logMessage("ArchiveFactory for type '" + factory->getType() + "' registered");
  129|      3|    }

_ZNK4Ogre21BillboardChainFactory7getTypeEv:
  710|      3|    {
  711|      3|        return MOT_BILLBOARD_CHAIN;
  712|      3|    }

_ZNK4Ogre19BillboardSetFactory7getTypeEv:
 1139|      3|    {
 1140|      3|        return MOT_BILLBOARD_SET;
 1141|      3|    }

_ZN4Ogre5Codec13registerCodecEPS0_:
   62|      5|    {
   63|      5|        auto ret = msMapCodecs.emplace(pCodec->getType(), pCodec);
   64|      5|        if (!ret.second)
  ------------------
  |  Branch (64:13): [True: 0, False: 5]
  ------------------
   65|       |            OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, pCodec->getType() + " already has a registered codec");
   66|      5|    }

_ZN4Ogre15CompositionPassC2EPNS_21CompositionTargetPassE:
   35|  2.60k|    mParent(parent),
   36|  2.60k|    mType(PT_RENDERQUAD)
   37|  2.60k|{
   38|  2.60k|}
_ZN4Ogre15CompositionPassD2Ev:
   41|  2.60k|{
   42|  2.60k|}
_ZN4Ogre15CompositionPass7setTypeENS0_8PassTypeE:
   45|  2.60k|{
   46|  2.60k|    mType = type;
   47|  2.60k|}
_ZNK4Ogre15CompositionPass7getTypeEv:
   50|  2.60k|{
   51|  2.60k|    return mType;
   52|  2.60k|}
_ZN4Ogre15CompositionPass13setIdentifierEj:
   55|    468|{
   56|    468|    mMaterial.identifier = id;
   57|    468|}
_ZN4Ogre15CompositionPass11setMaterialERKNS_9SharedPtrINS_8MaterialEEE:
   65|     95|{
   66|     95|    mMaterial.material = mat;
   67|     95|}
_ZN4Ogre15CompositionPass15setClearBuffersEj:
   80|     64|{
   81|     64|    mClear.buffers = val;
   82|     64|}
_ZN4Ogre15CompositionPass14setClearColourERKNS_11ColourValueE:
   90|     12|{
   91|     12|    mClear.colour = val;
   92|     12|}
_ZN4Ogre15CompositionPass8setInputEmRKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEm:
  110|  1.73k|{
  111|       |    assert(id < OGRE_MAX_TEXTURE_LAYERS);
  112|  1.73k|    mMaterial.inputs[id] = InputTex(input, mrtIndex);
  113|  1.73k|}
_ZN4Ogre15CompositionPass19setFirstRenderQueueEh:
  146|     33|{
  147|     33|    mRenderScene.firstRenderQueue = id;
  148|     33|}
_ZN4Ogre15CompositionPass18setLastRenderQueueEh:
  156|     53|{
  157|     53|    mRenderScene.lastRenderQueue = id;
  158|     53|}
_ZN4Ogre15CompositionPass17setMaterialSchemeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  166|     17|{
  167|     17|    mRenderScene.materialScheme = schemeName;
  168|     17|}
_ZN4Ogre15CompositionPass13setClearDepthEf:
  176|     19|{
  177|     19|    mClear.depth = depth;
  178|     19|}
_ZN4Ogre15CompositionPass17setQuadFarCornersEbb:
  257|    172|{
  258|    172|    mQuad.farCorners = farCorners;
  259|    172|    mQuad.farCornersViewSpace = farCornersViewSpace;
  260|    172|}
_ZN4Ogre15CompositionPass13setCustomTypeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  271|     11|{
  272|     11|    mCustomType = customType;
  273|     11|}

_ZN4Ogre21CompositionTargetPassC2EPNS_20CompositionTechniqueE:
   35|  4.32k|    mParent(parent),
   36|  4.32k|    mInputMode(IM_NONE),
   37|  4.32k|    mOnlyInitial(false),
   38|  4.32k|    mVisibilityMask(0xFFFFFFFF),
   39|  4.32k|    mLodBias(1.0f),
   40|  4.32k|    mMaterialScheme(MaterialManager::DEFAULT_SCHEME_NAME), 
   41|  4.32k|    mShadowsEnabled(true),
   42|  4.32k|    mOutputSlice(0)
   43|  4.32k|{
   44|  4.32k|    if (Root::getSingleton().getRenderSystem())
  ------------------
  |  Branch (44:9): [True: 0, False: 4.32k]
  ------------------
   45|      0|    {
   46|      0|        mMaterialScheme = Root::getSingleton().getRenderSystem()->_getDefaultViewportMaterialScheme();
   47|      0|    }
   48|  4.32k|}
_ZN4Ogre21CompositionTargetPassD2Ev:
   51|  4.32k|{
   52|  4.32k|    removeAllPasses();
   53|  4.32k|}
_ZN4Ogre21CompositionTargetPass12setInputModeENS0_9InputModeE:
   56|  3.91k|{
   57|  3.91k|    mInputMode = mode;
   58|  3.91k|}
_ZNK4Ogre21CompositionTargetPass12getInputModeEv:
   61|  1.13k|{
   62|  1.13k|    return mInputMode;
   63|  1.13k|}
_ZN4Ogre21CompositionTargetPass13setOutputNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   66|  2.47k|{
   67|  2.47k|    mOutputName = out;
   68|  2.47k|}
_ZN4Ogre21CompositionTargetPass17setVisibilityMaskEj:
   86|    207|{
   87|    207|    mVisibilityMask = mask;
   88|    207|}
_ZN4Ogre21CompositionTargetPass17setMaterialSchemeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  106|    153|{
  107|    153|    mMaterialScheme = schemeName;
  108|    153|}
_ZN4Ogre21CompositionTargetPass17setShadowsEnabledEb:
  116|     53|{
  117|     53|    mShadowsEnabled = enabled;
  118|     53|}
_ZN4Ogre21CompositionTargetPass10createPassENS_15CompositionPass8PassTypeE:
  126|  2.60k|{
  127|       |    CompositionPass *t = OGRE_NEW CompositionPass(this);
  128|  2.60k|    t->setType(type);
  129|  2.60k|    mPasses.push_back(t);
  130|  2.60k|    return t;
  131|  2.60k|}
_ZN4Ogre21CompositionTargetPass15removeAllPassesEv:
  143|  4.32k|{
  144|  4.32k|    for (auto p : mPasses)
  ------------------
  |  Branch (144:17): [True: 2.60k, False: 4.32k]
  ------------------
  145|  2.60k|    {
  146|       |        OGRE_DELETE (p);
  147|  2.60k|    }
  148|  4.32k|    mPasses.clear();
  149|  4.32k|}

_ZN4Ogre20CompositionTechniqueC2EPNS_10CompositorE:
   34|  1.84k|    mParent(parent)
   35|  1.84k|{
   36|       |    mOutputTarget = OGRE_NEW CompositionTargetPass(this);
   37|  1.84k|}
_ZN4Ogre20CompositionTechniqueD2Ev:
   40|  1.84k|{
   41|  1.84k|    removeAllTextureDefinitions();
   42|  1.84k|    removeAllTargetPasses();
   43|       |    OGRE_DELETE  mOutputTarget;
   44|  1.84k|}
_ZN4Ogre20CompositionTechnique23createTextureDefinitionERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   47|  2.87k|{
   48|  2.87k|    if(getTextureDefinition(name))
  ------------------
  |  Branch (48:8): [True: 199, False: 2.67k]
  ------------------
   49|  2.87k|        OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, "Texture '"+name+"' already exists");
   50|       |
   51|  2.67k|    TextureDefinition *t = OGRE_NEW TextureDefinition();
   52|  2.67k|    t->name = name;
   53|  2.67k|    mTextureDefinitions.push_back(t);
   54|  2.67k|    return t;
   55|  2.87k|}
_ZNK4Ogre20CompositionTechnique20getTextureDefinitionERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   67|  2.87k|{
   68|  2.87k|    for (auto *t : mTextureDefinitions)
  ------------------
  |  Branch (68:18): [True: 3.48k, False: 2.67k]
  ------------------
   69|  3.48k|    {
   70|  3.48k|        if (t->name == name)
  ------------------
  |  Branch (70:13): [True: 199, False: 3.28k]
  ------------------
   71|    199|            return t;
   72|  3.48k|    }
   73|  2.67k|    return 0;
   74|       |
   75|  2.87k|}
_ZN4Ogre20CompositionTechnique27removeAllTextureDefinitionsEv:
   78|  1.84k|{
   79|  1.84k|    for (auto *t : mTextureDefinitions)
  ------------------
  |  Branch (79:18): [True: 2.67k, False: 1.84k]
  ------------------
   80|  2.67k|    {
   81|       |        OGRE_DELETE t;
   82|  2.67k|    }
   83|  1.84k|    mTextureDefinitions.clear();
   84|  1.84k|}
_ZN4Ogre20CompositionTechnique16createTargetPassEv:
   93|  2.48k|{
   94|       |    CompositionTargetPass *t = OGRE_NEW CompositionTargetPass(this);
   95|  2.48k|    mTargetPasses.push_back(t);
   96|  2.48k|    return t;
   97|  2.48k|}
_ZN4Ogre20CompositionTechnique21removeAllTargetPassesEv:
  109|  1.84k|{
  110|  1.84k|    for (auto *t : mTargetPasses)
  ------------------
  |  Branch (110:18): [True: 2.48k, False: 1.84k]
  ------------------
  111|  2.48k|    {
  112|       |        OGRE_DELETE t;
  113|  2.48k|    }
  114|  1.84k|    mTargetPasses.clear();
  115|  1.84k|}
_ZN4Ogre20CompositionTechnique13setSchemeNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  201|      2|{
  202|      2|    mSchemeName = schemeName;
  203|      2|}

_ZN4Ogre10CompositorC2EPNS_15ResourceManagerERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEmSB_bPNS_20ManualResourceLoaderE:
   37|  1.99k|    Resource(creator, name, handle, group, isManual, loader),
   38|  1.99k|    mCompilationRequired(true)
   39|  1.99k|{
   40|  1.99k|}
_ZN4Ogre10CompositorD2Ev:
   44|  1.99k|{
   45|  1.99k|    removeAllTechniques();
   46|       |    // have to call this here reather than in Resource destructor
   47|       |    // since calling virtual methods in base destructors causes crash
   48|  1.99k|    unload();
   49|  1.99k|}
_ZN4Ogre10Compositor15createTechniqueEv:
   52|  1.84k|{
   53|       |    CompositionTechnique *t = OGRE_NEW CompositionTechnique(this);
   54|  1.84k|    mTechniques.push_back(t);
   55|  1.84k|    mCompilationRequired = true;
   56|  1.84k|    return t;
   57|  1.84k|}
_ZN4Ogre10Compositor19removeAllTechniquesEv:
   71|  3.94k|{
   72|  3.94k|    for (auto *t : mTechniques)
  ------------------
  |  Branch (72:18): [True: 1.84k, False: 3.94k]
  ------------------
   73|  1.84k|    {
   74|       |        OGRE_DELETE t;
   75|  1.84k|    }
   76|  3.94k|    mTechniques.clear();
   77|  3.94k|    mSupportedTechniques.clear();
   78|  3.94k|    mCompilationRequired = true;
   79|  3.94k|}

_ZN4Ogre17CompositorManager12getSingletonEv:
   44|  1.99k|{  
   45|       |    assert( msSingleton );  return ( *msSingleton );  
   46|  1.99k|}//-----------------------------------------------------------------------
_ZN4Ogre17CompositorManagerC2Ev:
   48|      1|    mRectangle(0)
   49|      1|{
   50|       |    // Loading order (just after materials)
   51|      1|    mLoadOrder = 110.0f;
   52|       |
   53|       |    // Resource type
   54|      1|    mResourceType = "Compositor";
   55|       |
   56|       |    // Register with resource group manager
   57|      1|    ResourceGroupManager::getSingleton()._registerResourceManager(mResourceType, this);
   58|       |
   59|      1|}
_ZN4Ogre17CompositorManager10createImplERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEmS9_bPNS_20ManualResourceLoaderEPKNS1_3mapIS7_S7_NS1_4lessIS7_EENS5_INS1_4pairIS8_S7_EEEEEE:
   76|  1.99k|{
   77|       |    return OGRE_NEW Compositor(this, name, handle, group, isManual, loader);
   78|  1.99k|}
_ZN4Ogre17CompositorManager6createERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_bPNS_20ManualResourceLoaderEPKNS1_3mapIS7_S7_NS1_4lessIS7_EENS5_INS1_4pairIS8_S7_EEEEEE:
   83|  1.99k|{
   84|  1.99k|    return static_pointer_cast<Compositor>(createResource(name,group,isManual,loader,createParams));
   85|  1.99k|}

_ZN4Ogre8DDSCodec7startupEv:
  168|      1|    {
  169|      1|        if (!msInstance)
  ------------------
  |  Branch (169:13): [True: 1, False: 0]
  ------------------
  170|      1|        {
  171|       |
  172|      1|            LogManager::getSingleton().logMessage(
  173|      1|                LML_NORMAL,
  174|      1|                "DDS codec registering");
  175|       |
  176|      1|            msInstance = OGRE_NEW DDSCodec();
  177|      1|            Codec::registerCodec(msInstance);
  178|      1|        }
  179|       |
  180|      1|    }
_ZN4Ogre8DDSCodecC2Ev:
  194|      1|        mType("dds"),
  195|      1|        mDecodeEnforce(false)
  196|      1|    { 
  197|      1|    }
_ZNK4Ogre8DDSCodec7getTypeEv:
 1056|      1|    {
 1057|      1|        return mType;
 1058|      1|    }

_ZN4Ogre10DataStream11getAsStringEv:
  169|  5.80k|    {
  170|       |        // Read the entire buffer - ideally in one read, but if the size of
  171|       |        // the buffer is unknown, do multiple fixed size reads.
  172|  5.80k|        size_t bufSize = (mSize > 0 ? mSize : 4096);
  ------------------
  |  Branch (172:27): [True: 5.80k, False: 0]
  ------------------
  173|  5.80k|        char* pBuf = OGRE_ALLOC_T(char, bufSize, MEMCATEGORY_GENERAL);
  174|       |        // Ensure read from begin of stream
  175|  5.80k|        seek(0);
  176|  5.80k|        String result;
  177|  11.6k|        while (!eof())
  ------------------
  |  Branch (177:16): [True: 5.80k, False: 5.80k]
  ------------------
  178|  5.80k|        {
  179|  5.80k|            size_t nr = read(pBuf, bufSize);
  180|  5.80k|            result.append(pBuf, nr);
  181|  5.80k|        }
  182|       |        OGRE_FREE(pBuf, MEMCATEGORY_GENERAL);
  183|  5.80k|        return result;
  184|  5.80k|    }
_ZN4Ogre16MemoryDataStreamC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPvmbb:
  199|  5.80k|        : DataStream(name, static_cast<uint16>(readOnly ? READ : (READ | WRITE)))
  ------------------
  |  Branch (199:48): [True: 5.80k, False: 0]
  ------------------
  200|  5.80k|    {
  201|  5.80k|        mData = mPos = static_cast<uchar*>(pMem);
  202|  5.80k|        mSize = inSize;
  203|  5.80k|        mEnd = mData + mSize;
  204|  5.80k|        mFreeOnClose = freeOnClose;
  205|       |        assert(mEnd >= mPos);
  206|  5.80k|    }
_ZN4Ogre16MemoryDataStreamD2Ev:
  336|  5.80k|    {
  337|  5.80k|        close();
  338|  5.80k|    }
_ZN4Ogre16MemoryDataStream4readEPvm:
  341|  5.80k|    {
  342|       |        // Read over end of memory?
  343|  5.80k|        if (mPos >= mEnd)
  ------------------
  |  Branch (343:13): [True: 0, False: 5.80k]
  ------------------
  344|      0|            return 0;
  345|  5.80k|        size_t cnt = std::min(count, static_cast<size_t>(mEnd - mPos));
  346|  5.80k|        if (cnt == 0)
  ------------------
  |  Branch (346:13): [True: 0, False: 5.80k]
  ------------------
  347|      0|            return 0;
  348|       |
  349|  5.80k|        assert (cnt<=count);
  350|       |
  351|  5.80k|        memcpy(buf, mPos, cnt);
  352|  5.80k|        mPos += cnt;
  353|  5.80k|        return cnt;
  354|  5.80k|    }
_ZN4Ogre16MemoryDataStream4seekEm:
  443|  5.80k|    {
  444|  5.80k|        if (mData + pos > mEnd)
  ------------------
  |  Branch (444:13): [True: 0, False: 5.80k]
  ------------------
  445|      0|            pos = static_cast<size_t>(mEnd - mData); // will trigger eof
  446|  5.80k|        mPos = mData + pos;
  447|  5.80k|    }
_ZNK4Ogre16MemoryDataStream3eofEv:
  456|  11.6k|    {
  457|  11.6k|        return mPos >= mEnd;
  458|  11.6k|    }
_ZN4Ogre16MemoryDataStream5closeEv:
  461|  5.80k|    {
  462|  5.80k|        mAccess = 0;
  463|  5.80k|        if (mFreeOnClose && mData)
  ------------------
  |  Branch (463:13): [True: 0, False: 5.80k]
  |  Branch (463:29): [True: 0, False: 0]
  ------------------
  464|      0|        {
  465|       |            OGRE_FREE(mData, MEMCATEGORY_GENERAL);
  466|      0|            mData = 0;
  467|      0|        }
  468|  5.80k|    }

_ZN4Ogre16DefaultWorkQueueC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   34|      1|    : DefaultWorkQueueBase(name), mNumThreadsRegisteredWithRS(0)
   35|      1|    {
   36|      1|    }

_ZN4Ogre23DistanceLodStrategyBaseC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   37|      2|        : LodStrategy(name)
   38|      2|        , mReferenceViewEnabled(false)
   39|      2|        , mReferenceViewValue(-1)
   40|      2|    { }
_ZNK4Ogre23DistanceLodStrategyBase12getBaseValueEv:
   76|    100|    {
   77|    100|        return Real(0);
   78|    100|    }
_ZNK4Ogre23DistanceLodStrategyBase18transformUserValueEf:
   87|     79|    {
   88|       |        // Square user-supplied distance
   89|     79|        return Math::Sqr(userValue);
   90|     79|    }
_ZN4Ogre25DistanceLodSphereStrategyC2Ev:
  161|      1|        : DistanceLodStrategyBase("distance_sphere")
  162|      1|    { }
_ZN4Ogre22DistanceLodBoxStrategyC2Ev:
  192|      1|        : DistanceLodStrategyBase("distance_box")
  193|      1|    { }

_ZN4Ogre13DynLibManagerC2Ev:
   48|      1|    {
   49|      1|    }

_ZN4Ogre8ETCCodec7startupEv:
   93|      1|    {
   94|      1|        if (!msPKMInstance)
  ------------------
  |  Branch (94:13): [True: 1, False: 0]
  ------------------
   95|      1|        {
   96|      1|            msPKMInstance = OGRE_NEW ETCCodec("pkm");
   97|      1|            Codec::registerCodec(msPKMInstance);
   98|      1|        }
   99|       |
  100|      1|        if (!msKTXInstance)
  ------------------
  |  Branch (100:13): [True: 1, False: 0]
  ------------------
  101|      1|        {
  102|      1|            msKTXInstance = OGRE_NEW ETCCodec("ktx");
  103|      1|            Codec::registerCodec(msKTXInstance);
  104|      1|        }
  105|       |
  106|      1|        LogManager::getSingleton().logMessage(LML_NORMAL,
  107|      1|                                              "ETC codec registering");
  108|      1|    }
_ZN4Ogre8ETCCodecC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  128|      2|        mType(type)
  129|      2|    {
  130|      2|    }
_ZNK4Ogre8ETCCodec7getTypeEv:
  140|      2|    {
  141|      2|        return mType;
  142|      2|    }

_ZNK4Ogre13EntityFactory7getTypeEv:
 2240|      3|    {
 2241|      3|        return MOT_ENTITY;
 2242|      3|    }

_ZN4Ogre9ExceptionC2EiRKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_PKcSB_l:
   43|    986|        line( lin ),
   44|    986|        typeName(typ),
   45|    986|        description( desc ),
   46|    986|        source( src ),
   47|    986|        file( fil )
   48|    986|    {
   49|    986|        StringStream ss;
   50|       |
   51|    986|        ss << typeName << ": "
   52|    986|           << description
   53|    986|           << " in " << source;
   54|       |
   55|    986|        if( line > 0 )
  ------------------
  |  Branch (55:13): [True: 986, False: 0]
  ------------------
   56|    986|        {
   57|    986|            ss << " at " << file << " (line " << line << ")";
   58|    986|        }
   59|       |
   60|    986|        fullDesc = ss.str();
   61|    986|    }

_ZN4Ogre28ExternalTextureSourceManager12getSingletonEv:
   51|     14|    {  
   52|       |        assert( msSingleton );  return ( *msSingleton );  
   53|     14|    }
_ZN4Ogre28ExternalTextureSourceManagerC2Ev:
   58|      1|    {
   59|      1|        mCurrExternalTextureSource = 0;
   60|      1|    }
_ZN4Ogre28ExternalTextureSourceManager16setCurrentPlugInERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   71|      7|    {
   72|      7|        TextureSystemList::iterator i;
   73|       |            
   74|      7|        for( i = mTextureSystems.begin(); i != mTextureSystems.end(); ++i )
  ------------------
  |  Branch (74:43): [True: 0, False: 7]
  ------------------
   75|      0|        {
   76|      0|            if( i->first == sTexturePlugInType )
  ------------------
  |  Branch (76:17): [True: 0, False: 0]
  ------------------
   77|      0|            {
   78|      0|                mCurrExternalTextureSource = i->second;
   79|      0|                mCurrExternalTextureSource->initialise();   //Now call overridden Init function
   80|      0|                return;
   81|      0|            }
   82|      0|        }
   83|      7|        mCurrExternalTextureSource = 0;
   84|      7|    }

_ZNK4Ogre24FileSystemArchiveFactory7getTypeEv:
  553|      2|    {
  554|      2|        static String name = "FileSystem";
  555|      2|        return name;
  556|      2|    }

_ZN4Ogre10GpuProgramC2EPNS_15ResourceManagerERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEmSB_bPNS_20ManualResourceLoaderE:
   98|  4.43k|        : Resource(creator, name, handle, group, isManual, loader), mType(GPT_VERTEX_PROGRAM), mLoadFromFile(true),
   99|  4.43k|          mInstancing(false), mSkeletalAnimation(false), mMorphAnimation(false), mVertexTextureFetch(false),
  100|  4.43k|          mNeedsAdjacencyInfo(false), mCompileError(false), mLoadedManualNamedConstants(false), mPoseAnimation(0)
  101|  4.43k|    {
  102|  4.43k|        createParameterMappingStructures();
  103|  4.43k|    }
_ZN4Ogre10GpuProgram7setTypeENS_14GpuProgramTypeE:
  106|  4.43k|    {
  107|  4.43k|        mType = t;
  108|  4.43k|    }
_ZN4Ogre10GpuProgram13setSyntaxCodeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  111|  4.43k|    {
  112|  4.43k|        mSyntaxCode = syntax;
  113|  4.43k|    }
_ZN4Ogre10GpuProgram13setSourceFileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  116|  3.12k|    {
  117|  3.12k|        OgreAssert(!filename.empty(), "invalid filename");
  ------------------
  |  Branch (117:9): [True: 0, False: 3.12k]
  ------------------
  118|       |
  119|  3.12k|        mFilename = filename;
  120|  3.12k|        mSource.clear();
  121|  3.12k|        mLoadFromFile = true;
  122|  3.12k|        mCompileError = false;
  123|  3.12k|    }
_ZN4Ogre10GpuProgram32createParameterMappingStructuresEb:
  261|  4.43k|    {
  262|  4.43k|        createLogicalParameterMappingStructures(recreateIfExists);
  263|  4.43k|        createNamedParameterMappingStructures(recreateIfExists);
  264|  4.43k|    }
_ZN4Ogre10GpuProgram39createLogicalParameterMappingStructuresEb:
  267|  4.43k|    {
  268|  4.43k|        if (recreateIfExists || !mLogicalToPhysical)
  ------------------
  |  Branch (268:13): [True: 4.43k, False: 0]
  |  Branch (268:33): [True: 0, False: 0]
  ------------------
  269|  4.43k|            mLogicalToPhysical = std::make_shared<GpuLogicalBufferStruct>();
  270|  4.43k|    }
_ZN4Ogre10GpuProgram37createNamedParameterMappingStructuresEb:
  273|  4.43k|    {
  274|  4.43k|        if (recreateIfExists || !mConstantDefs)
  ------------------
  |  Branch (274:13): [True: 4.43k, False: 0]
  |  Branch (274:33): [True: 0, False: 0]
  ------------------
  275|  4.43k|            mConstantDefs = std::make_shared<GpuNamedConstants>();
  276|  4.43k|    }
_ZN4Ogre10GpuProgram16createParametersEv:
  310|  2.96k|    {
  311|       |        // Default implementation simply returns standard parameters.
  312|  2.96k|        GpuProgramParametersSharedPtr ret =
  313|  2.96k|            GpuProgramManager::getSingleton().createParameters();
  314|       |
  315|       |
  316|       |        // optionally load manually supplied named constants
  317|  2.96k|        if (!mManualNamedConstantsFile.empty() && !mLoadedManualNamedConstants)
  ------------------
  |  Branch (317:13): [True: 0, False: 2.96k]
  |  Branch (317:51): [True: 0, False: 0]
  ------------------
  318|      0|        {
  319|      0|            try
  320|      0|            {
  321|      0|                GpuNamedConstants namedConstants;
  322|      0|                DataStreamPtr stream =
  323|      0|                    ResourceGroupManager::getSingleton().openResource(
  324|      0|                    mManualNamedConstantsFile, mGroup, this);
  325|      0|                namedConstants.load(stream);
  326|      0|                setManualNamedConstants(namedConstants);
  327|      0|            }
  328|      0|            catch(const Exception& e)
  329|      0|            {
  330|      0|                LogManager::getSingleton().stream() <<
  331|      0|                    "Unable to load manual named constants for GpuProgram " << mName <<
  332|      0|                    ": " << e.getDescription();
  333|      0|            }
  334|      0|            mLoadedManualNamedConstants = true;
  335|      0|        }
  336|       |
  337|       |
  338|       |        // set up named parameters, if any
  339|  2.96k|        if (mConstantDefs && !mConstantDefs->map.empty())
  ------------------
  |  Branch (339:13): [True: 2.96k, False: 0]
  |  Branch (339:30): [True: 0, False: 2.96k]
  ------------------
  340|      0|        {
  341|      0|            ret->_setNamedConstants(mConstantDefs);
  342|      0|        }
  343|       |        // link shared logical / physical map for low-level use
  344|  2.96k|        ret->_setLogicalIndexes(mLogicalToPhysical);
  345|       |
  346|       |        // Copy in default parameters if present
  347|  2.96k|        if (mDefaultParams)
  ------------------
  |  Branch (347:13): [True: 0, False: 2.96k]
  ------------------
  348|      0|            ret->copyConstantsFrom(*(mDefaultParams.get()));
  349|       |
  350|  2.96k|        return ret;
  351|  2.96k|    }
_ZN4Ogre10GpuProgram18getProgramTypeNameENS_14GpuProgramTypeE:
  363|     13|    {
  364|     13|        switch (programType)
  365|     13|        {
  366|      3|        case GPT_VERTEX_PROGRAM:
  ------------------
  |  Branch (366:9): [True: 3, False: 10]
  ------------------
  367|      3|            return "vertex";
  368|      1|        case GPT_GEOMETRY_PROGRAM:
  ------------------
  |  Branch (368:9): [True: 1, False: 12]
  ------------------
  369|      1|            return "geometry";
  370|      5|        case GPT_FRAGMENT_PROGRAM:
  ------------------
  |  Branch (370:9): [True: 5, False: 8]
  ------------------
  371|      5|            return "fragment";
  372|      1|        case GPT_DOMAIN_PROGRAM:
  ------------------
  |  Branch (372:9): [True: 1, False: 12]
  ------------------
  373|      1|            return "domain";
  374|      1|        case GPT_HULL_PROGRAM:
  ------------------
  |  Branch (374:9): [True: 1, False: 12]
  ------------------
  375|      1|            return "hull";
  376|      1|        case GPT_COMPUTE_PROGRAM:
  ------------------
  |  Branch (376:9): [True: 1, False: 12]
  ------------------
  377|      1|            return "compute";
  378|      1|        case GPT_MESH_PROGRAM:
  ------------------
  |  Branch (378:9): [True: 1, False: 12]
  ------------------
  379|      1|            return "mesh";
  380|      0|        case GPT_TASK_PROGRAM:
  ------------------
  |  Branch (380:9): [True: 0, False: 13]
  ------------------
  381|      0|            return "task";
  382|      0|        default:
  ------------------
  |  Branch (382:9): [True: 0, False: 13]
  ------------------
  383|       |            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
  384|     13|                "Unexpected GPU program type",
  385|     13|                "GpuProgram::GetName");
  386|     13|        }
  387|     13|    }
_ZN4Ogre10GpuProgram24setupBaseParamDictionaryEv:
  390|      1|    {
  391|      1|        ParamDictionary* dict = getParamDictionary();
  392|       |
  393|      1|        dict->addParameter(
  394|      1|            ParameterDef("type", "'vertex_program', 'geometry_program', 'fragment_program', 'hull_program', 'domain_program', 'compute_program'",
  395|      1|                         PT_STRING), &msTypeCmd);
  396|      1|        dict->addParameter(
  397|      1|            ParameterDef("syntax", "Syntax code, e.g. vs_1_1", PT_STRING), &msSyntaxCmd);
  398|      1|        dict->addParameter("includes_instancing", &msInstancingCmd);
  399|      1|        dict->addParameter(
  400|      1|            ParameterDef("includes_skeletal_animation",
  401|      1|                         "Whether this vertex program includes skeletal animation", PT_BOOL),
  402|      1|            &msSkeletalCmd);
  403|      1|        dict->addParameter(
  404|      1|            ParameterDef("includes_morph_animation",
  405|      1|                         "Whether this vertex program includes morph animation", PT_BOOL),
  406|      1|            &msMorphCmd);
  407|      1|        dict->addParameter(
  408|      1|            ParameterDef("includes_pose_animation",
  409|      1|                         "The number of poses this vertex program supports for pose animation", PT_INT),
  410|      1|            &msPoseCmd);
  411|      1|        dict->addParameter(
  412|      1|            ParameterDef("uses_vertex_texture_fetch",
  413|      1|                         "Whether this vertex program requires vertex texture fetch support.", PT_BOOL),
  414|      1|            &msVTFCmd);
  415|      1|        dict->addParameter(
  416|      1|            ParameterDef("manual_named_constants",
  417|      1|                         "File containing named parameter mappings for low-level programs.", PT_BOOL),
  418|      1|            &msManNamedConstsFileCmd);
  419|      1|    }

_ZN4Ogre17GpuProgramManager12getSingletonEv:
  118|  36.0k|    {  
  119|       |        assert( msSingleton );  return ( *msSingleton );  
  120|  36.0k|    }
_ZNK4Ogre17GpuProgramManager9getByNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  123|  23.1k|    {
  124|  23.1k|        return static_pointer_cast<GpuProgram>(getResourceByName(name, group));
  125|  23.1k|    }
_ZN4Ogre17GpuProgramManagerC2Ev:
  128|      1|    {
  129|       |        // Loading order
  130|      1|        mLoadOrder = 50.0f;
  131|       |        // Resource type
  132|      1|        mResourceType = "GpuProgram";
  133|      1|        mSaveMicrocodesToCache = false;
  134|      1|        mCacheDirty = false;
  135|       |
  136|      1|        mNullFactory = std::make_unique<NullProgramFactory>();
  137|      1|        addFactory(mNullFactory.get());
  138|      1|        mUnifiedFactory = std::make_unique<UnifiedHighLevelGpuProgramFactory>();
  139|      1|        addFactory(mUnifiedFactory.get());
  140|       |
  141|      1|        ResourceGroupManager::getSingleton()._registerResourceManager(mResourceType, this);
  142|      1|    }
_ZN4Ogre17GpuProgramManager6createERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_NS_14GpuProgramTypeES9_bPNS_20ManualResourceLoaderE:
  188|  4.43k|    {
  189|  4.43k|        auto prg = getFactory(syntaxCode)->create(this, name, getNextHandle(), group, isManual, loader);
  190|  4.43k|        prg->setType(gptype);
  191|  4.43k|        prg->setSyntaxCode(syntaxCode);
  192|       |
  193|  4.43k|        ResourcePtr ret(prg);
  194|  4.43k|        addImpl(ret);
  195|       |        // Tell resource group manager
  196|  4.43k|        if(ret)
  ------------------
  |  Branch (196:12): [True: 4.31k, False: 118]
  ------------------
  197|  4.31k|            ResourceGroupManager::getSingleton()._notifyResourceCreated(ret);
  198|  4.43k|        return static_pointer_cast<GpuProgram>(ret);
  199|  4.43k|    }
_ZN4Ogre17GpuProgramManager22createSharedParametersERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  239|     84|    {
  240|     84|        if (mSharedParametersMap.find(name) != mSharedParametersMap.end())
  ------------------
  |  Branch (240:13): [True: 14, False: 70]
  ------------------
  241|     14|        {
  242|     14|            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, 
  243|     14|                "The shared parameter set '" + name + "' already exists!", 
  244|     14|                "GpuProgramManager::createSharedParameters");
  245|     14|        }
  246|     70|        GpuSharedParametersPtr ret(OGRE_NEW GpuSharedParameters(name));
  247|     70|        mSharedParametersMap[name] = ret;
  248|     70|        return ret;
  249|     84|    }
_ZN4Ogre17GpuProgramManager10addFactoryEPNS_17GpuProgramFactoryE:
  430|      2|    {
  431|       |        // deliberately allow later plugins to override earlier ones
  432|      2|        mFactories[factory->getLanguage()] = factory;
  433|      2|    }
_ZN4Ogre17GpuProgramManager10getFactoryERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  447|  4.43k|    {
  448|  4.43k|        FactoryMap::iterator i = mFactories.find(language);
  449|       |
  450|  4.43k|        if (i == mFactories.end())
  ------------------
  |  Branch (450:13): [True: 3.62k, False: 806]
  ------------------
  451|  3.62k|        {
  452|       |            // use the null factory to create programs that will never be supported
  453|  3.62k|            i = mFactories.find(sNullLang);
  454|  3.62k|        }
  455|  4.43k|        return i->second;
  456|  4.43k|    }
_ZNK4Ogre17GpuProgramManager19isLanguageSupportedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  459|  6.84k|    {
  460|  6.84k|        return mFactories.find(lang) != mFactories.end();
  461|  6.84k|    }
OgreGpuProgramManager.cpp:_ZN4Ogre12_GLOBAL__N_118NullProgramFactoryC2Ev:
   73|      1|        NullProgramFactory() {}
OgreGpuProgramManager.cpp:_ZNK4Ogre12_GLOBAL__N_118NullProgramFactory11getLanguageEv:
   77|      1|        {
   78|      1|            return sNullLang;
   79|      1|        }
OgreGpuProgramManager.cpp:_ZN4Ogre12_GLOBAL__N_118NullProgramFactory6createEPNS_15ResourceManagerERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEmSC_bPNS_20ManualResourceLoaderE:
   83|  3.62k|        {
   84|       |            return OGRE_NEW NullProgram(creator, name, handle, group, isManual, loader);
   85|  3.62k|        }
OgreGpuProgramManager.cpp:_ZN4Ogre12_GLOBAL__N_111NullProgramC2EPNS_15ResourceManagerERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEmSC_bPNS_20ManualResourceLoaderE:
   53|  3.62k|            : GpuProgram(creator, name, handle, group, isManual, loader){}
OgreGpuProgramManager.cpp:_ZNK4Ogre12_GLOBAL__N_111NullProgram11isSupportedEv:
   56|  17.6k|        bool isSupported(void) const override { return false; }

_ZN4Ogre17GpuNamedConstantsC2Ev:
  201|  4.50k|    GpuNamedConstants::GpuNamedConstants() : bufferSize(0), registerCount(0) {}
_ZN4Ogre17GpuNamedConstantsD2Ev:
  202|  4.43k|    GpuNamedConstants::~GpuNamedConstants() {}
_ZN4Ogre22GpuLogicalBufferStructC2Ev:
  204|  4.43k|    GpuLogicalBufferStruct::GpuLogicalBufferStruct() : bufferSize(0) {}
_ZN4Ogre22GpuLogicalBufferStructD2Ev:
  205|  4.43k|    GpuLogicalBufferStruct::~GpuLogicalBufferStruct() {}
_ZN4Ogre19GpuSharedParametersC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  329|     70|        :mName(name)
  330|     70|        , mVersion(0), mOffset(0), mDirty(false)
  331|     70|    {
  332|       |
  333|     70|    }
_ZN4Ogre19GpuSharedParameters21addConstantDefinitionERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_15GpuConstantTypeEj:
  346|     26|    {
  347|     26|        if (mNamedConstants.map.find(name) != mNamedConstants.map.end())
  ------------------
  |  Branch (347:13): [True: 0, False: 26]
  ------------------
  348|      0|        {
  349|      0|            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
  350|      0|                        "Constant entry with name '" + name + "' already exists. ",
  351|      0|                        "GpuSharedParameters::addConstantDefinition");
  352|      0|        }
  353|     26|        GpuConstantDefinition def;
  354|     26|        def.arraySize = arraySize;
  355|     26|        def.constType = constType;
  356|       |
  357|       |		// here, we do not consider padding, but rather alignment
  358|     26|        def.elementSize = GpuConstantDefinition::getElementSize(constType, false);
  359|       |
  360|       |		// we try to adhere to GLSL std140 packing rules
  361|       |		// handle alignment requirements
  362|     26|        size_t align_size = std::min<size_t>(def.elementSize == 3 ? 4 : def.elementSize, 4); // vec3 is 16 byte aligned, which is max
  ------------------
  |  Branch (362:46): [True: 3, False: 23]
  ------------------
  363|     26|        align_size *= 4; // bytes
  364|       |
  365|     26|        size_t nextAlignedOffset = ((mOffset + align_size - 1) / align_size) * align_size;
  366|       |
  367|       |        // abuse logical index to store offset
  368|     26|        if (mOffset + align_size > nextAlignedOffset)
  ------------------
  |  Branch (368:13): [True: 26, False: 0]
  ------------------
  369|     26|        {
  370|     26|            def.logicalIndex = nextAlignedOffset;
  371|     26|        }
  372|      0|        else
  373|      0|        {
  374|      0|            def.logicalIndex = mOffset;
  375|      0|        }
  376|       |
  377|     26|        mOffset = def.logicalIndex + (def.constType == GCT_MATRIX_4X3 ? 16 : def.elementSize) * 4; // mat4x3 have a size of 64 bytes
  ------------------
  |  Branch (377:39): [True: 0, False: 26]
  ------------------
  378|       |
  379|     26|        def.variability = (uint16)GPV_GLOBAL;
  380|       |
  381|     26|        if (def.isFloat())
  ------------------
  |  Branch (381:13): [True: 6, False: 20]
  ------------------
  382|      6|        {
  383|      6|            def.physicalIndex = mConstants.size();
  384|      6|            mConstants.resize(mConstants.size() + def.arraySize * def.elementSize*4);
  385|      6|        }
  386|     20|        else if (def.isDouble())
  ------------------
  |  Branch (386:18): [True: 0, False: 20]
  ------------------
  387|      0|        {
  388|      0|            def.physicalIndex = mConstants.size();
  389|      0|            mConstants.resize(mConstants.size() + def.arraySize * def.elementSize*8);
  390|      0|        }
  391|     20|        else if (def.isInt() || def.isUnsignedInt() || def.isBool())
  ------------------
  |  Branch (391:18): [True: 4, False: 16]
  |  Branch (391:33): [True: 16, False: 0]
  |  Branch (391:56): [True: 0, False: 0]
  ------------------
  392|     20|        {
  393|     20|            def.physicalIndex = mConstants.size();
  394|     20|            mConstants.resize(mConstants.size() + def.arraySize * def.elementSize*4);
  395|     20|        }
  396|      0|        else 
  397|      0|        {
  398|       |            //FIXME Is this the right exception type?
  399|      0|            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
  400|      0|                        "Constant entry with name '" + name + "' is not a known type.",
  401|      0|                        "GpuSharedParameters::addConstantDefinition");
  402|      0|        }
  403|       |
  404|     26|        mNamedConstants.map[name] = def;
  405|       |
  406|     26|        ++mVersion;
  407|     26|    }
_ZN4Ogre19GpuSharedParameters15setAutoConstantERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_20GpuProgramParameters16AutoConstantTypeE:
  409|      2|    {
  410|      2|        auto& def = mNamedConstants.map[name];
  411|      2|        mAutoConstants.push_back({def.physicalIndex, acType, def.arraySize, def.elementSize});
  412|       |        // no version increment, as this is not a change to the buffer layout
  413|      2|    }
_ZN4Ogre19GpuSharedParameters16setNamedConstantERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKfj:
  573|      5|    {
  574|      5|        _setNamedConstant(name, val, count);
  575|      5|    }
_ZN4Ogre19GpuSharedParameters16setNamedConstantERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKij:
  583|      4|    {
  584|      4|        _setNamedConstant(name, val, count);
  585|      4|    }
_ZN4Ogre19GpuSharedParameters16setNamedConstantERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKjj:
  588|      9|    {
  589|      9|        _setNamedConstant(name, val, count);
  590|      9|    }
_ZN4Ogre19GpuSharedParameters10_markDirtyEv:
  598|     18|    {
  599|     18|        mDirty = true;
  600|     18|    }
_ZN4Ogre20GpuProgramParametersC2Ev:
  707|  3.26k|        mCombinedVariability(GPV_GLOBAL)
  708|  3.26k|        , mTransposeMatrices(false)
  709|  3.26k|        , mIgnoreMissingParams(false)
  710|  3.26k|        , mActivePassIterationIndex(std::numeric_limits<size_t>::max())
  711|  3.26k|        , mUseLinearColours(false)
  712|  3.26k|    {
  713|  3.26k|        static_assert((sizeof(AutoConstantDictionary) / sizeof(AutoConstantDefinition) - 5) == ACT_FROXEL_RECORDS,
  714|  3.26k|                      "AutoConstantDictionary out of sync");
  715|  3.26k|    }
_ZN4Ogre20GpuProgramParametersD2Ev:
  716|  3.26k|    GpuProgramParameters::~GpuProgramParameters() {}
_ZN4Ogre20GpuProgramParameters18_setLogicalIndexesERKNS_9SharedPtrINS_22GpuLogicalBufferStructEEE:
  789|  2.96k|    {
  790|  2.96k|        mLogicalToPhysical = indexMap;
  791|       |
  792|       |        // resize the internal buffers
  793|       |        // Note that these will only contain something after the first parameter
  794|       |        // set has set some parameters
  795|       |
  796|       |        // Size and reset buffer (fill with zero to make comparison later ok)
  797|  2.96k|        if (indexMap && indexMap->bufferSize*4 > mConstants.size())
  ------------------
  |  Branch (797:13): [True: 2.96k, False: 0]
  |  Branch (797:25): [True: 0, False: 2.96k]
  ------------------
  798|      0|        {
  799|      0|            mConstants.insert(mConstants.end(), indexMap->bufferSize * 4 - mConstants.size(), 0);
  800|      0|        }
  801|  2.96k|    }
_ZN4Ogre20GpuProgramParameters30copyMatchingNamedConstantsFromERKS0_:
 2429|  1.81k|    {
 2430|  1.81k|        if (mNamedConstants && source.mNamedConstants)
  ------------------
  |  Branch (2430:13): [True: 0, False: 1.81k]
  |  Branch (2430:32): [True: 0, False: 0]
  ------------------
 2431|      0|        {
 2432|      0|            std::map<size_t, String> srcToDestNamedMap;
 2433|      0|            for (auto& m : source.mNamedConstants->map)
  ------------------
  |  Branch (2433:26): [True: 0, False: 0]
  ------------------
 2434|      0|            {
 2435|      0|                const String& paramName = m.first;
 2436|      0|                const GpuConstantDefinition& olddef = m.second;
 2437|      0|                const GpuConstantDefinition* newdef = _findNamedConstantDefinition(paramName, false);
 2438|      0|                if (newdef)
  ------------------
  |  Branch (2438:21): [True: 0, False: 0]
  ------------------
 2439|      0|                {
 2440|       |                    // Copy data across, based on smallest common definition size
 2441|      0|                    size_t srcsz = olddef.elementSize * olddef.arraySize;
 2442|      0|                    size_t destsz = newdef->elementSize * newdef->arraySize;
 2443|      0|                    size_t sz = std::min(srcsz, destsz);
 2444|      0|                    if (newdef->isFloat() || newdef->isInt() || newdef->isUnsignedInt() || newdef->isBool())
  ------------------
  |  Branch (2444:25): [True: 0, False: 0]
  |  Branch (2444:46): [True: 0, False: 0]
  |  Branch (2444:65): [True: 0, False: 0]
  |  Branch (2444:92): [True: 0, False: 0]
  ------------------
 2445|      0|                    {
 2446|      0|                        OgreAssert(mConstants.size() >= (newdef->physicalIndex + sz * 4), "Invalid physical index or size");
  ------------------
  |  Branch (2446:25): [True: 0, False: 0]
  ------------------
 2447|      0|                        memcpy(getFloatPointer(newdef->physicalIndex),
 2448|      0|                               source.getFloatPointer(olddef.physicalIndex),
 2449|      0|                               sz * 4);
 2450|      0|                    }
 2451|      0|                    else if (newdef->isDouble())
  ------------------
  |  Branch (2451:30): [True: 0, False: 0]
  ------------------
 2452|      0|                    {
 2453|       |
 2454|      0|                        memcpy(getDoublePointer(newdef->physicalIndex),
 2455|      0|                               source.getDoublePointer(olddef.physicalIndex),
 2456|      0|                               sz * sizeof(double));
 2457|      0|                    }
 2458|      0|                    else if (newdef->isSampler())
  ------------------
  |  Branch (2458:30): [True: 0, False: 0]
  ------------------
 2459|      0|                    {
 2460|      0|                        *getRegPointer(newdef->physicalIndex) = *source.getRegPointer(olddef.physicalIndex);
 2461|      0|                    }
 2462|      0|                    else
 2463|      0|                    {
 2464|       |                        //TODO exception handling
 2465|      0|                    }
 2466|       |                    // we'll use this map to resolve autos later
 2467|       |                    // ignore the [0] aliases
 2468|      0|                    if (!StringUtil::endsWith(paramName, "[0]") && source.findAutoConstantEntry(paramName))
  ------------------
  |  Branch (2468:25): [True: 0, False: 0]
  |  Branch (2468:25): [True: 0, False: 0]
  |  Branch (2468:68): [True: 0, False: 0]
  ------------------
 2469|      0|                        srcToDestNamedMap[olddef.physicalIndex] = paramName;
 2470|      0|                }
 2471|      0|            }
 2472|       |
 2473|      0|            for (const auto& autoEntry : source.mAutoConstants)
  ------------------
  |  Branch (2473:40): [True: 0, False: 0]
  ------------------
 2474|      0|            {
 2475|       |                // find dest physical index
 2476|      0|                std::map<size_t, String>::iterator mi = srcToDestNamedMap.find(autoEntry.physicalIndex);
 2477|      0|                if (mi != srcToDestNamedMap.end())
  ------------------
  |  Branch (2477:21): [True: 0, False: 0]
  ------------------
 2478|      0|                {
 2479|      0|                    if (getAutoConstantDefinition(autoEntry.paramType)->dataType == ACDT_REAL)
  ------------------
  |  Branch (2479:25): [True: 0, False: 0]
  ------------------
 2480|      0|                    {
 2481|      0|                        setNamedAutoConstantReal(mi->second, autoEntry.paramType, autoEntry.fData);
 2482|      0|                    }
 2483|      0|                    else
 2484|      0|                    {
 2485|      0|                        setNamedAutoConstant(mi->second, autoEntry.paramType, autoEntry.data);
 2486|      0|                    }
 2487|      0|                }
 2488|       |
 2489|      0|            }
 2490|       |
 2491|       |            // Copy shared param sets
 2492|      0|            for (const auto& usage : source.mSharedParamSets)
  ------------------
  |  Branch (2492:36): [True: 0, False: 0]
  ------------------
 2493|      0|            {
 2494|      0|                if (!isUsingSharedParameters(usage.getName()))
  ------------------
  |  Branch (2494:21): [True: 0, False: 0]
  ------------------
 2495|      0|                {
 2496|      0|                    addSharedParameters(usage.getSharedParams());
 2497|      0|                }
 2498|      0|            }
 2499|      0|        }
 2500|  1.81k|    }
_ZN4Ogre20GpuProgramParameters25getAutoConstantDefinitionERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 2504|     25|    {
 2505|       |        // find a constant definition that matches name by iterating through the
 2506|       |        // constant definition array
 2507|     25|        bool nameFound = false;
 2508|     25|        size_t i = 0;
 2509|     25|        const size_t numDefs = getNumAutoConstantDefinitions();
 2510|  3.66k|        while (!nameFound && (i < numDefs))
  ------------------
  |  Branch (2510:16): [True: 3.66k, False: 2]
  |  Branch (2510:30): [True: 3.64k, False: 23]
  ------------------
 2511|  3.64k|        {
 2512|  3.64k|            if (name == AutoConstantDictionary[i].name)
  ------------------
  |  Branch (2512:17): [True: 2, False: 3.63k]
  ------------------
 2513|      2|                nameFound = true;
 2514|  3.63k|            else
 2515|  3.63k|                ++i;
 2516|  3.64k|        }
 2517|       |
 2518|     25|        if (nameFound)
  ------------------
  |  Branch (2518:13): [True: 2, False: 23]
  ------------------
 2519|      2|            return &AutoConstantDictionary[i];
 2520|     23|        else
 2521|     23|            return 0;
 2522|     25|    }
_ZN4Ogre20GpuProgramParameters29getNumAutoConstantDefinitionsEv:
 2535|     25|    {
 2536|     25|        return sizeof(AutoConstantDictionary)/sizeof(AutoConstantDefinition);
 2537|     25|    }
_ZN4Ogre19GpuSharedParameters17_setNamedConstantIfEEvRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPKT_j:
  563|      5|    {
  564|      5|        GpuConstantDefinitionMap::const_iterator i = mNamedConstants.map.find(name);
  565|      5|        if (i == mNamedConstants.map.end())
  ------------------
  |  Branch (565:13): [True: 0, False: 5]
  ------------------
  566|      0|            return; // ignore
  567|       |
  568|      5|        const GpuConstantDefinition& def = i->second;
  569|      5|        memcpy(&mConstants[def.physicalIndex], val, sizeof(float) * std::min(count, def.elementSize * def.arraySize));
  570|      5|        _markDirty();
  571|      5|    }
_ZN4Ogre19GpuSharedParameters17_setNamedConstantIiEEvRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPKT_j:
  563|      4|    {
  564|      4|        GpuConstantDefinitionMap::const_iterator i = mNamedConstants.map.find(name);
  565|      4|        if (i == mNamedConstants.map.end())
  ------------------
  |  Branch (565:13): [True: 0, False: 4]
  ------------------
  566|      0|            return; // ignore
  567|       |
  568|      4|        const GpuConstantDefinition& def = i->second;
  569|      4|        memcpy(&mConstants[def.physicalIndex], val, sizeof(float) * std::min(count, def.elementSize * def.arraySize));
  570|      4|        _markDirty();
  571|      4|    }
_ZN4Ogre19GpuSharedParameters17_setNamedConstantIjEEvRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPKT_j:
  563|      9|    {
  564|      9|        GpuConstantDefinitionMap::const_iterator i = mNamedConstants.map.find(name);
  565|      9|        if (i == mNamedConstants.map.end())
  ------------------
  |  Branch (565:13): [True: 0, False: 9]
  ------------------
  566|      0|            return; // ignore
  567|       |
  568|      9|        const GpuConstantDefinition& def = i->second;
  569|      9|        memcpy(&mConstants[def.physicalIndex], val, sizeof(float) * std::min(count, def.elementSize * def.arraySize));
  570|      9|        _markDirty();
  571|      9|    }

_ZN4Ogre15GpuProgramUsageC2ENS_14GpuProgramTypeEPNS_4PassE:
   36|  1.45k|        mParent(parent), mProgram(), mRecreateParams(false),mType(gptype)
   37|  1.45k|    {
   38|  1.45k|    }
_ZN4Ogre15GpuProgramUsageD2Ev:
   51|  1.45k|    {
   52|  1.45k|        if (mProgram)
  ------------------
  |  Branch (52:13): [True: 1.45k, False: 0]
  ------------------
   53|  1.45k|            mProgram->removeListener(this);
   54|  1.45k|    }
_ZN4Ogre15GpuProgramUsage17_getProgramByNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_NS_14GpuProgramTypeE:
   59|    497|    {
   60|    497|        GpuProgramPtr program =
   61|    497|            GpuProgramManager::getSingleton().getByName(name, group);
   62|       |
   63|       |        //Look again without the group if not found
   64|    497|        if (!program)
  ------------------
  |  Branch (64:13): [True: 13, False: 484]
  ------------------
   65|     13|            program = GpuProgramManager::getSingleton().getByName(
   66|     13|                name, ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME);
   67|       |
   68|    497|        if (!program)
  ------------------
  |  Branch (68:13): [True: 13, False: 484]
  ------------------
   69|     13|        {
   70|     13|            String progType = GpuProgram::getProgramTypeName(type);
   71|     13|            OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND,
   72|     13|                        "Unable to locate " + progType + " program called " + name);
   73|     13|        }
   74|       |
   75|    484|        return program;
   76|    497|    }
_ZN4Ogre15GpuProgramUsage10setProgramERKNS_9SharedPtrINS_10GpuProgramEEEb:
  100|  3.26k|    {
  101|  3.26k|        if (mProgram)
  ------------------
  |  Branch (101:13): [True: 1.81k, False: 1.45k]
  ------------------
  102|  1.81k|        {
  103|  1.81k|            mProgram->removeListener(this);
  104|  1.81k|            mRecreateParams = true;
  105|  1.81k|        }
  106|       |
  107|  3.26k|        mProgram = prog;
  108|       |
  109|       |        // Reset parameters
  110|  3.26k|        if (resetParams || !mParameters || mRecreateParams)
  ------------------
  |  Branch (110:13): [True: 3.26k, False: 0]
  |  Branch (110:28): [True: 0, False: 0]
  |  Branch (110:44): [True: 0, False: 0]
  ------------------
  111|  3.26k|        {
  112|  3.26k|            recreateParameters();
  113|  3.26k|        }
  114|       |
  115|       |        // Listen in on reload events so we can regenerate params
  116|  3.26k|        mProgram->addListener(this);
  117|  3.26k|    }
_ZN4Ogre15GpuProgramUsage18recreateParametersEv:
  170|  3.26k|    {
  171|       |        // Keep a reference to old ones to copy
  172|  3.26k|        GpuProgramParametersSharedPtr savedParams = mParameters;
  173|       |
  174|       |        // Create new params
  175|  3.26k|        mParameters = mProgram->createParameters();
  176|       |
  177|       |        // Copy old (matching) values across
  178|       |        // Don't use copyConstantsFrom since program may be different
  179|  3.26k|        if (savedParams)
  ------------------
  |  Branch (179:13): [True: 1.81k, False: 1.45k]
  ------------------
  180|  1.81k|            mParameters->copyMatchingNamedConstantsFrom(*savedParams.get());
  181|       |
  182|  3.26k|        mRecreateParams = false;
  183|       |
  184|  3.26k|    }

_ZNK4Ogre12LightFactory7getTypeEv:
  874|      3|    {
  875|      3|        return MOT_LIGHT;
  876|      3|    }

_ZN4Ogre11LodStrategyC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   35|      4|        : mName(name)
   36|      4|    { }

_ZN4Ogre18LodStrategyManager12getSingletonEv:
   43|  13.1k|    {
   44|       |        assert( msSingleton );  return ( *msSingleton );
   45|  13.1k|    }
_ZN4Ogre18LodStrategyManagerC2Ev:
   48|      1|    {
   49|       |        // Add distance strategies for bounding box and bounding sphere
   50|      1|        LodStrategy *strategy = OGRE_NEW DistanceLodBoxStrategy();
   51|      1|        addStrategy(strategy);
   52|      1|        strategy = OGRE_NEW DistanceLodSphereStrategy();
   53|      1|        addStrategy(strategy);
   54|       |
   55|       |        // Set the default strategy to distance_sphere
   56|      1|        setDefaultStrategy(strategy);
   57|       |
   58|       |        // Add pixel-count strategies (internally based on bounding sphere)
   59|      1|        strategy = OGRE_NEW AbsolutePixelCountLodStrategy();
   60|      1|        addStrategy(strategy);
   61|       |        strategy = OGRE_NEW ScreenRatioPixelCountLodStrategy();
   62|      1|        addStrategy(strategy);
   63|      1|    }
_ZN4Ogre18LodStrategyManager11addStrategyEPNS_11LodStrategyE:
   72|      4|    {
   73|       |        // Check for invalid strategy name
   74|      4|        if (strategy->getName() == "default")
  ------------------
  |  Branch (74:13): [True: 0, False: 4]
  ------------------
   75|      4|            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Lod strategy name must not be \"default\".", "LodStrategyManager::addStrategy");
   76|       |
   77|       |        // Insert the strategy into the map with its name as the key
   78|      4|        mStrategies.insert(std::make_pair(strategy->getName(), strategy));
   79|      4|    }
_ZN4Ogre18LodStrategyManager11getStrategyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  110|     63|    {
  111|       |        // If name is "default", return the default strategy instead of performing a lookup
  112|     63|        if (name == "default") {
  ------------------
  |  Branch (112:13): [True: 0, False: 63]
  ------------------
  113|      0|            return getDefaultStrategy();
  114|     63|        } else if (name == "Distance") {
  ------------------
  |  Branch (114:20): [True: 0, False: 63]
  ------------------
  115|      0|            return getStrategy("distance_box"); // Backward compatibility for loading old meshes.
  116|     63|        } else if (name == "PixelCount") {
  ------------------
  |  Branch (116:20): [True: 0, False: 63]
  ------------------
  117|      0|            return getStrategy("pixel_count"); // Backward compatibility for loading old meshes.
  118|      0|        }
  119|       |        // Find strategy with specified name
  120|     63|        StrategyMap::iterator it = mStrategies.find(name);
  121|       |
  122|       |        // If not found, return null
  123|     63|        if (it == mStrategies.end())
  ------------------
  |  Branch (123:13): [True: 63, False: 0]
  ------------------
  124|     63|            return 0;
  125|       |
  126|       |        // Otherwise, return the strategy
  127|      0|        return it->second;
  128|     63|    }
_ZN4Ogre18LodStrategyManager18setDefaultStrategyEPNS_11LodStrategyE:
  131|      1|    {
  132|      1|        mDefaultStrategy = strategy;
  133|      1|    }
_ZN4Ogre18LodStrategyManager18getDefaultStrategyEv:
  142|  13.1k|    {
  143|  13.1k|        return mDefaultStrategy;
  144|  13.1k|    }

_ZN4Ogre3LogC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEbb:
   52|      1|        mLogLevel(LML_NORMAL), mDebugOut(debuggerOutput),
   53|      1|        mSuppressFile(suppressFile), mTimeStamp(true), mLogName(name), mTermHasColours(false)
   54|      1|    {
   55|      1|        if (!mSuppressFile)
  ------------------
  |  Branch (55:13): [True: 1, False: 0]
  ------------------
   56|      1|        {
   57|      1|            mLog.open(name.c_str());
   58|       |
   59|       |#if (OGRE_PLATFORM == OGRE_PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WINRT) && _WIN32_WINNT >= _WIN32_WINNT_VISTA
   60|       |            // Register log file to be collected by Windows Error Reporting
   61|       |            const int utf16Length = ::MultiByteToWideChar(CP_ACP, 0, name.c_str(), (int)name.size(), NULL, 0);
   62|       |            if(utf16Length > 0)
   63|       |            {
   64|       |                std::wstring wname;
   65|       |                wname.resize(utf16Length);
   66|       |                if (0 != ::MultiByteToWideChar(CP_ACP, 0, name.c_str(), (int)name.size(), &wname[0], (int)wname.size()))
   67|       |                    WerRegisterFile(wname.c_str(), WerRegFileTypeOther, WER_FILE_ANONYMOUS_DATA);
   68|       |            }
   69|       |#endif
   70|      1|        }
   71|       |
   72|      1|#if OGRE_PLATFORM != OGRE_PLATFORM_WINRT
   73|      1|        char* val = getenv("OGRE_MIN_LOGLEVEL");
   74|      1|        int min_lml;
   75|      1|        if(val && StringConverter::parse(val, min_lml))
  ------------------
  |  Branch (75:12): [True: 0, False: 1]
  |  Branch (75:12): [True: 0, False: 1]
  |  Branch (75:19): [True: 0, False: 0]
  ------------------
   76|      0|            setMinLogLevel(LogMessageLevel(min_lml));
   77|       |
   78|      1|        if(mDebugOut)
  ------------------
  |  Branch (78:12): [True: 0, False: 1]
  ------------------
   79|      0|        {
   80|      0|            val = getenv("TERM");
   81|      0|            mTermHasColours = val && String(val).find("xterm") != String::npos;
  ------------------
  |  Branch (81:31): [True: 0, False: 0]
  |  Branch (81:38): [True: 0, False: 0]
  ------------------
   82|      0|        }
   83|      1|#endif
   84|      1|    }
_ZN4Ogre3Log10logMessageERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_15LogMessageLevelEb:
   97|  26.8k|    {
   98|  26.8k|        OGRE_LOCK_AUTO_MUTEX;
   99|  26.8k|        if (lml >= mLogLevel)
  ------------------
  |  Branch (99:13): [True: 3.63k, False: 23.2k]
  ------------------
  100|  3.63k|        {
  101|  3.63k|            bool skipThisMessage = false;
  102|  3.63k|            for(auto & l : mListeners)
  ------------------
  |  Branch (102:26): [True: 0, False: 3.63k]
  ------------------
  103|      0|                l->messageLogged( message, lml, maskDebug, mLogName, skipThisMessage);
  104|       |            
  105|  3.63k|            if (!skipThisMessage)
  ------------------
  |  Branch (105:17): [True: 3.63k, False: 0]
  ------------------
  106|  3.63k|            {
  107|  3.63k|                if (mDebugOut && !maskDebug)
  ------------------
  |  Branch (107:21): [True: 0, False: 3.63k]
  |  Branch (107:34): [True: 0, False: 0]
  ------------------
  108|      0|                {
  109|       |#    if (OGRE_PLATFORM == OGRE_PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WINRT) && OGRE_DEBUG_MODE
  110|       |                    OutputDebugStringA("Ogre: ");
  111|       |                    OutputDebugStringA(message.c_str());
  112|       |                    OutputDebugStringA("\n");
  113|       |#    endif
  114|       |
  115|      0|                    std::ostream& os = int(lml) >= int(LML_WARNING) ? std::cerr : std::cout;
  ------------------
  |  Branch (115:40): [True: 0, False: 0]
  ------------------
  116|       |
  117|      0|                    if(mTermHasColours) {
  ------------------
  |  Branch (117:24): [True: 0, False: 0]
  ------------------
  118|      0|                        if(lml == LML_WARNING)
  ------------------
  |  Branch (118:28): [True: 0, False: 0]
  ------------------
  119|      0|                            os << YELLOW;
  120|      0|                        if(lml == LML_CRITICAL)
  ------------------
  |  Branch (120:28): [True: 0, False: 0]
  ------------------
  121|      0|                            os << RED;
  122|      0|                    }
  123|       |
  124|      0|                    os << message;
  125|       |
  126|      0|                    if(mTermHasColours) {
  ------------------
  |  Branch (126:24): [True: 0, False: 0]
  ------------------
  127|      0|                        os << RESET;
  128|      0|                    }
  129|       |
  130|      0|                    os << std::endl;
  131|      0|                }
  132|       |
  133|       |                // Write time into log
  134|  3.63k|                if (!mSuppressFile)
  ------------------
  |  Branch (134:21): [True: 3.63k, False: 0]
  ------------------
  135|  3.63k|                {
  136|  3.63k|                    if (mTimeStamp)
  ------------------
  |  Branch (136:25): [True: 3.63k, False: 0]
  ------------------
  137|  3.63k|                    {
  138|  3.63k|                        auto t = std::time(nullptr);
  139|  3.63k|                        auto pTime = std::localtime(&t);
  140|  3.63k|                        mLog << std::put_time(pTime, "%H:%M:%S: ");
  141|  3.63k|                    }
  142|  3.63k|                    mLog << message << std::endl;
  143|       |
  144|       |                    // Flush stcmdream to ensure it is written (incase of a crash, we need log to be up to date)
  145|  3.63k|                    mLog.flush();
  146|  3.63k|                }
  147|  3.63k|            }
  148|  3.63k|        }
  149|  26.8k|    }
_ZN4Ogre3Log14setMinLogLevelENS_15LogMessageLevelE:
  173|      1|    {
  174|      1|        OGRE_LOCK_AUTO_MUTEX;
  175|      1|        mLogLevel = lml;
  176|      1|    }
_ZN4Ogre3Log6streamENS_15LogMessageLevelEb:
  196|  3.63k|    {
  197|  3.63k|        return Stream(this, lml, maskDebug);
  198|       |
  199|  3.63k|    }

_ZN4Ogre10LogManager15getSingletonPtrEv:
   35|      1|    {
   36|      1|        return msSingleton;
   37|      1|    }
_ZN4Ogre10LogManager12getSingletonEv:
   39|  26.8k|    {  
   40|       |        assert( msSingleton );  return ( *msSingleton );  
   41|  26.8k|    }
_ZN4Ogre10LogManagerC2Ev:
   44|      1|    {
   45|       |        mDefaultLog = NULL;
   46|      1|    }
_ZN4Ogre10LogManager9createLogERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEbbb:
   61|      1|    {
   62|      1|        OGRE_LOCK_AUTO_MUTEX;
   63|       |
   64|      1|        Log* newLog = OGRE_NEW Log(name, debuggerOutput, suppressFileOutput);
   65|       |
   66|      1|        if( !mDefaultLog || defaultLog )
  ------------------
  |  Branch (66:13): [True: 1, False: 0]
  |  Branch (66:29): [True: 0, False: 0]
  ------------------
   67|      1|        {
   68|      1|            mDefaultLog = newLog;
   69|      1|        }
   70|       |
   71|      1|        mLogs.emplace(name, newLog);
   72|       |
   73|      1|        return newLog;
   74|      1|    }
_ZN4Ogre10LogManager10logMessageERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_15LogMessageLevelEb:
  125|  23.2k|    {
  126|  23.2k|        OGRE_LOCK_AUTO_MUTEX;
  127|  23.2k|        if (mDefaultLog)
  ------------------
  |  Branch (127:13): [True: 23.2k, False: 0]
  ------------------
  128|  23.2k|        {
  129|  23.2k|            mDefaultLog->logMessage(message, lml, maskDebug);
  130|  23.2k|        }
  131|  23.2k|    }
_ZN4Ogre10LogManager8logErrorERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
  134|  3.63k|    {
  135|  3.63k|        stream(LML_CRITICAL, maskDebug) << "Error: " << message;
  136|  3.63k|    }
_ZN4Ogre10LogManager14setMinLogLevelENS_15LogMessageLevelE:
  155|      1|    {
  156|      1|        OGRE_LOCK_AUTO_MUTEX;
  157|      1|        if (mDefaultLog)
  ------------------
  |  Branch (157:13): [True: 1, False: 0]
  ------------------
  158|      1|        {
  159|      1|            mDefaultLog->setMinLogLevel(lml);
  160|      1|        }
  161|      1|    }
_ZN4Ogre10LogManager6streamENS_15LogMessageLevelEb:
  164|  3.63k|    {
  165|  3.63k|            OGRE_LOCK_AUTO_MUTEX;
  166|  3.63k|        OgreAssert(mDefaultLog, "Default log not found");
  ------------------
  |  Branch (166:9): [True: 0, False: 3.63k]
  ------------------
  167|  3.63k|        return mDefaultLog->stream(lml, maskDebug);
  168|  3.63k|    }

_ZNK4Ogre19ManualObjectFactory7getTypeEv:
  723|      3|    {
  724|      3|        return MOT_MANUAL_OBJECT;
  725|      3|    }

_ZN4Ogre8MaterialC2EPNS_15ResourceManagerERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEmSB_bPNS_20ManualResourceLoaderE:
   39|  13.1k|        :Resource(creator, name, handle, group, false, NULL),
   40|  13.1k|         mReceiveShadows(true),
   41|  13.1k|         mTransparencyCastsShadows(false),
   42|  13.1k|         mCompilationRequired(true)
   43|  13.1k|    {
   44|       |        // Override isManual, not applicable for Material (we always want to call loadImpl)
   45|  13.1k|        if(isManual)
  ------------------
  |  Branch (45:12): [True: 0, False: 13.1k]
  ------------------
   46|      0|        {
   47|      0|            LogManager::getSingleton().logWarning("Material " + name +
   48|      0|                " was requested with isManual=true, but this is not applicable " 
   49|      0|                "for materials; the flag has been reset to false");
   50|      0|        }
   51|       |
   52|       |        // Initialise to default strategy
   53|  13.1k|        mLodStrategy = LodStrategyManager::getSingleton().getDefaultStrategy();
   54|       |
   55|  13.1k|        mLodValues.push_back(0.0f);
   56|       |
   57|  13.1k|        applyDefaults();
   58|       |
   59|       |        /* For consistency with StringInterface, but we don't add any parameters here
   60|       |        That's because the Resource implementation of StringInterface is to
   61|       |        list all the options that need to be set before loading, of which 
   62|       |        we have none as such. Full details can be set through scripts.
   63|       |        */ 
   64|  13.1k|        createParamDictionary("Material");
   65|  13.1k|    }
_ZN4Ogre8MaterialD2Ev:
   68|  13.1k|    {
   69|  13.1k|        removeAllTechniques();
   70|       |        // have to call this here reather than in Resource destructor
   71|       |        // since calling virtual methods in base destructors causes crash
   72|  13.1k|        unload(); 
   73|  13.1k|    }
_ZN4Ogre8MaterialaSERKS0_:
   76|  13.1k|    {
   77|  13.1k|        if (this == &rhs)
  ------------------
  |  Branch (77:13): [True: 0, False: 13.1k]
  ------------------
   78|      0|            return *this;
   79|       |
   80|  13.1k|        Resource::operator=(rhs);
   81|  13.1k|        mReceiveShadows = rhs.mReceiveShadows;
   82|  13.1k|        mTransparencyCastsShadows = rhs.mTransparencyCastsShadows;
   83|       |
   84|       |        // Copy Techniques
   85|  13.1k|        this->removeAllTechniques();
   86|  13.1k|        for(auto *t : rhs.mTechniques)
  ------------------
  |  Branch (86:21): [True: 13.1k, False: 13.1k]
  ------------------
   87|  13.1k|        {
   88|  13.1k|            Technique* tech = this->createTechnique();
   89|  13.1k|            *tech = *t;
   90|  13.1k|            if (t->isSupported())
  ------------------
  |  Branch (90:17): [True: 0, False: 13.1k]
  ------------------
   91|      0|            {
   92|      0|                insertSupportedTechnique(tech);
   93|      0|            }
   94|  13.1k|        }
   95|       |
   96|       |        // Also copy LOD information
   97|  13.1k|        mUserLodValues = rhs.mUserLodValues;
   98|  13.1k|        mLodValues = rhs.mLodValues;
   99|  13.1k|        mLodStrategy = rhs.mLodStrategy;
  100|  13.1k|        mCompilationRequired = rhs.mCompilationRequired;
  101|       |
  102|       |        // creating techniques moves us into unloaded state
  103|       |        // insertSupportedTechnique is equivalent to prepare
  104|  13.1k|        if(rhs.isLoaded())
  ------------------
  |  Branch (104:12): [True: 0, False: 13.1k]
  ------------------
  105|      0|            load();
  106|       |
  107|  13.1k|        return *this;
  108|  13.1k|    }
_ZN4Ogre8Material13applyDefaultsEv:
  217|  13.1k|    {
  218|  13.1k|        MaterialPtr defaults = MaterialManager::getSingleton().getDefaultSettings();
  219|       |
  220|  13.1k|        if (defaults)
  ------------------
  |  Branch (220:13): [True: 13.1k, False: 1]
  ------------------
  221|  13.1k|        {
  222|       |            // save name & handle
  223|  13.1k|            String savedName = mName;
  224|  13.1k|            String savedGroup = mGroup;
  225|  13.1k|            ResourceHandle savedHandle = mHandle;
  226|  13.1k|            *this = *defaults;
  227|       |            // restore name & handle
  228|  13.1k|            mName = savedName;
  229|  13.1k|            mHandle = savedHandle;
  230|  13.1k|            mGroup = savedGroup;
  231|  13.1k|        }
  232|  13.1k|        _notifyNeedsRecompile();
  233|       |
  234|  13.1k|    }
_ZN4Ogre8Material15createTechniqueEv:
  237|  25.4k|    {
  238|       |        Technique *t = OGRE_NEW Technique(this);
  239|  25.4k|        mTechniques.push_back(t);
  240|  25.4k|        _notifyNeedsRecompile();
  241|  25.4k|        return t;
  242|  25.4k|    }
_ZN4Ogre8Material19removeAllTechniquesEv:
  367|  38.8k|    {
  368|  38.8k|        for (auto *t : mTechniques)
  ------------------
  |  Branch (368:22): [True: 25.4k, False: 38.8k]
  ------------------
  369|  25.4k|        {
  370|       |            OGRE_DELETE t;
  371|  25.4k|        }
  372|  38.8k|        mTechniques.clear();
  373|  38.8k|        clearBestTechniqueList();
  374|  38.8k|    }
_ZN4Ogre8Material22clearBestTechniqueListEv:
  437|  38.8k|    {
  438|  38.8k|        mSupportedTechniques.clear();
  439|  38.8k|        mBestTechniquesBySchemeList.clear();
  440|  38.8k|        _notifyNeedsRecompile();
  441|  38.8k|    }
_ZN4Ogre8Material18setLightingEnabledEb:
  493|      1|    void Material::setLightingEnabled(bool enabled) { ALL_TECHNIQUES(setLightingEnabled(enabled)); }
  ------------------
  |  |  443|      1|    #define ALL_TECHNIQUES(fncall) for(auto t : mTechniques) t->fncall
  |  |  ------------------
  |  |  |  Branch (443:47): [True: 1, False: 1]
  |  |  ------------------
  ------------------
_ZN4Ogre8Material21_notifyNeedsRecompileEv:
  534|  93.4k|    {
  535|  93.4k|        mCompilationRequired = true;
  536|       |        // Also need to unload to ensure we loaded any new items
  537|  93.4k|        if (isLoaded()) // needed to stop this being called in 'loading' state
  ------------------
  |  Branch (537:13): [True: 0, False: 93.4k]
  ------------------
  538|      0|            unload();
  539|  93.4k|    }
_ZN4Ogre8Material12setLodLevelsERKNSt3__16vectorIfNS1_9allocatorIfEEEE:
  542|     99|    {
  543|       |        // Square the distances for the internal list
  544|       |        // First, clear and add single zero entry
  545|     99|        mLodValues.clear();
  546|     99|        mUserLodValues.clear();
  547|     99|        mUserLodValues.push_back(0);
  548|     99|        if (mLodStrategy)
  ------------------
  |  Branch (548:13): [True: 99, False: 0]
  ------------------
  549|     99|            mLodValues.push_back(mLodStrategy->getBaseValue());
  550|     99|        for (auto& v : lodValues)
  ------------------
  |  Branch (550:22): [True: 79, False: 99]
  ------------------
  551|     79|        {
  552|     79|            mUserLodValues.push_back(v);
  553|     79|            if (mLodStrategy)
  ------------------
  |  Branch (553:17): [True: 79, False: 0]
  ------------------
  554|     79|                mLodValues.push_back(mLodStrategy->transformUserValue(v));
  555|     79|        }
  556|     99|    }
_ZN4Ogre8Material14setLodStrategyEPNS_11LodStrategyE:
  579|      1|    {
  580|      1|        mLodStrategy = lodStrategy;
  581|       |
  582|      1|        assert(mLodValues.size());
  583|      1|        mLodValues[0] = mLodStrategy->getBaseValue();
  584|       |
  585|       |        // Re-transform all user LOD values (starting at index 1, no need to transform base value)
  586|      1|        for (size_t i = 1; i < mUserLodValues.size(); ++i)
  ------------------
  |  Branch (586:28): [True: 0, False: 1]
  ------------------
  587|      0|            mLodValues[i] = mLodStrategy->transformUserValue(mUserLodValues[i]);
  588|      1|    }

_ZN4Ogre15MaterialManager15getSingletonPtrEv:
   40|  38.5k|    {
   41|  38.5k|        return msSingleton;
   42|  38.5k|    }
_ZN4Ogre15MaterialManager12getSingletonEv:
   44|  66.8k|    {
   45|       |        assert( msSingleton );  return ( *msSingleton );
   46|  66.8k|    }
_ZN4Ogre15MaterialManagerC2Ev:
   50|      1|    {
   51|       |        // Loading order
   52|      1|        mLoadOrder = 100.0f;
   53|       |        // Scripting is supported by this manager
   54|       |
   55|       |        // Resource type
   56|      1|        mResourceType = "Material";
   57|       |
   58|       |        // Register with resource group manager
   59|      1|        ResourceGroupManager::getSingleton()._registerResourceManager(mResourceType, this);
   60|       |
   61|       |        // Default scheme
   62|      1|        mActiveSchemeIndex = 0;
   63|      1|        mActiveSchemeName = MSN_DEFAULT;
   64|      1|        mSchemes[mActiveSchemeName] = 0;
   65|       |
   66|      1|    }
_ZN4Ogre15MaterialManager10createImplERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEmS9_bPNS_20ManualResourceLoaderEPKNS1_3mapIS7_S7_NS1_4lessIS7_EENS5_INS1_4pairIS8_S7_EEEEEE:
   83|  13.1k|    {
   84|       |        return OGRE_NEW Material(this, name, handle, group, isManual, loader);
   85|  13.1k|    }
_ZN4Ogre15MaterialManager6createERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_bPNS_20ManualResourceLoaderEPKNS1_3mapIS7_S7_NS1_4lessIS7_EENS5_INS1_4pairIS8_S7_EEEEEE:
   90|  13.1k|    {
   91|  13.1k|        return static_pointer_cast<Material>(createResource(name,group,isManual,loader,createParams));
   92|  13.1k|    }
_ZNK4Ogre15MaterialManager9getByNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
   95|  1.96k|    {
   96|  1.96k|        return static_pointer_cast<Material>(getResourceByName(name, groupName));
   97|  1.96k|    }
_ZN4Ogre15MaterialManager18getDefaultMaterialEb:
   99|     16|    MaterialPtr MaterialManager::getDefaultMaterial(bool useLighting) {
  100|     16|        MaterialPtr ret = getByName(useLighting ? "BaseWhite" : "BaseWhiteNoLighting",
  ------------------
  |  Branch (100:37): [True: 16, False: 0]
  ------------------
  101|     16|                                    ResourceGroupManager::INTERNAL_RESOURCE_GROUP_NAME);
  102|       |
  103|     16|        OgreAssert(ret,
  ------------------
  |  Branch (103:9): [True: 0, False: 16]
  ------------------
  104|     16|                   "Can't find default material Did you forget to call MaterialManager::initialise()?");
  105|       |
  106|     16|        return ret;
  107|     16|    }
_ZN4Ogre15MaterialManager10initialiseEv:
  111|      1|    {
  112|       |        // Set up default material - don't use name constructor as we want to avoid applying defaults
  113|      1|        mDefaultSettings = create("DefaultSettings", ResourceGroupManager::INTERNAL_RESOURCE_GROUP_NAME);
  114|       |        // Add a single technique and pass, non-programmable
  115|      1|        mDefaultSettings->createTechnique()->createPass();
  116|       |
  117|       |        // Set the default LOD strategy
  118|      1|        mDefaultSettings->setLodStrategy(LodStrategyManager::getSingleton().getDefaultStrategy());
  119|       |
  120|       |        // Set up a lit base white material
  121|      1|        create("BaseWhite", ResourceGroupManager::INTERNAL_RESOURCE_GROUP_NAME);
  122|       |        // Set up an unlit base white material
  123|      1|        MaterialPtr baseWhiteNoLighting = create("BaseWhiteNoLighting",
  124|      1|        ResourceGroupManager::INTERNAL_RESOURCE_GROUP_NAME);
  125|      1|        baseWhiteNoLighting->setLightingEnabled(false);
  126|       |
  127|      1|    }
_ZN4Ogre15MaterialManager15_getSchemeIndexERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  161|    195|    {
  162|    195|        unsigned short ret = 0;
  163|    195|        SchemeMap::iterator i = mSchemes.find(schemeName);
  164|    195|        if (i != mSchemes.end())
  ------------------
  |  Branch (164:13): [True: 178, False: 17]
  ------------------
  165|    178|        {
  166|    178|            ret = i->second;
  167|    178|        }
  168|     17|        else
  169|     17|        {
  170|       |            // Create new
  171|     17|            ret = static_cast<unsigned short>(mSchemes.size());
  172|     17|            mSchemes[schemeName] = ret;
  173|     17|        }
  174|    195|        return ret;
  175|       |
  176|    195|    }
_ZN4Ogre15MaterialManager38_notifyBeforeIlluminationPassesClearedEPNS_9TechniqueE:
  273|  38.5k|	{
  274|       |		// First, check the scheme specific listeners
  275|  38.5k|		ListenerMap::iterator it = mListenerMap.find(mActiveSchemeName);
  276|  38.5k|		if(it != mListenerMap.end())
  ------------------
  |  Branch (276:6): [True: 0, False: 38.5k]
  ------------------
  277|      0|		{
  278|      0|			ListenerList& listenerList = it->second;
  279|      0|			for(auto & i : listenerList)
  ------------------
  |  Branch (279:17): [True: 0, False: 0]
  ------------------
  280|      0|			{
  281|      0|				bool handled = i->beforeIlluminationPassesCleared(tech);
  282|      0|				if(handled)
  ------------------
  |  Branch (282:8): [True: 0, False: 0]
  ------------------
  283|      0|					return;
  284|      0|			}
  285|      0|		}
  286|       |
  287|       |		//If no success, check generic listeners
  288|  38.5k|		it = mListenerMap.find(BLANKSTRING);
  289|  38.5k|		if(it != mListenerMap.end())
  ------------------
  |  Branch (289:6): [True: 0, False: 38.5k]
  ------------------
  290|      0|		{
  291|      0|			ListenerList& listenerList = it->second;
  292|      0|			for(auto & i : listenerList)
  ------------------
  |  Branch (292:17): [True: 0, False: 0]
  ------------------
  293|      0|			{
  294|      0|				bool handled = i->beforeIlluminationPassesCleared(tech);
  295|      0|				if(handled)
  ------------------
  |  Branch (295:8): [True: 0, False: 0]
  ------------------
  296|      0|					return;
  297|      0|			}
  298|      0|		}
  299|  38.5k|	}

_ZN4Ogre11MeshManagerC2Ev:
   63|      1|    mBoundsPaddingFactor(0.01), mListener(0)
   64|      1|    {
   65|      1|        mBlendWeightsBaseElementType = VET_FLOAT1;
   66|      1|        mPrepAllMeshesForShadowVolumes = false;
   67|       |
   68|      1|        mLoadOrder = 350.0f;
   69|      1|        mResourceType = "Mesh";
   70|       |
   71|      1|        mMeshCodec = std::make_unique<MeshCodec>();
   72|      1|        Codec::registerCodec(mMeshCodec.get());
   73|       |
   74|      1|        ResourceGroupManager::getSingleton()._registerResourceManager(mResourceType, this);
   75|       |
   76|      1|        mPrefabLoader = std::make_unique<PrefabFactory>();
   77|      1|    }
_ZNK4Ogre9MeshCodec7getTypeEv:
   39|      1|        String getType() const override { return "mesh"; }

_ZN4Ogre13MovableObjectC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   43|     16|        : mName(name)
   44|     16|        , mCreator(0)
   45|     16|        , mManager(0)
   46|     16|        , mParentNode(0)
   47|     16|        , mListener(0)
   48|     16|        , mParentIsTagPoint(false)
   49|     16|        , mVisible(true)
   50|     16|        , mDebugDisplay(false)
   51|     16|        , mBeyondFarDistance(false)
   52|     16|        , mCastShadows(true)
   53|     16|        , mRenderQueueIDSet(false)
   54|     16|        , mRenderQueuePrioritySet(false)
   55|     16|        , mRenderingDisabled(false)
   56|     16|        , mRenderQueueID(RENDER_QUEUE_MAIN)
   57|     16|        , mRenderQueuePriority(100)
   58|     16|        , mUpperDistance(0)
   59|     16|        , mSquaredUpperDistance(0)
   60|     16|        , mMinPixelSize(0)
   61|     16|        , mQueryFlags(msDefaultQueryFlags)
   62|     16|        , mVisibilityFlags(msDefaultVisibilityFlags)
   63|     16|        , mLightListUpdated(0)
   64|     16|        , mLightMask(0xFFFFFFFF)
   65|     16|    {
   66|     16|        if (Root::getSingletonPtr())
  ------------------
  |  Branch (66:13): [True: 16, False: 0]
  ------------------
   67|     16|            mMinPixelSize = Root::getSingleton().getDefaultMinPixelSize();
   68|     16|    }
_ZN4Ogre13MovableObjectD2Ev:
   71|     16|    {
   72|       |        // Call listener (note, only called if there's something to do)
   73|     16|        if (mListener)
  ------------------
  |  Branch (73:13): [True: 0, False: 16]
  ------------------
   74|      0|        {
   75|      0|            mListener->objectDestroyed(this);
   76|      0|        }
   77|       |
   78|     16|        detachFromParent(); // this should never throw, if it does terminating is the thing to do
   79|     16|    }
_ZN4Ogre13MovableObject16detachFromParentEv:
  118|     16|    {
  119|     16|        if (isAttached())
  ------------------
  |  Branch (119:13): [True: 0, False: 16]
  ------------------
  120|      0|        {
  121|      0|            if (mParentIsTagPoint)
  ------------------
  |  Branch (121:17): [True: 0, False: 0]
  ------------------
  122|      0|            {
  123|      0|                TagPoint* tp = static_cast<TagPoint*>(mParentNode);
  124|      0|                tp->getParentEntity()->detachObjectFromBone(this);
  125|      0|            }
  126|      0|            else
  127|      0|            {
  128|      0|                SceneNode* sn = static_cast<SceneNode*>(mParentNode);
  129|      0|                sn->detachObject(this);
  130|      0|            }
  131|      0|        }
  132|     16|    }

_ZN4Ogre13OptimisedUtil21_detectImplementationEv:
  326|      2|    {
  327|       |        //
  328|       |        // Some speed test results (averaged number of CPU timestamp (RDTSC) per-function call):
  329|       |        //
  330|       |        //   Dagon SkeletonAnimation sample - softwareVertexSkinning:
  331|       |        //
  332|       |        //                                      Pentium 4 3.0G HT       Athlon XP 2500+     Athlon 64 X2 Dual Core 3800+
  333|       |        //
  334|       |        //      Shared Buffers, General C       763677                  462903              473038
  335|       |        //      Shared Buffers, Unrolled SSE    210030 *best*           369762              228328 *best*
  336|       |        //      Shared Buffers, General SSE     286202                  352412 *best*       302796
  337|       |        //
  338|       |        //      Separated Buffers, General C    762640                  464840              478740
  339|       |        //      Separated Buffers, Unrolled SSE 219222 *best*           287992 *best*       238770 *best*
  340|       |        //      Separated Buffers, General SSE  290129                  341614              307262
  341|       |        //
  342|       |        //      PosOnly, General C              388663                  257350              262831
  343|       |        //      PosOnly, Unrolled SSE           139814 *best*           200323 *best*       168995 *best*
  344|       |        //      PosOnly, General SSE            172693                  213704              175447
  345|       |        //
  346|       |        //   Another my own test scene - softwareVertexSkinning:
  347|       |        //
  348|       |        //                                      Pentium P4 3.0G HT      Athlon XP 2500+
  349|       |        //
  350|       |        //      Shared Buffers, General C       74527                   -
  351|       |        //      Shared Buffers, Unrolled SSE    22743 *best*            -
  352|       |        //      Shared Buffers, General SSE     28527                   -
  353|       |        //
  354|       |        //
  355|       |        // Note that speed test appears unaligned load/store instruction version
  356|       |        // loss performance 5%-10% than aligned load/store version, even if both
  357|       |        // of them access to aligned data. Thus, we should use aligned load/store
  358|       |        // as soon as possible.
  359|       |        //
  360|       |        //
  361|       |        // We are pick up the implementation based on test results above.
  362|       |        //
  363|       |#ifdef __DO_PROFILE__
  364|       |        {
  365|       |            static OptimisedUtilProfiler msOptimisedUtilProfiler;
  366|       |            return &msOptimisedUtilProfiler;
  367|       |        }
  368|       |
  369|       |#else   // !__DO_PROFILE__
  370|       |
  371|      2|#if __OGRE_HAVE_SSE
  372|      2|        if (PlatformInformation::getCpuFeatures() & PlatformInformation::CPU_FEATURE_SSE)
  ------------------
  |  Branch (372:13): [True: 2, False: 0]
  ------------------
  373|      2|        {
  374|      2|            return _getOptimisedUtilSSE();
  375|      2|        }
  376|      0|        else
  377|       |#elif __OGRE_HAVE_NEON
  378|       |        if (PlatformInformation::getCpuFeatures() & PlatformInformation::CPU_FEATURE_NEON)
  379|       |        {
  380|       |            return _getOptimisedUtilSSE();
  381|       |        }
  382|       |        else
  383|       |#endif  // __OGRE_HAVE_SSE
  384|      0|        {
  385|      0|            return _getOptimisedUtilGeneral();
  386|      0|        }
  387|       |
  388|      2|#endif  // __DO_PROFILE__
  389|      2|    }

_ZN4Ogre16OptimisedUtilSSEC2Ev:
 1040|      2|        : mPreferGeneralVersionForSharedBuffers(false)
 1041|      2|    {
 1042|       |        // For AMD Athlon XP (but not that for Althon 64), it's prefer to never use
 1043|       |        // unrolled version for shared buffers at all, I guess because that version
 1044|       |        // run out of usable CPU registers, or L1/L2 cache related problem, causing
 1045|       |        // slight performance loss than general version.
 1046|       |        //
 1047|      2|#if __OGRE_HAVE_NEON == 0
 1048|      2|        if (PlatformInformation::getCpuIdentifier().find("AuthenticAMD") != String::npos)
  ------------------
  |  Branch (1048:13): [True: 0, False: 2]
  ------------------
 1049|      0|        {
 1050|       |            // How can I check it's an Athlon XP but not Althon 64?
 1051|       |            // Ok, just test whether supports SSE2/SSE3 or not, if not,
 1052|       |            // assume general version faster than unrolled version :)
 1053|       |            //
 1054|      0|            if (!(PlatformInformation::getCpuFeatures() &
  ------------------
  |  Branch (1054:17): [True: 0, False: 0]
  ------------------
 1055|      0|                (PlatformInformation::CPU_FEATURE_SSE2 | PlatformInformation::CPU_FEATURE_SSE3)))
 1056|      0|            {
 1057|      0|                mPreferGeneralVersionForSharedBuffers = true;
 1058|      0|            }
 1059|      0|        }
 1060|      2|#endif
 1061|      2|    }
_ZN4Ogre20_getOptimisedUtilSSEEv:
 2141|      2|    {
 2142|      2|        static OptimisedUtilSSE msOptimisedUtilSSE;
 2143|       |#if defined(__OGRE_SIMD_ALIGN_STACK)
 2144|       |        static OptimisedUtilWithStackAlign msOptimisedUtilWithStackAlign(&msOptimisedUtilSSE);
 2145|       |        return &msOptimisedUtilWithStackAlign;
 2146|       |#else
 2147|      2|        return &msOptimisedUtilSSE;
 2148|      2|#endif
 2149|      2|    }

_ZN4Ogre14ParticleSystemC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  181|     16|      : MovableObject(name),
  182|     16|        mAABB(),
  183|     16|        mBoundingRadius(1.0f),
  184|     16|        mBoundsAutoUpdate(true),
  185|     16|        mBoundsUpdateTime(10.0f),
  186|     16|        mUpdateRemainTime(0),
  187|     16|        mResourceGroupName(resourceGroup),
  188|     16|        mIsRendererConfigured(false),
  189|     16|        mSpeedFactor(1.0f),
  190|     16|        mIterationInterval(0),
  191|     16|        mIterationIntervalSet(false),
  192|     16|        mSorted(false),
  193|     16|        mLocalSpace(false),
  194|     16|        mNonvisibleTimeout(0),
  195|     16|        mNonvisibleTimeoutSet(false),
  196|     16|        mTimeSinceLastVisible(0),
  197|     16|        mLastVisibleFrame(Root::getSingleton().getNextFrameNumber()),
  198|     16|        mTimeController(0),
  199|     16|        mEmittedEmitterPoolInitialised(false),
  200|     16|        mIsEmitting(true),
  201|     16|        mRenderer(0), 
  202|     16|        mCullIndividual(false),
  203|     16|        mPoolSize(0),
  204|     16|        mEmittedEmitterPoolSize(0)
  205|     16|    {
  206|     16|        setDefaultDimensions( 100, 100 );
  207|     16|        mMaterial = MaterialManager::getSingleton().getDefaultMaterial();
  208|       |        // Default to 10 particles, expect app to specify (will only be increased, not decreased)
  209|     16|        setParticleQuota( 10 );
  210|     16|        setEmittedEmitterQuota( 3 );
  211|     16|        initParameters();
  212|       |
  213|       |        // Default to billboard renderer
  214|     16|        setRenderer("billboard");
  215|     16|        mCastShadows = false;
  216|     16|    }
_ZN4Ogre14ParticleSystem16setParticleQuotaEm:
  384|     16|    {
  385|       |        // Never shrink below size()
  386|     16|        size_t currSize = mParticlePool.size();
  387|       |
  388|     16|        if( currSize < size )
  ------------------
  |  Branch (388:13): [True: 16, False: 0]
  ------------------
  389|     16|        {
  390|       |            // Will allocate particles on demand
  391|     16|            mPoolSize = size;
  392|       |            
  393|     16|        }
  394|     16|    }
_ZN4Ogre14ParticleSystem22setEmittedEmitterQuotaEm:
  402|     16|    {
  403|       |        // Never shrink below size()
  404|     16|        size_t currSize = 0;
  405|     16|        for (auto& kv : mEmittedEmitterPool)
  ------------------
  |  Branch (405:23): [True: 0, False: 16]
  ------------------
  406|      0|        {
  407|      0|            currSize += kv.second.size();
  408|      0|        }
  409|       |
  410|     16|        if( currSize < size )
  ------------------
  |  Branch (410:13): [True: 16, False: 0]
  ------------------
  411|     16|        {
  412|       |            // Will allocate emitted emitters on demand
  413|     16|            mEmittedEmitterPoolSize = size;
  414|     16|        }
  415|     16|    }
_ZN4Ogre14ParticleSystem14initParametersEv:
  771|     16|    {
  772|     16|        if (createParamDictionary("ParticleSystem"))
  ------------------
  |  Branch (772:13): [True: 1, False: 15]
  ------------------
  773|      1|        {
  774|      1|            ParamDictionary* dict = getParamDictionary();
  775|       |
  776|      1|            dict->addParameter(ParameterDef("quota", 
  777|      1|                "The maximum number of particles allowed at once in this system.",
  778|      1|                PT_UNSIGNED_INT),
  779|      1|                &msQuotaCmd);
  780|       |
  781|      1|            dict->addParameter(ParameterDef("emit_emitter_quota", 
  782|      1|                "The maximum number of emitters to be emitted at once in this system.",
  783|      1|                PT_UNSIGNED_INT),
  784|      1|                &msEmittedEmitterQuotaCmd);
  785|       |
  786|      1|            dict->addParameter(ParameterDef("material", 
  787|      1|                "The name of the material to be used to render all particles in this system.",
  788|      1|                PT_STRING),
  789|      1|                &msMaterialCmd);
  790|       |
  791|      1|            dict->addParameter(ParameterDef("particle_width", 
  792|      1|                "The width of particles in world units.",
  793|      1|                PT_REAL),
  794|      1|                &msWidthCmd);
  795|       |
  796|      1|            dict->addParameter(ParameterDef("particle_height", 
  797|      1|                "The height of particles in world units.",
  798|      1|                PT_REAL),
  799|      1|                &msHeightCmd);
  800|       |
  801|      1|            dict->addParameter(ParameterDef("cull_each", 
  802|      1|                "If true, each particle is culled in it's own right. If false, the entire system is culled as a whole.",
  803|      1|                PT_BOOL),
  804|      1|                &msCullCmd);
  805|       |
  806|      1|            dict->addParameter(ParameterDef("renderer", 
  807|      1|                "Sets the particle system renderer to use (default 'billboard').",
  808|      1|                PT_STRING),
  809|      1|                &msRendererCmd);
  810|       |
  811|      1|            dict->addParameter(ParameterDef("sorted", 
  812|      1|                "Sets whether particles should be sorted relative to the camera. ",
  813|      1|                PT_BOOL),
  814|      1|                &msSortedCmd);
  815|       |
  816|      1|            dict->addParameter(ParameterDef("local_space", 
  817|      1|                "Sets whether particles should be kept in local space rather than "
  818|      1|                "emitted into world space. ",
  819|      1|                PT_BOOL),
  820|      1|                &msLocalSpaceCmd);
  821|       |
  822|      1|            dict->addParameter(ParameterDef("iteration_interval", 
  823|      1|                "Sets a fixed update interval for the system, or 0 for the frame rate. ",
  824|      1|                PT_REAL),
  825|      1|                &msIterationIntervalCmd);
  826|       |
  827|      1|            dict->addParameter(ParameterDef("nonvisible_update_timeout", 
  828|      1|                "Sets a timeout on updates to the system if the system is not visible "
  829|      1|                "for the given number of seconds (0 to always update)",
  830|      1|                PT_REAL),
  831|      1|                &msNonvisibleTimeoutCmd);
  832|       |
  833|      1|        }
  834|     16|    }
_ZN4Ogre14ParticleSystem20setDefaultDimensionsEff:
  932|     16|    {
  933|     16|        assert(width >= 0 && height >= 0 && "Particle dimensions can not be negative");
  934|     16|        mDefaultWidth = width;
  935|     16|        mDefaultHeight = height;
  936|     16|        if (mRenderer)
  ------------------
  |  Branch (936:13): [True: 0, False: 16]
  ------------------
  937|      0|        {
  938|      0|            mRenderer->_notifyDefaultDimensions(width, height);
  939|      0|        }
  940|     16|    }
_ZN4Ogre14ParticleSystem11setRendererERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 1068|     16|    {
 1069|     16|        if (mRenderer)
  ------------------
  |  Branch (1069:13): [True: 0, False: 16]
  ------------------
 1070|      0|        {
 1071|       |            // Destroy existing
 1072|      0|            ParticleSystemManager::getSingleton()._destroyRenderer(mRenderer);
 1073|      0|            mRenderer = 0;
 1074|      0|        }
 1075|       |
 1076|     16|        if (!rendererName.empty())
  ------------------
  |  Branch (1076:13): [True: 16, False: 0]
  ------------------
 1077|     16|        {
 1078|     16|            mRenderer = ParticleSystemManager::getSingleton()._createRenderer(rendererName);
 1079|     16|            mIsRendererConfigured = false;
 1080|     16|        }
 1081|     16|    }

_ZN4Ogre21ParticleSystemManager12getSingletonEv:
   47|  5.83k|    {  
   48|       |        assert( msSingleton );  return ( *msSingleton );  
   49|  5.83k|    }
_ZN4Ogre21ParticleSystemManagerC2Ev:
   52|      1|    {
   53|      1|        OGRE_LOCK_AUTO_MUTEX;
   54|       |        mFactory = OGRE_NEW ParticleSystemFactory();
   55|      1|        Root::getSingleton().addMovableObjectFactory(mFactory);
   56|      1|    }
_ZN4Ogre21ParticleSystemManager18removeAllTemplatesEb:
  133|  5.80k|    {
  134|  5.80k|        OGRE_LOCK_AUTO_MUTEX;
  135|  5.80k|        if (deleteTemplate)
  ------------------
  |  Branch (135:13): [True: 5.80k, False: 0]
  ------------------
  136|  5.80k|        {
  137|  5.80k|            ParticleTemplateMap::iterator itr;
  138|  5.80k|            for (itr = mSystemTemplates.begin(); itr != mSystemTemplates.end(); ++itr)
  ------------------
  |  Branch (138:50): [True: 0, False: 5.80k]
  ------------------
  139|  5.80k|                OGRE_DELETE itr->second;
  140|  5.80k|        }
  141|       |
  142|  5.80k|        mSystemTemplates.clear();
  143|  5.80k|    }
_ZN4Ogre21ParticleSystemManager14createTemplateERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  164|     16|    {
  165|     16|        OGRE_LOCK_AUTO_MUTEX;
  166|       |        // check name
  167|     16|        if (mSystemTemplates.find(name) != mSystemTemplates.end())
  ------------------
  |  Branch (167:13): [True: 0, False: 16]
  ------------------
  168|      0|        {
  169|       |#if OGRE_PLATFORM == OGRE_PLATFORM_WINRT
  170|       |            LogManager::getSingleton().logMessage("ParticleSystem template with name '" + name + "' already exists.");
  171|       |            return NULL;
  172|       |#else
  173|      0|            OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, 
  174|      0|                "ParticleSystem template with name '" + name + "' already exists.", 
  175|      0|                "ParticleSystemManager::createTemplate");
  176|      0|#endif
  177|      0|        }
  178|       |
  179|     16|        ParticleSystem* tpl = OGRE_NEW ParticleSystem(name, resourceGroup);
  180|     16|        addTemplate(name, tpl);
  181|     16|        return tpl;
  182|       |
  183|     16|    }
_ZN4Ogre21ParticleSystemManager15_createRendererERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  293|     16|    {
  294|     16|        OGRE_LOCK_AUTO_MUTEX;
  295|       |        // Locate affector type
  296|     16|        ParticleSystemRendererFactoryMap::iterator pFact = mRendererFactories.find(rendererType);
  297|       |
  298|     16|        if (pFact == mRendererFactories.end())
  ------------------
  |  Branch (298:13): [True: 16, False: 0]
  ------------------
  299|     16|        {
  300|     16|            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Cannot find requested renderer type.", 
  301|     16|                "ParticleSystemManager::_createRenderer");
  302|     16|        }
  303|       |
  304|      0|        return pFact->second->createInstance(rendererType);
  305|     16|    }
_ZNK4Ogre21ParticleSystemFactory7getTypeEv:
  397|      3|    {
  398|      3|        return MOT_PARTICLE_SYSTEM;
  399|      3|    }

_ZN4Ogre4Pass22getBuiltinHashFunctionENS0_19BuiltinHashFunctionE:
   92|  26.1k|    {
   93|  26.1k|        Pass::HashFunc* hashFunc = NULL;
   94|       |
   95|  26.1k|        switch(builtin)
  ------------------
  |  Branch (95:16): [True: 26.1k, False: 0]
  ------------------
   96|  26.1k|        {
   97|  22.8k|        case MIN_TEXTURE_CHANGE:
  ------------------
  |  Branch (97:9): [True: 22.8k, False: 3.26k]
  ------------------
   98|  22.8k|            hashFunc = &sMinTextureStateChangeHashFunc;
   99|  22.8k|            break;
  100|  3.26k|        case MIN_GPU_PROGRAM_CHANGE:
  ------------------
  |  Branch (100:9): [True: 3.26k, False: 22.8k]
  ------------------
  101|  3.26k|            hashFunc = &sMinGpuProgramChangeHashFunc;
  102|  3.26k|            break;
  103|  26.1k|        }
  104|       |
  105|  26.1k|        return hashFunc;
  106|  26.1k|    }
_ZN4Ogre4PassC2EPNS_9TechniqueEt:
  122|  12.1k|        : mParent(parent)
  123|  12.1k|        , mHash(0)
  124|  12.1k|        , mAmbient(ColourValue::White)
  125|  12.1k|        , mDiffuse(ColourValue::White)
  126|  12.1k|        , mSpecular(ColourValue::Black)
  127|  12.1k|        , mEmissive(ColourValue::Black)
  128|  12.1k|        , mShininess(0)
  129|  12.1k|        , mTracking(TVC_NONE)
  130|  12.1k|        , mHashDirtyQueued(false)
  131|  12.1k|        , mDepthCheck(true)
  132|  12.1k|        , mDepthWrite(true)
  133|  12.1k|        , mAlphaToCoverageEnabled(false)
  134|  12.1k|        , mTransparentSorting(true)
  135|  12.1k|        , mTransparentSortingForced(false)
  136|  12.1k|        , mLightingEnabled(true)
  137|  12.1k|        , mIteratePerLight(false)
  138|  12.1k|        , mRunOnlyForOneLightType(false)
  139|  12.1k|        , mPolygonModeOverrideable(true)
  140|  12.1k|        , mFogOverride(false)
  141|  12.1k|        , mQueuedForDeletion(false)
  142|  12.1k|        , mLightScissoring(false)
  143|  12.1k|        , mLightClipPlanes(false)
  144|  12.1k|        , mPointSpritesEnabled(false)
  145|  12.1k|        , mPointAttenuationEnabled(false)
  146|  12.1k|        , mContentTypeLookupBuilt(false)
  147|  12.1k|        , mAlphaRejectVal(0)
  148|  12.1k|        , mDepthBiasConstant(0.0f)
  149|  12.1k|        , mDepthBiasSlopeScale(0.0f)
  150|  12.1k|        , mDepthBiasPerIteration(0.0f)
  151|  12.1k|        , mDepthFunc(CMPF_LESS_EQUAL)
  152|  12.1k|        , mAlphaRejectFunc(CMPF_ALWAYS_PASS)
  153|  12.1k|        , mCullMode(CULL_CLOCKWISE)
  154|  12.1k|        , mManualCullMode(MANUAL_CULL_BACK)
  155|  12.1k|        , mMaxSimultaneousLights(OGRE_MAX_SIMULTANEOUS_LIGHTS)
  156|  12.1k|        , mStartLight(0)
  157|  12.1k|        , mLightsPerIteration(1)
  158|  12.1k|        , mIndex(index)
  159|  12.1k|        , mLightMask(0xFFFFFFFF)
  160|  12.1k|        , mFogColour(ColourValue::White)
  161|  12.1k|        , mFogStart(0.0)
  162|  12.1k|        , mFogEnd(1.0)
  163|  12.1k|        , mFogDensity(0.001)
  164|  12.1k|        , mLineWidth(1.0f)
  165|  12.1k|        , mPassIterationCount(1)
  166|  12.1k|        , mPointMinSize(0.0f)
  167|  12.1k|        , mPointMaxSize(0.0f)
  168|  12.1k|        , mPointAttenution(1.0f, 1.0f, 0.0f, 0.0f)
  169|  12.1k|        , mShadeOptions(SO_GOURAUD)
  170|  12.1k|        , mPolygonMode(PM_SOLID)
  171|  12.1k|        , mIlluminationStage(IS_UNKNOWN)
  172|  12.1k|        , mOnlyLightType(Light::LT_POINT)
  173|  12.1k|        , mFogMode(FOG_NONE)
  174|  12.1k|    {
  175|       |        // init the hash inline
  176|  12.1k|        _recalculateHash();
  177|  12.1k|   }
_ZN4Ogre4PassC2EPNS_9TechniqueEtRKS0_:
  181|  13.1k|        : mParent(parent), mQueuedForDeletion(false), mIndex(index), mPassIterationCount(1)
  182|  13.1k|    {
  183|  13.1k|        *this = oth;
  184|  13.1k|        mParent = parent;
  185|  13.1k|        mIndex = index;
  186|  13.1k|        mQueuedForDeletion = false;
  187|       |
  188|       |        // init the hash inline
  189|  13.1k|        _recalculateHash();
  190|  13.1k|    }
_ZN4Ogre4PassaSERKS0_:
  194|  13.1k|    {
  195|  13.1k|        mName = oth.mName;
  196|  13.1k|        mHash = oth.mHash;
  197|  13.1k|        mAmbient = oth.mAmbient;
  198|  13.1k|        mDiffuse = oth.mDiffuse;
  199|  13.1k|        mSpecular = oth.mSpecular;
  200|  13.1k|        mEmissive = oth.mEmissive;
  201|  13.1k|        mShininess = oth.mShininess;
  202|  13.1k|        mTracking = oth.mTracking;
  203|       |
  204|       |        // Copy fog parameters
  205|  13.1k|        mFogOverride = oth.mFogOverride;
  206|  13.1k|        mFogMode = oth.mFogMode;
  207|  13.1k|        mFogColour = oth.mFogColour;
  208|  13.1k|        mFogStart = oth.mFogStart;
  209|  13.1k|        mFogEnd = oth.mFogEnd;
  210|  13.1k|        mFogDensity = oth.mFogDensity;
  211|       |
  212|       |        // Default blending (overwrite)
  213|  13.1k|        mBlendState = oth.mBlendState;
  214|       |
  215|  13.1k|        mDepthCheck = oth.mDepthCheck;
  216|  13.1k|        mDepthWrite = oth.mDepthWrite;
  217|  13.1k|        mAlphaRejectFunc = oth.mAlphaRejectFunc;
  218|  13.1k|        mAlphaRejectVal = oth.mAlphaRejectVal;
  219|  13.1k|        mAlphaToCoverageEnabled = oth.mAlphaToCoverageEnabled;
  220|  13.1k|        mTransparentSorting = oth.mTransparentSorting;
  221|  13.1k|        mTransparentSortingForced = oth.mTransparentSortingForced;
  222|  13.1k|        mDepthFunc = oth.mDepthFunc;
  223|  13.1k|        mDepthBiasConstant = oth.mDepthBiasConstant;
  224|  13.1k|        mDepthBiasSlopeScale = oth.mDepthBiasSlopeScale;
  225|  13.1k|        mDepthBiasPerIteration = oth.mDepthBiasPerIteration;
  226|  13.1k|        mCullMode = oth.mCullMode;
  227|  13.1k|        mManualCullMode = oth.mManualCullMode;
  228|  13.1k|        mLightingEnabled = oth.mLightingEnabled;
  229|  13.1k|        mMaxSimultaneousLights = oth.mMaxSimultaneousLights;
  230|  13.1k|        mStartLight = oth.mStartLight;
  231|  13.1k|        mIteratePerLight = oth.mIteratePerLight;
  232|  13.1k|        mLightsPerIteration = oth.mLightsPerIteration;
  233|  13.1k|        mRunOnlyForOneLightType = oth.mRunOnlyForOneLightType;
  234|  13.1k|        mOnlyLightType = oth.mOnlyLightType;
  235|  13.1k|        mShadeOptions = oth.mShadeOptions;
  236|  13.1k|        mPolygonMode = oth.mPolygonMode;
  237|  13.1k|        mPolygonModeOverrideable = oth.mPolygonModeOverrideable;
  238|  13.1k|        mPassIterationCount = oth.mPassIterationCount;
  239|  13.1k|        mLineWidth = oth.mLineWidth;
  240|  13.1k|        mPointAttenution = oth.mPointAttenution;
  241|  13.1k|        mPointMinSize = oth.mPointMinSize;
  242|  13.1k|        mPointMaxSize = oth.mPointMaxSize;
  243|  13.1k|        mPointSpritesEnabled = oth.mPointSpritesEnabled;
  244|  13.1k|        mPointAttenuationEnabled = oth.mPointAttenuationEnabled;
  245|  13.1k|        mShadowContentTypeLookup = oth.mShadowContentTypeLookup;
  246|  13.1k|        mContentTypeLookupBuilt = oth.mContentTypeLookupBuilt;
  247|  13.1k|        mLightScissoring = oth.mLightScissoring;
  248|  13.1k|        mLightClipPlanes = oth.mLightClipPlanes;
  249|  13.1k|        mIlluminationStage = oth.mIlluminationStage;
  250|  13.1k|        mLightMask = oth.mLightMask;
  251|       |
  252|  78.6k|        for(int i = 0; i < GPT_PIPELINE_COUNT; i++)
  ------------------
  |  Branch (252:24): [True: 65.5k, False: 13.1k]
  ------------------
  253|  65.5k|        {
  254|  65.5k|            auto& programUsage = mProgramUsage[i];
  255|  65.5k|            auto& othUsage = oth.mProgramUsage[i];
  256|  65.5k|            programUsage = othUsage ? std::make_unique<GpuProgramUsage>(*othUsage, this) : nullptr;
  ------------------
  |  Branch (256:28): [True: 0, False: 65.5k]
  ------------------
  257|  65.5k|        }
  258|       |
  259|       |        // Clear texture units but doesn't notify need recompilation in the case
  260|       |        // we are cloning, The parent material will take care of this.
  261|  13.1k|        for (auto *t : mTextureUnitStates)
  ------------------
  |  Branch (261:22): [True: 0, False: 13.1k]
  ------------------
  262|      0|        {
  263|      0|            OGRE_DELETE t;
  264|      0|        }
  265|       |
  266|  13.1k|        mTextureUnitStates.clear();
  267|       |
  268|       |        // Copy texture units
  269|  13.1k|        for (auto *s : oth.mTextureUnitStates)
  ------------------
  |  Branch (269:22): [True: 0, False: 13.1k]
  ------------------
  270|      0|        {
  271|      0|            TextureUnitState* t = OGRE_NEW TextureUnitState(this, *s);
  272|      0|            mTextureUnitStates.push_back(t);
  273|      0|        }
  274|       |
  275|  13.1k|        _dirtyHash();
  276|       |
  277|  13.1k|        return *this;
  278|  13.1k|    }
_ZN4Ogre4Pass19setPointAttenuationEbfff:
  296|     89|    {
  297|     89|        mPointAttenuationEnabled = enabled;
  298|     89|        mPointAttenution[1] = enabled ? constant : 1.0f;
  ------------------
  |  Branch (298:31): [True: 89, False: 0]
  ------------------
  299|     89|        mPointAttenution[2] = enabled ? linear : 0.0f;
  ------------------
  |  Branch (299:31): [True: 89, False: 0]
  ------------------
  300|     89|        mPointAttenution[3] = enabled ? quadratic : 0.0f;
  ------------------
  |  Branch (300:31): [True: 89, False: 0]
  ------------------
  301|     89|    }
_ZN4Ogre4Pass15setPointMinSizeEf:
  304|      1|    {
  305|      1|        mPointMinSize = min;
  306|      1|    }
_ZN4Ogre4Pass15setPointMaxSizeEf:
  314|      1|    {
  315|      1|        mPointMaxSize = max;
  316|      1|    }
_ZN4Ogre4Pass22createTextureUnitStateEv:
  355|  12.6k|    {
  356|       |        TextureUnitState *t = OGRE_NEW TextureUnitState(this);
  357|  12.6k|        addTextureUnitState(t);
  358|  12.6k|        mContentTypeLookupBuilt = false;
  359|  12.6k|        return t;
  360|  12.6k|    }
_ZN4Ogre4Pass19addTextureUnitStateEPNS_16TextureUnitStateE:
  374|  12.6k|    {
  375|  12.6k|        OGRE_LOCK_MUTEX(mTexUnitChangeMutex);
  376|       |
  377|  12.6k|        OgreAssert(state , "TextureUnitState is NULL");
  ------------------
  |  Branch (377:9): [True: 0, False: 12.6k]
  ------------------
  378|       |
  379|       |        // only attach TUS to pass if TUS does not belong to another pass
  380|  12.6k|        OgreAssert(!state->getParent() || (state->getParent() == this), "TextureUnitState already attached to another pass");
  ------------------
  |  Branch (380:9): [True: 0, False: 12.6k]
  |  Branch (380:9): [True: 12.6k, False: 0]
  ------------------
  381|       |
  382|  12.6k|        mTextureUnitStates.push_back(state);
  383|       |        // Notify state
  384|  12.6k|        state->_notifyParent(this);
  385|       |        // if texture unit state name is empty then give it a default name based on its index
  386|  12.6k|        if (state->getName().empty())
  ------------------
  |  Branch (386:13): [True: 12.6k, False: 0]
  ------------------
  387|  12.6k|        {
  388|       |            // its the last entry in the container so its index is size - 1
  389|  12.6k|            size_t idx = mTextureUnitStates.size() - 1;
  390|       |
  391|       |            // allow 8 digit hex number. there should never be that many texture units.
  392|       |            // This sprintf replaced a call to StringConverter::toString for performance reasons
  393|  12.6k|            state->setName( StringUtil::format("%lx", static_cast<long>(idx)));
  394|  12.6k|        }
  395|  12.6k|        _notifyNeedsRecompile();
  396|  12.6k|        _dirtyHash();
  397|       |
  398|  12.6k|        mContentTypeLookupBuilt = false;
  399|  12.6k|    }
_ZN4Ogre4Pass26removeAllTextureUnitStatesEv:
  459|  25.2k|    {
  460|  25.2k|        OGRE_LOCK_MUTEX(mTexUnitChangeMutex);
  461|  25.2k|        TextureUnitStates::iterator i, iend;
  462|  25.2k|        iend = mTextureUnitStates.end();
  463|  37.8k|        for (i = mTextureUnitStates.begin(); i != iend; ++i)
  ------------------
  |  Branch (463:46): [True: 12.6k, False: 25.2k]
  ------------------
  464|  12.6k|        {
  465|       |            OGRE_DELETE *i;
  466|  12.6k|        }
  467|  25.2k|        mTextureUnitStates.clear();
  468|  25.2k|        _notifyNeedsRecompile();
  469|  25.2k|        _dirtyHash();
  470|  25.2k|        mContentTypeLookupBuilt = false;
  471|  25.2k|    }
_ZN4Ogre4Pass16setSceneBlendingENS_14SceneBlendTypeE:
  502|  2.87k|    {
  503|       |        // Convert type into blend factors
  504|       |
  505|  2.87k|        SceneBlendFactor source;
  506|  2.87k|        SceneBlendFactor dest;
  507|  2.87k|        _getBlendFlags(sbt, source, dest);
  508|       |
  509|       |        // Set blend factors
  510|       |
  511|  2.87k|        setSceneBlending(source, dest);
  512|  2.87k|    }
_ZN4Ogre4Pass16setSceneBlendingENS_16SceneBlendFactorES1_:
  533|  2.87k|    {
  534|  2.87k|        mBlendState.sourceFactor = sourceFactor;
  535|  2.87k|        mBlendState.sourceFactorAlpha = sourceFactor;
  536|  2.87k|        mBlendState.destFactor = destFactor;
  537|  2.87k|        mBlendState.destFactorAlpha = destFactor;
  538|  2.87k|    }
_ZN4Ogre4Pass22setAlphaRejectSettingsENS_15CompareFunctionEhb:
  578|    119|    {
  579|    119|        mAlphaRejectFunc = func;
  580|    119|        mAlphaRejectVal = value;
  581|    119|        mAlphaToCoverageEnabled = alphaToCoverage;
  582|    119|    }
_ZN4Ogre4Pass21setColourWriteEnabledEbbbb:
  600|      2|    {
  601|      2|        mBlendState.writeR = red;
  602|      2|        mBlendState.writeG = green;
  603|      2|        mBlendState.writeB = blue;
  604|      2|        mBlendState.writeA = alpha;
  605|      2|    }
_ZN4Ogre4Pass18setIteratePerLightEbbNS_5Light10LightTypesE:
  617|    174|    {
  618|    174|        mIteratePerLight = enabled;
  619|    174|        mRunOnlyForOneLightType = onlyForOneLightType;
  620|    174|        mOnlyLightType = lightType;
  621|    174|    }
_ZN4Ogre4Pass20setManualCullingModeENS_17ManualCullingModeE:
  624|     38|    {
  625|     38|        mManualCullMode = mode;
  626|     38|    }
_ZN4Ogre4Pass6setFogEbNS_7FogModeERKNS_11ColourValueEfff:
  634|     70|    {
  635|     70|        mFogOverride = overrideScene;
  636|     70|        if (overrideScene)
  ------------------
  |  Branch (636:13): [True: 67, False: 3]
  ------------------
  637|     67|        {
  638|     67|            mFogMode = mode;
  639|     67|            mFogColour = colour;
  640|     67|            mFogStart = start;
  641|     67|            mFogEnd = end;
  642|     67|            mFogDensity = density;
  643|     67|        }
  644|     70|    }
_ZN4Ogre4Pass12setDepthBiasEff:
  647|     16|    {
  648|     16|       mDepthBiasConstant = constantBias;
  649|     16|       mDepthBiasSlopeScale = slopeScaleBias;
  650|     16|    }
_ZN4Ogre4Pass13setGpuProgramENS_14GpuProgramTypeERKNS_9SharedPtrINS_10GpuProgramEEEb:
  770|  3.26k|    {
  771|  3.26k|        OGRE_LOCK_MUTEX(mGpuProgramChangeMutex);
  772|       |
  773|  3.26k|        std::unique_ptr<GpuProgramUsage>& programUsage = getProgramUsage(type);
  774|       |
  775|       |        // Turn off fragment program if name blank
  776|  3.26k|        if (!program)
  ------------------
  |  Branch (776:13): [True: 0, False: 3.26k]
  ------------------
  777|      0|        {
  778|      0|            programUsage.reset();
  779|      0|        }
  780|  3.26k|        else
  781|  3.26k|        {
  782|  3.26k|            if (!programUsage)
  ------------------
  |  Branch (782:17): [True: 1.45k, False: 1.81k]
  ------------------
  783|  1.45k|            {
  784|  1.45k|                programUsage = std::make_unique<GpuProgramUsage>(type, this);
  785|  1.45k|            }
  786|  3.26k|            programUsage->setProgram(program, resetParams);
  787|  3.26k|        }
  788|       |        // Needs recompilation
  789|  3.26k|        _notifyNeedsRecompile();
  790|       |
  791|  3.26k|        if( Pass::getHashFunction() == Pass::getBuiltinHashFunction( Pass::MIN_GPU_PROGRAM_CHANGE ) )
  ------------------
  |  Branch (791:13): [True: 3.26k, False: 0]
  ------------------
  792|  3.26k|        {
  793|  3.26k|            _dirtyHash();
  794|  3.26k|        }
  795|  3.26k|    }
_ZN4Ogre4Pass15getProgramUsageENS_14GpuProgramTypeE:
  820|  3.26k|    std::unique_ptr<GpuProgramUsage>& Pass::getProgramUsage(GpuProgramType programType) {
  821|  3.26k|        return mProgramUsage[programType % GPT_PIPELINE_COUNT];
  822|  3.26k|    }
_ZNK4Ogre4Pass15getProgramUsageENS_14GpuProgramTypeE:
  825|   202k|    {
  826|   202k|        static std::unique_ptr<GpuProgramUsage> nullUsage;
  827|   202k|        auto& ret = mProgramUsage[programType % GPT_PIPELINE_COUNT];
  828|   202k|        return ret && ret->getType() == programType ? ret : nullUsage;
  ------------------
  |  Branch (828:16): [True: 0, False: 202k]
  |  Branch (828:23): [True: 0, False: 0]
  ------------------
  829|   202k|    }
_ZNK4Ogre4Pass17getGpuProgramNameENS_14GpuProgramTypeE:
  843|   202k|    {
  844|   202k|        OGRE_LOCK_MUTEX(mGpuProgramChangeMutex);
  845|       |
  846|   202k|        const std::unique_ptr<GpuProgramUsage>& programUsage = getProgramUsage(type);
  847|   202k|        if (!programUsage)
  ------------------
  |  Branch (847:13): [True: 202k, False: 0]
  ------------------
  848|   202k|            return BLANKSTRING;
  849|      0|        else
  850|      0|            return programUsage->getProgramName();
  851|   202k|    }
_ZNK4Ogre4Pass8isLoadedEv:
  854|  13.7k|    {
  855|  13.7k|        return mParent->isLoaded();
  856|  13.7k|    }
_ZN4Ogre4Pass16_recalculateHashEv:
  859|  25.2k|    {
  860|       |        /* Hash format is 32-bit, divided as follows (high to low bits)
  861|       |           bits   purpose
  862|       |            4     Pass index (i.e. max 16 passes!)
  863|       |           28     Pass contents
  864|       |       */
  865|  25.2k|        mHash = (*msHashFunc)(this);
  866|       |
  867|       |        // overwrite the 4 upper bits with pass index
  868|  25.2k|        mHash = (uint32(mIndex) << 28) | (mHash >> 4);
  869|  25.2k|    }
_ZN4Ogre4Pass10_dirtyHashEv:
  872|  54.2k|    {
  873|  54.2k|        if (mQueuedForDeletion)
  ------------------
  |  Branch (873:13): [True: 25.2k, False: 28.9k]
  ------------------
  874|  25.2k|            return;
  875|       |
  876|  28.9k|        Material* mat = mParent->getParent();
  877|  28.9k|        if (mat->isLoading() || mat->isLoaded())
  ------------------
  |  Branch (877:13): [True: 0, False: 28.9k]
  |  Branch (877:33): [True: 0, False: 28.9k]
  ------------------
  878|      0|        {
  879|      0|            OGRE_LOCK_MUTEX(msDirtyHashListMutex);
  880|       |            // Mark this hash as for follow up
  881|      0|            msDirtyHashList.insert(this);
  882|      0|            mHashDirtyQueued = false;
  883|      0|        }
  884|  28.9k|        else
  885|  28.9k|        {
  886|  28.9k|            mHashDirtyQueued = true;
  887|  28.9k|        }
  888|  28.9k|    }
_ZN4Ogre4Pass21_notifyNeedsRecompileEv:
  897|  41.1k|    {
  898|  41.1k|        if (!mQueuedForDeletion)
  ------------------
  |  Branch (898:13): [True: 15.8k, False: 25.2k]
  ------------------
  899|  15.8k|            mParent->_notifyNeedsRecompile();
  900|  41.1k|    }
_ZN4Ogre4Pass16queueForDeletionEv:
  957|  25.2k|    {
  958|  25.2k|        mQueuedForDeletion = true;
  959|       |
  960|  25.2k|        removeAllTextureUnitStates();
  961|  25.2k|        for (auto& u : mProgramUsage)
  ------------------
  |  Branch (961:22): [True: 126k, False: 25.2k]
  ------------------
  962|   126k|            u.reset();
  963|       |
  964|       |        // remove from dirty list, if there
  965|  25.2k|        {
  966|  25.2k|            OGRE_LOCK_MUTEX(msDirtyHashListMutex);
  967|  25.2k|            msDirtyHashList.erase(this);
  968|  25.2k|        }
  969|  25.2k|        {
  970|  25.2k|            OGRE_LOCK_MUTEX(msPassGraveyardMutex);
  971|  25.2k|            msPassGraveyard.insert(this);
  972|  25.2k|        }
  973|  25.2k|    }
_ZNK4Ogre4Pass16getResourceGroupEv:
  989|   829k|    {
  990|   829k|        return mParent->getResourceGroup();
  991|   829k|    }
OgrePass.cpp:_ZN4OgreL14_getBlendFlagsENS_14SceneBlendTypeERNS_16SceneBlendFactorES2_:
  474|  2.87k|    {
  475|  2.87k|        switch ( type )
  476|  2.87k|        {
  477|    890|        case SBT_TRANSPARENT_ALPHA:
  ------------------
  |  Branch (477:9): [True: 890, False: 1.98k]
  ------------------
  478|    890|            source = SBF_SOURCE_ALPHA;
  479|    890|            dest = SBF_ONE_MINUS_SOURCE_ALPHA;
  480|    890|            return;
  481|    348|        case SBT_TRANSPARENT_COLOUR:
  ------------------
  |  Branch (481:9): [True: 348, False: 2.52k]
  ------------------
  482|    348|            source = SBF_SOURCE_COLOUR;
  483|    348|            dest = SBF_ONE_MINUS_SOURCE_COLOUR;
  484|    348|            return;
  485|    161|        case SBT_MODULATE:
  ------------------
  |  Branch (485:9): [True: 161, False: 2.71k]
  ------------------
  486|    161|            source = SBF_DEST_COLOUR;
  487|    161|            dest = SBF_ZERO;
  488|    161|            return;
  489|  1.47k|        case SBT_ADD:
  ------------------
  |  Branch (489:9): [True: 1.47k, False: 1.39k]
  ------------------
  490|  1.47k|            source = SBF_ONE;
  491|  1.47k|            dest = SBF_ONE;
  492|  1.47k|            return;
  493|      0|        default:
  ------------------
  |  Branch (493:9): [True: 0, False: 2.87k]
  ------------------
  494|      0|        case SBT_REPLACE:
  ------------------
  |  Branch (494:9): [True: 0, False: 2.87k]
  ------------------
  495|      0|            source = SBF_ONE;
  496|      0|            dest = SBF_ZERO;
  497|      0|            return;
  498|  2.87k|        }
  499|  2.87k|    }
_ZNK4Ogre27MinGpuProgramChangeHashFuncclEPKNS_4PassE:
   67|  25.2k|        {
   68|  25.2k|            OGRE_LOCK_MUTEX(p->mGpuProgramChangeMutex);
   69|  25.2k|            uint32 hash = 0;
   70|       |
   71|   227k|            for(int i = 0; i < GPT_COUNT; i++)
  ------------------
  |  Branch (71:28): [True: 202k, False: 25.2k]
  ------------------
   72|   202k|            {
   73|   202k|                const String& name = p->getGpuProgramName(GpuProgramType(i));
   74|   202k|                if(!name.empty()) {
  ------------------
  |  Branch (74:20): [True: 0, False: 202k]
  ------------------
   75|      0|                    hash = FastHash(name.c_str(), name.size(), hash);
   76|      0|                }
   77|   202k|            }
   78|       |
   79|  25.2k|            return hash;
   80|  25.2k|        }

_ZN4Ogre25PixelCountLodStrategyBaseC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   37|      2|        : LodStrategy(name)
   38|      2|    { }
_ZN4Ogre29AbsolutePixelCountLodStrategyC2Ev:
   92|      1|        : PixelCountLodStrategyBase("pixel_count")
   93|      1|    { }
_ZN4Ogre32ScreenRatioPixelCountLodStrategyC2Ev:
  172|      1|        : PixelCountLodStrategyBase("screen_ratio_pixel_count")
  173|      1|    { }

_ZN4Ogre9PixelUtil8getFlagsENS_11PixelFormatE:
  198|   340k|    {
  199|   340k|        return getDescriptionFor(format).flags;
  200|   340k|    }
_ZN4Ogre9PixelUtil12isCompressedENS_11PixelFormatE:
  218|   340k|    {
  219|   340k|        return (PixelUtil::getFlags(format) & PFF_COMPRESSED) > 0;
  220|   340k|    }
_ZN4Ogre9PixelUtil13getFormatNameENS_11PixelFormatE:
  265|   221k|    {
  266|   221k|        return getDescriptionFor(srcformat).name;
  267|   221k|    }
_ZN4Ogre9PixelUtil12isAccessibleENS_11PixelFormatE:
  270|   344k|    {
  271|   344k|        return (srcformat != PF_UNKNOWN) && !isCompressed(srcformat);
  ------------------
  |  Branch (271:16): [True: 340k, False: 3.82k]
  |  Branch (271:45): [True: 221k, False: 119k]
  ------------------
  272|   344k|    }
_ZN4Ogre9PixelUtil17getFormatFromNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEbb:
  287|  3.82k|    {
  288|  3.82k|        String tmp = name;
  289|  3.82k|        if (!caseSensitive)
  ------------------
  |  Branch (289:13): [True: 3.82k, False: 0]
  ------------------
  290|  3.82k|        {
  291|       |            // We are stored upper-case format names.
  292|  3.82k|            StringUtil::toUpperCase(tmp);
  293|  3.82k|        }
  294|       |
  295|   347k|        for (int i = 0; i < PF_COUNT; ++i)
  ------------------
  |  Branch (295:25): [True: 344k, False: 2.94k]
  ------------------
  296|   344k|        {
  297|   344k|            PixelFormat pf = static_cast<PixelFormat>(i);
  298|   344k|            if (!accessibleOnly || isAccessible(pf))
  ------------------
  |  Branch (298:17): [True: 0, False: 344k]
  |  Branch (298:36): [True: 221k, False: 122k]
  ------------------
  299|   221k|            {
  300|   221k|                if (tmp == getFormatName(pf))
  ------------------
  |  Branch (300:21): [True: 877, False: 220k]
  ------------------
  301|    877|                    return pf;
  302|   221k|            }
  303|   344k|        }
  304|       |
  305|       |        // allow look-up by alias name
  306|  2.94k|        if(tmp == "PF_BYTE_RGB")
  ------------------
  |  Branch (306:12): [True: 1.01k, False: 1.93k]
  ------------------
  307|  1.01k|            return PF_BYTE_RGB;
  308|  1.93k|        if(tmp == "PF_BYTE_RGBA")
  ------------------
  |  Branch (308:12): [True: 1.52k, False: 413]
  ------------------
  309|  1.52k|            return PF_BYTE_RGBA;
  310|    413|        if(tmp == "PF_BYTE_BGR")
  ------------------
  |  Branch (310:12): [True: 0, False: 413]
  ------------------
  311|      0|            return PF_BYTE_BGR;
  312|    413|        if(tmp == "PF_BYTE_BGRA")
  ------------------
  |  Branch (312:12): [True: 0, False: 413]
  ------------------
  313|      0|            return PF_BYTE_BGRA;
  314|       |
  315|    413|        return PF_UNKNOWN;
  316|    413|    }
OgrePixelFormat.cpp:_ZN4OgreL17getDescriptionForENS_11PixelFormatE:
   88|   561k|    {
   89|   561k|        const int ord = (int)fmt;
   90|   561k|        assert(ord>=0 && ord<PF_COUNT);
   91|       |
   92|   561k|        return _pixelFormats[ord];
   93|   561k|    }

_ZN4Ogre19PlatformInformation16getCpuIdentifierEv:
  655|      2|    {
  656|      2|        static const String sIdentifier = _detectCpuIdentifier();
  657|      2|        return sIdentifier;
  658|      2|    }
_ZN4Ogre19PlatformInformation14getCpuFeaturesEv:
  661|      2|    {
  662|      2|        static const uint sFeatures = _detectCpuFeatures();
  663|      2|        return sFeatures;
  664|      2|    }
OgrePlatformInformation.cpp:_ZN4OgreL20_detectCpuIdentifierEv:
  427|      2|    {
  428|       |        // Supports CPUID instruction ?
  429|      2|        if (_isSupportCpuid())
  ------------------
  |  Branch (429:13): [True: 2, False: 0]
  ------------------
  430|      2|        {
  431|      2|            CpuidResult result;
  432|      2|            uint nExIds;
  433|      2|            char CPUString[0x20];
  434|      2|            char CPUBrandString[0x40];
  435|       |
  436|      2|            StringStream detailedIdentStr;
  437|       |
  438|       |
  439|       |            // Has standard feature ?
  440|      2|            if (_performCpuid(0, result))
  ------------------
  |  Branch (440:17): [True: 2, False: 0]
  ------------------
  441|      2|            {
  442|      2|                memset(CPUString, 0, sizeof(CPUString));
  443|      2|                memset(CPUBrandString, 0, sizeof(CPUBrandString));
  444|       |
  445|       |                //*((int*)CPUString) = result._ebx;
  446|       |                //*((int*)(CPUString+4)) = result._edx;
  447|       |                //*((int*)(CPUString+8)) = result._ecx;
  448|      2|                memcpy(CPUString, &result._ebx, sizeof(int));
  449|      2|                memcpy(CPUString+4, &result._edx, sizeof(int));
  450|      2|                memcpy(CPUString+8, &result._ecx, sizeof(int));
  451|       |
  452|      2|                detailedIdentStr << CPUString;
  453|       |
  454|       |                // Calling _performCpuid with 0x80000000 as the query argument
  455|       |                // gets the number of valid extended IDs.
  456|      2|                nExIds = _performCpuid(0x80000000, result);
  457|       |
  458|     20|                for (uint i=0x80000000; i<=nExIds; ++i)
  ------------------
  |  Branch (458:41): [True: 18, False: 2]
  ------------------
  459|     18|                {
  460|     18|                    _performCpuid(i, result);
  461|       |
  462|       |                    // Interpret CPU brand string and cache information.
  463|     18|                    if  (i == 0x80000002)
  ------------------
  |  Branch (463:26): [True: 2, False: 16]
  ------------------
  464|      2|                    {
  465|      2|                        memcpy(CPUBrandString + 0, &result._eax, sizeof(result._eax));
  466|      2|                        memcpy(CPUBrandString + 4, &result._ebx, sizeof(result._ebx));
  467|      2|                        memcpy(CPUBrandString + 8, &result._ecx, sizeof(result._ecx));
  468|      2|                        memcpy(CPUBrandString + 12, &result._edx, sizeof(result._edx));
  469|      2|                    }
  470|     16|                    else if  (i == 0x80000003)
  ------------------
  |  Branch (470:31): [True: 2, False: 14]
  ------------------
  471|      2|                    {
  472|      2|                        memcpy(CPUBrandString + 16 + 0, &result._eax, sizeof(result._eax));
  473|      2|                        memcpy(CPUBrandString + 16 + 4, &result._ebx, sizeof(result._ebx));
  474|      2|                        memcpy(CPUBrandString + 16 + 8, &result._ecx, sizeof(result._ecx));
  475|      2|                        memcpy(CPUBrandString + 16 + 12, &result._edx, sizeof(result._edx));
  476|      2|                    }
  477|     14|                    else if  (i == 0x80000004)
  ------------------
  |  Branch (477:31): [True: 2, False: 12]
  ------------------
  478|      2|                    {
  479|      2|                        memcpy(CPUBrandString + 32 + 0, &result._eax, sizeof(result._eax));
  480|      2|                        memcpy(CPUBrandString + 32 + 4, &result._ebx, sizeof(result._ebx));
  481|      2|                        memcpy(CPUBrandString + 32 + 8, &result._ecx, sizeof(result._ecx));
  482|      2|                        memcpy(CPUBrandString + 32 + 12, &result._edx, sizeof(result._edx));
  483|      2|                    }
  484|     18|                }
  485|       |
  486|      2|                String brand(CPUBrandString);
  487|      2|                StringUtil::trim(brand);
  488|      2|                if (!brand.empty())
  ------------------
  |  Branch (488:21): [True: 2, False: 0]
  ------------------
  489|      2|                    detailedIdentStr << ": " << brand;
  490|       |
  491|      2|                return detailedIdentStr.str();
  492|      2|            }
  493|      2|        }
  494|       |
  495|      0|        return "X86";
  496|      2|    }
OgrePlatformInformation.cpp:_ZN4OgreL13_performCpuidEiRNS_11CpuidResultE:
  151|     30|    {
  152|       |#if OGRE_COMPILER == OGRE_COMPILER_MSVC
  153|       |        int CPUInfo[4];
  154|       |        __cpuid(CPUInfo, query);
  155|       |        result._eax = CPUInfo[0];
  156|       |        result._ebx = CPUInfo[1];
  157|       |        result._ecx = CPUInfo[2];
  158|       |        result._edx = CPUInfo[3];
  159|       |        return result._eax;
  160|       |#elif (OGRE_COMPILER == OGRE_COMPILER_GNUC || OGRE_COMPILER == OGRE_COMPILER_CLANG) && OGRE_PLATFORM != OGRE_PLATFORM_EMSCRIPTEN
  161|       |        #if OGRE_ARCH_TYPE == OGRE_ARCHITECTURE_64
  162|     30|        __asm__
  163|     30|        (
  164|     30|            "cpuid": "=a" (result._eax), "=b" (result._ebx), "=c" (result._ecx), "=d" (result._edx) : "a" (query)
  165|     30|        );
  166|       |        #else
  167|       |        __asm__
  168|       |        (
  169|       |            "pushl  %%ebx           \n\t"
  170|       |            "cpuid                  \n\t"
  171|       |            "movl   %%ebx, %%edi    \n\t"
  172|       |            "popl   %%ebx           \n\t"
  173|       |            : "=a" (result._eax), "=D" (result._ebx), "=c" (result._ecx), "=d" (result._edx)
  174|       |            : "a" (query)
  175|       |        );
  176|       |       #endif // OGRE_ARCHITECTURE_64
  177|     30|        return result._eax;
  178|       |
  179|       |#else
  180|       |        // TODO: Supports other compiler
  181|       |        return 0;
  182|       |#endif
  183|     30|    }
OgrePlatformInformation.cpp:_ZN4OgreL18_detectCpuFeaturesEv:
  408|      2|    {
  409|      2|        uint features = queryCpuFeatures();
  410|       |
  411|      2|        const uint sse_features = 0
  412|      2|            | PlatformInformation::CPU_FEATURE_SSE
  413|      2|            | PlatformInformation::CPU_FEATURE_SSE2
  414|      2|            | PlatformInformation::CPU_FEATURE_SSE3
  415|      2|            | PlatformInformation::CPU_FEATURE_SSE41
  416|      2|            | PlatformInformation::CPU_FEATURE_SSE42;
  417|       |
  418|      2|        if ((features & sse_features) && !_checkOperatingSystemSupportSSE())
  ------------------
  |  Branch (418:13): [True: 2, False: 0]
  |  Branch (418:42): [True: 0, False: 2]
  ------------------
  419|      0|        {
  420|      0|            features &= ~sse_features;
  421|      0|        }
  422|       |
  423|      2|        return features;
  424|      2|    }
OgrePlatformInformation.cpp:_ZN4OgreL16queryCpuFeaturesEv:
  266|      2|    {
  267|       |
  268|      2|#define CPUID_FUNC_VENDOR_ID                 0x0
  269|      2|#define CPUID_FUNC_STANDARD_FEATURES         0x1
  270|      2|#define CPUID_FUNC_EXTENSION_QUERY           0x80000000
  271|      2|#define CPUID_FUNC_EXTENDED_FEATURES         0x80000001
  272|      2|#define CPUID_FUNC_ADVANCED_POWER_MANAGEMENT 0x80000007
  273|       |
  274|      2|#define CPUID_STD_FPU               (1<<0)
  275|      2|#define CPUID_STD_TSC               (1<<4)
  276|      2|#define CPUID_STD_CMOV              (1<<15)
  277|      2|#define CPUID_STD_MMX               (1<<23)
  278|      2|#define CPUID_STD_SSE               (1<<25)
  279|      2|#define CPUID_STD_SSE2              (1<<26)
  280|      2|#define CPUID_STD_HTT               (1<<28)     // EDX[28] - Bit 28 set indicates  Hyper-Threading Technology is supported in hardware.
  281|       |
  282|      2|#define CPUID_STD_SSE3              (1<<0)      // ECX[0]  - Bit 0 of standard function 1 indicate SSE3 supported
  283|      2|#define CPUID_STD_SSE41             (1<<19)     // ECX[19] - Bit 0 of standard function 1 indicate SSE41 supported
  284|      2|#define CPUID_STD_SSE42             (1<<20)     // ECX[20] - Bit 0 of standard function 1 indicate SSE42 supported
  285|       |
  286|      2|#define CPUID_FAMILY_ID_MASK        0x0F00      // EAX[11:8] - Bit 11 thru 8 contains family  processor id
  287|      2|#define CPUID_EXT_FAMILY_ID_MASK    0x0F00000   // EAX[23:20] - Bit 23 thru 20 contains extended family processor id
  288|      2|#define CPUID_PENTIUM4_ID           0x0F00      // Pentium 4 family processor id
  289|       |
  290|      2|#define CPUID_EXT_3DNOW             (1<<31)
  291|      2|#define CPUID_EXT_AMD_3DNOWEXT      (1<<30)
  292|      2|#define CPUID_EXT_AMD_MMXEXT        (1<<22)
  293|       |
  294|       |
  295|      2|#define CPUID_APM_INVARIANT_TSC     (1<<8)      // EDX[8] - Bit 8 of function 0x80000007 indicates support for invariant TSC.
  296|       |
  297|      2|        uint features = 0;
  298|       |
  299|       |        // Supports CPUID instruction ?
  300|      2|        if (_isSupportCpuid())
  ------------------
  |  Branch (300:13): [True: 2, False: 0]
  ------------------
  301|      2|        {
  302|      2|            CpuidResult result;
  303|       |
  304|       |            // Has standard feature ?
  305|      2|            if (_performCpuid(CPUID_FUNC_VENDOR_ID, result))
  ------------------
  |  |  268|      2|#define CPUID_FUNC_VENDOR_ID                 0x0
  ------------------
  |  Branch (305:17): [True: 2, False: 0]
  ------------------
  306|      2|            {
  307|       |                // Check vendor strings
  308|      2|                if (memcmp(&result._ebx, "GenuineIntel", 12) == 0)
  ------------------
  |  Branch (308:21): [True: 2, False: 0]
  ------------------
  309|      2|                {
  310|      2|                    if (result._eax > 2)
  ------------------
  |  Branch (310:25): [True: 2, False: 0]
  ------------------
  311|      2|                        features |= PlatformInformation::CPU_FEATURE_PRO;
  312|       |
  313|       |                    // Check standard feature
  314|      2|                    _performCpuid(CPUID_FUNC_STANDARD_FEATURES, result);
  ------------------
  |  |  269|      2|#define CPUID_FUNC_STANDARD_FEATURES         0x1
  ------------------
  315|       |
  316|      2|                    if (result._edx & CPUID_STD_FPU)
  ------------------
  |  |  274|      2|#define CPUID_STD_FPU               (1<<0)
  ------------------
  |  Branch (316:25): [True: 2, False: 0]
  ------------------
  317|      2|                        features |= PlatformInformation::CPU_FEATURE_FPU;
  318|      2|                    if (result._edx & CPUID_STD_TSC)
  ------------------
  |  |  275|      2|#define CPUID_STD_TSC               (1<<4)
  ------------------
  |  Branch (318:25): [True: 2, False: 0]
  ------------------
  319|      2|                        features |= PlatformInformation::CPU_FEATURE_TSC;
  320|      2|                    if (result._edx & CPUID_STD_CMOV)
  ------------------
  |  |  276|      2|#define CPUID_STD_CMOV              (1<<15)
  ------------------
  |  Branch (320:25): [True: 2, False: 0]
  ------------------
  321|      2|                        features |= PlatformInformation::CPU_FEATURE_CMOV;
  322|      2|                    if (result._edx & CPUID_STD_MMX)
  ------------------
  |  |  277|      2|#define CPUID_STD_MMX               (1<<23)
  ------------------
  |  Branch (322:25): [True: 2, False: 0]
  ------------------
  323|      2|                        features |= PlatformInformation::CPU_FEATURE_MMX;
  324|      2|                    if (result._edx & CPUID_STD_SSE)
  ------------------
  |  |  278|      2|#define CPUID_STD_SSE               (1<<25)
  ------------------
  |  Branch (324:25): [True: 2, False: 0]
  ------------------
  325|      2|                        features |= PlatformInformation::CPU_FEATURE_MMXEXT | PlatformInformation::CPU_FEATURE_SSE;
  326|      2|                    if (result._edx & CPUID_STD_SSE2)
  ------------------
  |  |  279|      2|#define CPUID_STD_SSE2              (1<<26)
  ------------------
  |  Branch (326:25): [True: 2, False: 0]
  ------------------
  327|      2|                        features |= PlatformInformation::CPU_FEATURE_SSE2;
  328|      2|                    if (result._ecx & CPUID_STD_SSE3)
  ------------------
  |  |  282|      2|#define CPUID_STD_SSE3              (1<<0)      // ECX[0]  - Bit 0 of standard function 1 indicate SSE3 supported
  ------------------
  |  Branch (328:25): [True: 2, False: 0]
  ------------------
  329|      2|                        features |= PlatformInformation::CPU_FEATURE_SSE3;
  330|      2|                    if (result._ecx & CPUID_STD_SSE41)
  ------------------
  |  |  283|      2|#define CPUID_STD_SSE41             (1<<19)     // ECX[19] - Bit 0 of standard function 1 indicate SSE41 supported
  ------------------
  |  Branch (330:25): [True: 2, False: 0]
  ------------------
  331|      2|                        features |= PlatformInformation::CPU_FEATURE_SSE41;
  332|      2|                    if (result._ecx & CPUID_STD_SSE42)
  ------------------
  |  |  284|      2|#define CPUID_STD_SSE42             (1<<20)     // ECX[20] - Bit 0 of standard function 1 indicate SSE42 supported
  ------------------
  |  Branch (332:25): [True: 2, False: 0]
  ------------------
  333|      2|                        features |= PlatformInformation::CPU_FEATURE_SSE42;
  334|       |
  335|       |                    // Check to see if this is a Pentium 4 or later processor
  336|      2|                    if ((result._eax & CPUID_EXT_FAMILY_ID_MASK) ||
  ------------------
  |  |  287|      2|#define CPUID_EXT_FAMILY_ID_MASK    0x0F00000   // EAX[23:20] - Bit 23 thru 20 contains extended family processor id
  ------------------
  |  Branch (336:25): [True: 0, False: 2]
  ------------------
  337|      2|                        (result._eax & CPUID_FAMILY_ID_MASK) == CPUID_PENTIUM4_ID)
  ------------------
  |  |  286|      2|#define CPUID_FAMILY_ID_MASK        0x0F00      // EAX[11:8] - Bit 11 thru 8 contains family  processor id
  ------------------
                                      (result._eax & CPUID_FAMILY_ID_MASK) == CPUID_PENTIUM4_ID)
  ------------------
  |  |  288|      2|#define CPUID_PENTIUM4_ID           0x0F00      // Pentium 4 family processor id
  ------------------
  |  Branch (337:25): [True: 0, False: 2]
  ------------------
  338|      0|                    {
  339|       |                        // Check hyper-threading technology
  340|      0|                        if (result._edx & CPUID_STD_HTT)
  ------------------
  |  |  280|      0|#define CPUID_STD_HTT               (1<<28)     // EDX[28] - Bit 28 set indicates  Hyper-Threading Technology is supported in hardware.
  ------------------
  |  Branch (340:29): [True: 0, False: 0]
  ------------------
  341|      0|                            features |= PlatformInformation::CPU_FEATURE_HTT;
  342|      0|                    }
  343|       |
  344|       |
  345|      2|                    const uint maxExtensionFunctionSupport = _performCpuid(CPUID_FUNC_EXTENSION_QUERY, result);
  ------------------
  |  |  270|      2|#define CPUID_FUNC_EXTENSION_QUERY           0x80000000
  ------------------
  346|      2|                    if (maxExtensionFunctionSupport >= CPUID_FUNC_ADVANCED_POWER_MANAGEMENT)
  ------------------
  |  |  272|      2|#define CPUID_FUNC_ADVANCED_POWER_MANAGEMENT 0x80000007
  ------------------
  |  Branch (346:25): [True: 2, False: 0]
  ------------------
  347|      2|                    {
  348|      2|                        _performCpuid(CPUID_FUNC_ADVANCED_POWER_MANAGEMENT, result);
  ------------------
  |  |  272|      2|#define CPUID_FUNC_ADVANCED_POWER_MANAGEMENT 0x80000007
  ------------------
  349|       |
  350|      2|                        if (result._edx & CPUID_APM_INVARIANT_TSC)
  ------------------
  |  |  295|      2|#define CPUID_APM_INVARIANT_TSC     (1<<8)      // EDX[8] - Bit 8 of function 0x80000007 indicates support for invariant TSC.
  ------------------
  |  Branch (350:29): [True: 2, False: 0]
  ------------------
  351|      2|                            features |= PlatformInformation::CPU_FEATURE_INVARIANT_TSC;
  352|      2|                    }
  353|      2|                }
  354|      0|                else if (memcmp(&result._ebx, "AuthenticAMD", 12) == 0)
  ------------------
  |  Branch (354:26): [True: 0, False: 0]
  ------------------
  355|      0|                {
  356|      0|                    features |= PlatformInformation::CPU_FEATURE_PRO;
  357|       |
  358|       |                    // Check standard feature
  359|      0|                    _performCpuid(CPUID_FUNC_STANDARD_FEATURES, result);
  ------------------
  |  |  269|      0|#define CPUID_FUNC_STANDARD_FEATURES         0x1
  ------------------
  360|       |
  361|      0|                    if (result._edx & CPUID_STD_FPU)
  ------------------
  |  |  274|      0|#define CPUID_STD_FPU               (1<<0)
  ------------------
  |  Branch (361:25): [True: 0, False: 0]
  ------------------
  362|      0|                        features |= PlatformInformation::CPU_FEATURE_FPU;
  363|      0|                    if (result._edx & CPUID_STD_TSC)
  ------------------
  |  |  275|      0|#define CPUID_STD_TSC               (1<<4)
  ------------------
  |  Branch (363:25): [True: 0, False: 0]
  ------------------
  364|      0|                        features |= PlatformInformation::CPU_FEATURE_TSC;
  365|      0|                    if (result._edx & CPUID_STD_CMOV)
  ------------------
  |  |  276|      0|#define CPUID_STD_CMOV              (1<<15)
  ------------------
  |  Branch (365:25): [True: 0, False: 0]
  ------------------
  366|      0|                        features |= PlatformInformation::CPU_FEATURE_CMOV;
  367|      0|                    if (result._edx & CPUID_STD_MMX)
  ------------------
  |  |  277|      0|#define CPUID_STD_MMX               (1<<23)
  ------------------
  |  Branch (367:25): [True: 0, False: 0]
  ------------------
  368|      0|                        features |= PlatformInformation::CPU_FEATURE_MMX;
  369|      0|                    if (result._edx & CPUID_STD_SSE)
  ------------------
  |  |  278|      0|#define CPUID_STD_SSE               (1<<25)
  ------------------
  |  Branch (369:25): [True: 0, False: 0]
  ------------------
  370|      0|                        features |= PlatformInformation::CPU_FEATURE_SSE;
  371|      0|                    if (result._edx & CPUID_STD_SSE2)
  ------------------
  |  |  279|      0|#define CPUID_STD_SSE2              (1<<26)
  ------------------
  |  Branch (371:25): [True: 0, False: 0]
  ------------------
  372|      0|                        features |= PlatformInformation::CPU_FEATURE_SSE2;
  373|       |
  374|      0|                    if (result._ecx & CPUID_STD_SSE3)
  ------------------
  |  |  282|      0|#define CPUID_STD_SSE3              (1<<0)      // ECX[0]  - Bit 0 of standard function 1 indicate SSE3 supported
  ------------------
  |  Branch (374:25): [True: 0, False: 0]
  ------------------
  375|      0|                        features |= PlatformInformation::CPU_FEATURE_SSE3;
  376|       |
  377|       |                    // Has extended feature ?
  378|      0|                    const uint maxExtensionFunctionSupport = _performCpuid(CPUID_FUNC_EXTENSION_QUERY, result);
  ------------------
  |  |  270|      0|#define CPUID_FUNC_EXTENSION_QUERY           0x80000000
  ------------------
  379|      0|                    if (maxExtensionFunctionSupport >= CPUID_FUNC_EXTENDED_FEATURES)
  ------------------
  |  |  271|      0|#define CPUID_FUNC_EXTENDED_FEATURES         0x80000001
  ------------------
  |  Branch (379:25): [True: 0, False: 0]
  ------------------
  380|      0|                    {
  381|       |                        // Check extended feature
  382|      0|                        _performCpuid(CPUID_FUNC_EXTENDED_FEATURES, result);
  ------------------
  |  |  271|      0|#define CPUID_FUNC_EXTENDED_FEATURES         0x80000001
  ------------------
  383|       |
  384|      0|                        if (result._edx & CPUID_EXT_3DNOW)
  ------------------
  |  |  290|      0|#define CPUID_EXT_3DNOW             (1<<31)
  ------------------
  |  Branch (384:29): [True: 0, False: 0]
  ------------------
  385|      0|                            features |= PlatformInformation::CPU_FEATURE_3DNOW;
  386|      0|                        if (result._edx & CPUID_EXT_AMD_3DNOWEXT)
  ------------------
  |  |  291|      0|#define CPUID_EXT_AMD_3DNOWEXT      (1<<30)
  ------------------
  |  Branch (386:29): [True: 0, False: 0]
  ------------------
  387|      0|                            features |= PlatformInformation::CPU_FEATURE_3DNOWEXT;
  388|      0|                        if (result._edx & CPUID_EXT_AMD_MMXEXT)
  ------------------
  |  |  292|      0|#define CPUID_EXT_AMD_MMXEXT        (1<<22)
  ------------------
  |  Branch (388:29): [True: 0, False: 0]
  ------------------
  389|      0|                            features |= PlatformInformation::CPU_FEATURE_MMXEXT;
  390|      0|                    }
  391|       |
  392|       |
  393|      0|                    if (maxExtensionFunctionSupport >= CPUID_FUNC_ADVANCED_POWER_MANAGEMENT)
  ------------------
  |  |  272|      0|#define CPUID_FUNC_ADVANCED_POWER_MANAGEMENT 0x80000007
  ------------------
  |  Branch (393:25): [True: 0, False: 0]
  ------------------
  394|      0|                    {
  395|      0|                        _performCpuid(CPUID_FUNC_ADVANCED_POWER_MANAGEMENT, result);
  ------------------
  |  |  272|      0|#define CPUID_FUNC_ADVANCED_POWER_MANAGEMENT 0x80000007
  ------------------
  396|       |
  397|      0|                        if (result._edx & CPUID_APM_INVARIANT_TSC)
  ------------------
  |  |  295|      0|#define CPUID_APM_INVARIANT_TSC     (1<<8)      // EDX[8] - Bit 8 of function 0x80000007 indicates support for invariant TSC.
  ------------------
  |  Branch (397:29): [True: 0, False: 0]
  ------------------
  398|      0|                            features |= PlatformInformation::CPU_FEATURE_INVARIANT_TSC;
  399|      0|                    }
  400|      0|                }
  401|      2|            }
  402|      2|        }
  403|       |
  404|      2|        return features;
  405|      2|    }
OgrePlatformInformation.cpp:_ZN4OgreL31_checkOperatingSystemSupportSSEEv:
  202|      2|    {
  203|       |#if OGRE_COMPILER == OGRE_COMPILER_MSVC
  204|       |        /*
  205|       |            The FP part of SSE introduces a new architectural state and therefore
  206|       |            requires support from the operating system. So even if CPUID indicates
  207|       |            support for SSE FP, the application might not be able to use it. If
  208|       |            CPUID indicates support for SSE FP, check here whether it is also
  209|       |            supported by the OS, and turn off the SSE FP feature bit if there
  210|       |            is no OS support for SSE FP.
  211|       |
  212|       |            Operating systems that do not support SSE FP return an illegal
  213|       |            instruction exception if execution of an SSE FP instruction is performed.
  214|       |            Here, a sample SSE FP instruction is executed, and is checked for an
  215|       |            exception using the (non-standard) __try/__except mechanism
  216|       |            of Microsoft Visual C/C++.
  217|       |        */
  218|       |        // Visual Studio 2005, Both AMD and Intel x64 support SSE
  219|       |        // note that even though this is a build rather than runtime setting, all
  220|       |        // 64-bit CPUs support this so since binary is 64-bit only we're ok
  221|       |    #if _MSC_VER >= 1400 && defined(_M_X64)
  222|       |            return true;
  223|       |    #else
  224|       |        __try
  225|       |        {
  226|       |            __asm orps  xmm0, xmm0
  227|       |            return true;
  228|       |        }
  229|       |        __except(EXCEPTION_EXECUTE_HANDLER)
  230|       |        {
  231|       |            return false;
  232|       |        }
  233|       |    #endif
  234|       |#elif (OGRE_COMPILER == OGRE_COMPILER_GNUC || OGRE_COMPILER == OGRE_COMPILER_CLANG) && OGRE_PLATFORM != OGRE_PLATFORM_EMSCRIPTEN
  235|       |        #if OGRE_ARCH_TYPE == OGRE_ARCHITECTURE_64 
  236|      2|            return true;
  237|       |        #else
  238|       |        // Does gcc have __try/__except similar mechanism?
  239|       |        // Use signal, setjmp/longjmp instead.
  240|       |        void (*oldHandler)(int);
  241|       |        oldHandler = signal(SIGILL, _illegalHandler);
  242|       |
  243|       |        if (setjmp(sIllegalJmpBuf))
  244|       |        {
  245|       |            signal(SIGILL, oldHandler);
  246|       |            return false;
  247|       |        }
  248|       |        else
  249|       |        {
  250|       |            __asm__ __volatile__ ("orps %xmm0, %xmm0");
  251|       |            signal(SIGILL, oldHandler);
  252|       |            return true;
  253|       |        }
  254|       |       #endif
  255|       |#else
  256|       |        // TODO: Supports other compiler, assumed is supported by default
  257|       |        return true;
  258|       |#endif
  259|      2|    }
OgrePlatformInformation.cpp:_ZN4OgreL15_isSupportCpuidEv:
   83|      4|    {
   84|       |#if OGRE_COMPILER == OGRE_COMPILER_MSVC
   85|       |        // Visual Studio 2005 & 64-bit compilers always supports __cpuid intrinsic
   86|       |        // note that even though this is a build rather than runtime setting, all
   87|       |        // 64-bit CPUs support this so since binary is 64-bit only we're ok
   88|       |    #if _MSC_VER >= 1400 && defined(_M_X64)
   89|       |        return true;
   90|       |    #else
   91|       |        // If we can modify flag register bit 21, the cpu is supports CPUID instruction
   92|       |        __asm
   93|       |        {
   94|       |            // Read EFLAG
   95|       |            pushfd
   96|       |            pop     eax
   97|       |            mov     ecx, eax
   98|       |
   99|       |            // Modify bit 21
  100|       |            xor     eax, 0x200000
  101|       |            push    eax
  102|       |            popfd
  103|       |
  104|       |            // Read back EFLAG
  105|       |            pushfd
  106|       |            pop     eax
  107|       |
  108|       |            // Restore EFLAG
  109|       |            push    ecx
  110|       |            popfd
  111|       |
  112|       |            // Check bit 21 modifiable
  113|       |            xor     eax, ecx
  114|       |            neg     eax
  115|       |            sbb     eax, eax
  116|       |
  117|       |            // Return values in eax, no return statement requirement here for VC.
  118|       |        }
  119|       |    #endif
  120|       |#elif (OGRE_COMPILER == OGRE_COMPILER_GNUC || OGRE_COMPILER == OGRE_COMPILER_CLANG) && OGRE_PLATFORM != OGRE_PLATFORM_EMSCRIPTEN
  121|       |        #if OGRE_ARCH_TYPE == OGRE_ARCHITECTURE_64
  122|      4|           return true;
  123|       |       #else
  124|       |        unsigned oldFlags, newFlags;
  125|       |        __asm__
  126|       |        (
  127|       |            "pushfl         \n\t"
  128|       |            "pop    %0      \n\t"
  129|       |            "mov    %0, %1  \n\t"
  130|       |            "xor    %2, %0  \n\t"
  131|       |            "push   %0      \n\t"
  132|       |            "popfl          \n\t"
  133|       |            "pushfl         \n\t"
  134|       |            "pop    %0      \n\t"
  135|       |            "push   %1      \n\t"
  136|       |            "popfl          \n\t"
  137|       |            : "=r" (oldFlags), "=r" (newFlags)
  138|       |            : "n" (0x200000)
  139|       |        );
  140|       |        return oldFlags != newFlags;
  141|       |       #endif // 64
  142|       |#else
  143|       |        // TODO: Supports other compiler
  144|       |        return false;
  145|       |#endif
  146|      4|    }

_ZN4Ogre24RenderSystemCapabilities16vendorFromStringERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  265|     10|    {
  266|     10|        initVendorStrings();
  267|     10|        GPUVendor ret = GPU_UNKNOWN;
  268|     10|        String cmpString = vendorString;
  269|     10|        StringUtil::toLowerCase(cmpString);
  270|    140|        for (int i = 0; i < GPU_VENDOR_COUNT; ++i)
  ------------------
  |  Branch (270:25): [True: 130, False: 10]
  ------------------
  271|    130|        {
  272|       |            // case insensitive (lower case)
  273|    130|            if (msGPUVendorStrings[i] == cmpString)
  ------------------
  |  Branch (273:17): [True: 0, False: 130]
  ------------------
  274|      0|            {
  275|      0|                ret = static_cast<GPUVendor>(i);
  276|      0|                break;
  277|      0|            }
  278|    130|        }
  279|       |
  280|     10|        return ret;
  281|       |        
  282|     10|    }
_ZN4Ogre24RenderSystemCapabilities17initVendorStringsEv:
  291|     10|    {
  292|     10|        if (msGPUVendorStrings[0].empty())
  ------------------
  |  Branch (292:13): [True: 1, False: 9]
  ------------------
  293|      1|        {
  294|       |            // Always lower case!
  295|      1|            msGPUVendorStrings[GPU_UNKNOWN] = "unknown";
  296|      1|            msGPUVendorStrings[GPU_NVIDIA] = "nvidia";
  297|      1|            msGPUVendorStrings[GPU_AMD] = "amd";
  298|      1|            msGPUVendorStrings[GPU_INTEL] = "intel";
  299|      1|            msGPUVendorStrings[GPU_IMAGINATION_TECHNOLOGIES] = "imagination technologies";
  300|      1|            msGPUVendorStrings[GPU_APPLE] = "apple";    // iOS Simulator
  301|      1|            msGPUVendorStrings[GPU_NOKIA] = "nokia";
  302|      1|            msGPUVendorStrings[GPU_MS_SOFTWARE] = "microsoft"; // Microsoft software device
  303|      1|            msGPUVendorStrings[GPU_MS_WARP] = "ms warp";
  304|      1|            msGPUVendorStrings[GPU_ARM] = "arm";
  305|      1|            msGPUVendorStrings[GPU_QUALCOMM] = "qualcomm";
  306|      1|            msGPUVendorStrings[GPU_MOZILLA] = "mozilla";
  307|      1|            msGPUVendorStrings[GPU_WEBKIT] = "webkit";
  308|      1|        }
  309|     10|    }

_ZN4Ogre31RenderSystemCapabilitiesManagerC2Ev:
   49|      1|    RenderSystemCapabilitiesManager::RenderSystemCapabilitiesManager() : mSerializer(0), mScriptPattern("*.rendercaps")
   50|      1|    {
   51|       |        mSerializer = OGRE_NEW RenderSystemCapabilitiesSerializer();
   52|      1|    }

_ZN4Ogre34RenderSystemCapabilitiesSerializerC2Ev:
   37|      1|    RenderSystemCapabilitiesSerializer::RenderSystemCapabilitiesSerializer() : mCurrentLineNumber(0), mCurrentLine(0),
   38|      1|        mCurrentCapabilities(0)
   39|      1|    {
   40|      1|        initialiaseDispatchTables();
   41|      1|    }
_ZN4Ogre34RenderSystemCapabilitiesSerializer25initialiaseDispatchTablesEv:
  264|      1|    {
  265|       |        // set up driver version parsing
  266|      1|        addKeywordType("driver_version", SET_STRING_METHOD);
  267|       |        // set up the setters for driver versions
  268|      1|        addSetStringMethod("driver_version", &RenderSystemCapabilities::parseDriverVersionFromString);
  269|       |        
  270|       |        // set up device name parsing
  271|      1|        addKeywordType("device_name", SET_STRING_METHOD);
  272|       |        // set up the setters for device names
  273|      1|        addSetStringMethod("device_name", &RenderSystemCapabilities::setDeviceName);
  274|       |        
  275|       |        // set up render system name parsing
  276|      1|        addKeywordType("render_system_name", SET_STRING_METHOD);
  277|       |        // set up the setters 
  278|      1|        addSetStringMethod("render_system_name", &RenderSystemCapabilities::setRenderSystemName);
  279|       |
  280|       |        // set up vendor parsing
  281|      1|        addKeywordType("vendor", SET_STRING_METHOD);
  282|       |        // set up the setters for driver versions
  283|      1|        addSetStringMethod("vendor", &RenderSystemCapabilities::parseVendorFromString);
  284|       |
  285|       |        // initialize int types
  286|      1|        addKeywordType("num_world_matrices", SET_INT_METHOD);
  287|      1|        addKeywordType("num_texture_units", SET_INT_METHOD);
  288|      1|        addKeywordType("stencil_buffer_bit_depth", SET_INT_METHOD);
  289|      1|        addKeywordType("num_vertex_blend_matrices", SET_INT_METHOD);
  290|      1|        addKeywordType("num_multi_render_targets", SET_INT_METHOD);
  291|      1|        addKeywordType("vertex_program_constant_float_count", SET_INT_METHOD);
  292|      1|        addKeywordType("vertex_program_constant_int_count", SET_INT_METHOD);
  293|      1|        addKeywordType("vertex_program_constant_bool_count", SET_INT_METHOD);
  294|      1|        addKeywordType("fragment_program_constant_float_count", SET_INT_METHOD);
  295|      1|        addKeywordType("fragment_program_constant_int_count", SET_INT_METHOD);
  296|      1|        addKeywordType("fragment_program_constant_bool_count", SET_INT_METHOD);
  297|      1|        addKeywordType("geometry_program_constant_float_count", SET_INT_METHOD);
  298|      1|        addKeywordType("geometry_program_constant_int_count", SET_INT_METHOD);
  299|      1|        addKeywordType("geometry_program_constant_bool_count", SET_INT_METHOD);
  300|      1|        addKeywordType("tessellation_hull_program_constant_float_count", SET_INT_METHOD);
  301|      1|        addKeywordType("tessellation_hull_program_constant_int_count", SET_INT_METHOD);
  302|      1|        addKeywordType("tessellation_hull_program_constant_bool_count", SET_INT_METHOD);
  303|      1|        addKeywordType("tessellation_domain_program_constant_float_count", SET_INT_METHOD);
  304|      1|        addKeywordType("tessellation_domain_program_constant_int_count", SET_INT_METHOD);
  305|      1|        addKeywordType("tessellation_domain_program_constant_bool_count", SET_INT_METHOD);
  306|      1|        addKeywordType("compute_program_constant_float_count", SET_INT_METHOD);
  307|      1|        addKeywordType("compute_program_constant_int_count", SET_INT_METHOD);
  308|      1|        addKeywordType("compute_program_constant_bool_count", SET_INT_METHOD);
  309|      1|        addKeywordType("num_vertex_texture_units", SET_INT_METHOD);
  310|       |
  311|       |        // initialize int setters
  312|      1|        addSetIntMethod("num_texture_units", &RenderSystemCapabilities::setNumTextureUnits);
  313|      1|        addSetIntMethod("stencil_buffer_bit_depth", &RenderSystemCapabilities::setStencilBufferBitDepth);
  314|      1|        addSetIntMethod("num_multi_render_targets", &RenderSystemCapabilities::setNumMultiRenderTargets);
  315|      1|        addSetIntMethod("vertex_program_constant_float_count", &RenderSystemCapabilities::setVertexProgramConstantFloatCount);
  316|      1|        addSetIntMethod("fragment_program_constant_float_count", &RenderSystemCapabilities::setFragmentProgramConstantFloatCount);
  317|      1|        addSetIntMethod("geometry_program_constant_float_count", &RenderSystemCapabilities::setGeometryProgramConstantFloatCount);
  318|      1|        addSetIntMethod("tessellation_hull_program_constant_float_count", &RenderSystemCapabilities::setTessellationHullProgramConstantFloatCount);
  319|      1|        addSetIntMethod("tessellation_domain_program_constant_float_count", &RenderSystemCapabilities::setTessellationDomainProgramConstantFloatCount);
  320|      1|        addSetIntMethod("compute_program_constant_float_count", &RenderSystemCapabilities::setComputeProgramConstantFloatCount);
  321|      1|        addSetIntMethod("num_vertex_texture_units", &RenderSystemCapabilities::setNumVertexTextureUnits);
  322|       |
  323|       |        // initialize bool types
  324|      1|        addKeywordType("non_pow2_textures_limited", SET_BOOL_METHOD);
  325|       |
  326|       |        // initialize bool setters
  327|      1|        addSetBoolMethod("non_pow2_textures_limited", &RenderSystemCapabilities::setNonPOW2TexturesLimited);
  328|       |
  329|       |        // initialize Real types
  330|      1|        addKeywordType("max_point_size", SET_REAL_METHOD);
  331|       |
  332|       |        // initialize Real setters
  333|      1|        addSetRealMethod("max_point_size", &RenderSystemCapabilities::setMaxPointSize);
  334|       |
  335|       |        // there is no dispatch table for shader profiles, just the type
  336|      1|        addKeywordType("shader_profile", ADD_SHADER_PROFILE_STRING);
  337|       |
  338|      1|        addCapabilitiesMapping("fixed_function", RSC_FIXED_FUNCTION);
  339|      1|        addCapabilitiesMapping("anisotropy", RSC_ANISOTROPY);
  340|      1|        addCapabilitiesMapping("hwstencil", RSC_HWSTENCIL);
  341|      1|        addCapabilitiesMapping("32bit_index", RSC_32BIT_INDEX);
  342|      1|        addCapabilitiesMapping("vertex_program", RSC_VERTEX_PROGRAM);
  343|      1|        addCapabilitiesMapping("geometry_program", RSC_GEOMETRY_PROGRAM);
  344|      1|        addCapabilitiesMapping("tessellation_hull_program", RSC_TESSELLATION_HULL_PROGRAM);
  345|      1|        addCapabilitiesMapping("tessellation_domain_program", RSC_TESSELLATION_DOMAIN_PROGRAM);
  346|      1|        addCapabilitiesMapping("compute_program", RSC_COMPUTE_PROGRAM);
  347|      1|        addCapabilitiesMapping("two_sided_stencil", RSC_TWO_SIDED_STENCIL);
  348|      1|        addCapabilitiesMapping("stencil_wrap", RSC_STENCIL_WRAP);
  349|      1|        addCapabilitiesMapping("hwocclusion", RSC_HWOCCLUSION);
  350|      1|        addCapabilitiesMapping("user_clip_planes", RSC_USER_CLIP_PLANES);
  351|      1|        addCapabilitiesMapping("hwrender_to_texture", RSC_HWRENDER_TO_TEXTURE);
  352|      1|        addCapabilitiesMapping("texture_float", RSC_TEXTURE_FLOAT);
  353|      1|        addCapabilitiesMapping("non_power_of_2_textures", RSC_NON_POWER_OF_2_TEXTURES);
  354|      1|        addCapabilitiesMapping("texture_3d", RSC_TEXTURE_3D);
  355|      1|        addCapabilitiesMapping("texture_2d_array", RSC_TEXTURE_3D);
  356|      1|        addCapabilitiesMapping("texture_1d", RSC_TEXTURE_1D);
  357|      1|        addCapabilitiesMapping("point_sprites", RSC_POINT_SPRITES);
  358|      1|        addCapabilitiesMapping("wide_lines", RSC_WIDE_LINES);
  359|      1|        addCapabilitiesMapping("vertex_texture_fetch", RSC_VERTEX_TEXTURE_FETCH);
  360|      1|        addCapabilitiesMapping("mipmap_lod_bias", RSC_MIPMAP_LOD_BIAS);
  361|      1|        addCapabilitiesMapping("atomic_counters", RSC_READ_WRITE_BUFFERS);
  362|      1|        addCapabilitiesMapping("texture_compression", RSC_TEXTURE_COMPRESSION);
  363|      1|        addCapabilitiesMapping("texture_compression_dxt", RSC_TEXTURE_COMPRESSION_DXT);
  364|      1|        addCapabilitiesMapping("texture_compression_vtc", RSC_TEXTURE_COMPRESSION_VTC);
  365|      1|        addCapabilitiesMapping("texture_compression_pvrtc", RSC_TEXTURE_COMPRESSION_PVRTC);
  366|      1|        addCapabilitiesMapping("texture_compression_atc", RSC_TEXTURE_COMPRESSION_ATC);
  367|      1|        addCapabilitiesMapping("texture_compression_etc1", RSC_TEXTURE_COMPRESSION_ETC1);
  368|      1|        addCapabilitiesMapping("texture_compression_etc2", RSC_TEXTURE_COMPRESSION_ETC2);
  369|      1|        addCapabilitiesMapping("texture_compression_bc4_bc5", RSC_TEXTURE_COMPRESSION_BC4_BC5);
  370|      1|        addCapabilitiesMapping("texture_compression_bc6h_bc7", RSC_TEXTURE_COMPRESSION_BC6H_BC7);
  371|      1|        addCapabilitiesMapping("texture_compression_astc", RSC_TEXTURE_COMPRESSION_ASTC);
  372|      1|        addCapabilitiesMapping("hwrender_to_vertex_buffer", RSC_HWRENDER_TO_VERTEX_BUFFER);
  373|       |
  374|      1|        addCapabilitiesMapping("pbuffer", RSC_PBUFFER);
  375|      1|        addCapabilitiesMapping("perstageconstant", RSC_PERSTAGECONSTANT);
  376|      1|        addCapabilitiesMapping("vao", RSC_VAO);
  377|      1|        addCapabilitiesMapping("separate_shader_objects", RSC_SEPARATE_SHADER_OBJECTS);
  378|      1|        addCapabilitiesMapping("glsl_sso_redeclare", RSC_GLSL_SSO_REDECLARE);
  379|      1|        addCapabilitiesMapping("debug", RSC_DEBUG);
  380|      1|        addCapabilitiesMapping("mapbuffer", RSC_MAPBUFFER);
  381|      1|        addCapabilitiesMapping("automipmap_compressed", RSC_AUTOMIPMAP_COMPRESSED);
  382|      1|    }

_ZN4Ogre8ResourceC2EPNS_15ResourceManagerERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEmSB_bPNS_20ManualResourceLoaderE:
   36|   233k|        : mCreator(creator), mName(name), mGroup(group), mHandle(handle), 
   37|   233k|        mLoadingState(LOADSTATE_UNLOADED), mIsBackgroundLoaded(false),
   38|   233k|        mIsManual(isManual), mSize(0),  mLoader(loader), mStateCount(0)
   39|   233k|    {
   40|   233k|    }
_ZN4Ogre8ResourceD2Ev:
   43|   233k|    { 
   44|   233k|    }
_ZN4Ogre8ResourceaSERKS0_:
   46|  13.1k|    {
   47|  13.1k|        mName = rhs.mName;
   48|  13.1k|        mGroup = rhs.mGroup;
   49|  13.1k|        mCreator = rhs.mCreator;
   50|  13.1k|        mIsManual = rhs.mIsManual;
   51|  13.1k|        mLoader = rhs.mLoader;
   52|  13.1k|        mHandle = rhs.mHandle;
   53|  13.1k|        mSize = rhs.mSize;
   54|       |
   55|  13.1k|        mLoadingState.store(rhs.mLoadingState.load());
   56|  13.1k|        mIsBackgroundLoaded = rhs.mIsBackgroundLoaded;
   57|       |
   58|  13.1k|        return *this;
   59|  13.1k|    }
_ZN4Ogre8Resource6unloadEv:
  333|   246k|    { 
  334|       |        // Early-out without lock (mitigate perf cost of ensuring unloaded)
  335|   246k|        LoadingState old = mLoadingState.load();
  336|   246k|        if (old!=LOADSTATE_LOADED && old!=LOADSTATE_PREPARED) return;
  ------------------
  |  Branch (336:13): [True: 246k, False: 0]
  |  Branch (336:38): [True: 246k, False: 0]
  ------------------
  337|       |
  338|       |
  339|      0|        if (!mLoadingState.compare_exchange_strong(old,LOADSTATE_UNLOADING)) return;
  ------------------
  |  Branch (339:13): [True: 0, False: 0]
  ------------------
  340|       |
  341|       |        // Scope lock for actual unload
  342|      0|        {
  343|      0|                    OGRE_LOCK_AUTO_MUTEX;
  344|      0|            if (old==LOADSTATE_PREPARED) {
  ------------------
  |  Branch (344:17): [True: 0, False: 0]
  ------------------
  345|      0|                unprepareImpl();
  346|      0|            } else {
  347|      0|                preUnloadImpl();
  348|      0|                unloadImpl();
  349|      0|                postUnloadImpl();
  350|      0|            }
  351|      0|        }
  352|       |
  353|      0|        mLoadingState.store(LOADSTATE_UNLOADED);
  354|       |
  355|       |        // Notify manager
  356|       |        // Note if we have gone from PREPARED to UNLOADED, then we haven't actually
  357|       |        // unloaded, i.e. there is no memory freed on the GPU.
  358|      0|        if(old==LOADSTATE_LOADED && mCreator)
  ------------------
  |  Branch (358:12): [True: 0, False: 0]
  |  Branch (358:37): [True: 0, False: 0]
  ------------------
  359|      0|            mCreator->_notifyResourceUnloaded(this);
  360|       |
  361|      0|        _fireUnloadingComplete();
  362|       |
  363|       |
  364|      0|    }
_ZN4Ogre8Resource11addListenerEPNS0_8ListenerE:
  386|  2.96k|    {
  387|  2.96k|            OGRE_LOCK_MUTEX(mListenerListMutex);
  388|  2.96k|        mListenerList.insert(lis);
  389|  2.96k|    }
_ZN4Ogre8Resource14removeListenerEPNS0_8ListenerE:
  392|  2.96k|    {
  393|       |        // O(n) but not called very often
  394|  2.96k|            OGRE_LOCK_MUTEX(mListenerListMutex);
  395|  2.96k|        mListenerList.erase(lis);
  396|  2.96k|    }

_ZN4Ogre23ResourceBackgroundQueueC2Ev:
   47|      1|    ResourceBackgroundQueue::ResourceBackgroundQueue() {}

_ZN4Ogre20ResourceGroupManager12getSingletonEv:
   40|  2.02M|    {  
   41|       |        assert( msSingleton );  return ( *msSingleton );  
   42|  2.02M|    }
_ZN4Ogre20ResourceGroupManagerC2Ev:
   58|      1|        : mLoadingListener(0), mCurrentGroup(0)
   59|      1|    {
   60|       |        // Create the 'General' group
   61|      1|        createResourceGroup(DEFAULT_RESOURCE_GROUP_NAME, true); // the "General" group is synonymous to global pool
   62|       |        // Create the 'Internal' group
   63|      1|        createResourceGroup(INTERNAL_RESOURCE_GROUP_NAME, true);
   64|       |        // Create the 'Autodetect' group (only used for temp storage)
   65|      1|        createResourceGroup(AUTODETECT_RESOURCE_GROUP_NAME, true); // autodetect includes the global pool
   66|       |        // default world group to the default group
   67|      1|        mWorldGroupName = DEFAULT_RESOURCE_GROUP_NAME;
   68|      1|    }
_ZN4Ogre20ResourceGroupManager19createResourceGroupERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
   83|  5.81k|    {
   84|  5.81k|        LogManager::getSingleton().logMessage("Creating resource group " + name);
   85|  5.81k|        if (getResourceGroup(name))
  ------------------
  |  Branch (85:13): [True: 0, False: 5.81k]
  ------------------
   86|      0|        {
   87|      0|            OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, 
   88|      0|                "Resource group with name '" + name + "' already exists!", 
   89|      0|                "ResourceGroupManager::createResourceGroup");
   90|      0|        }
   91|  5.81k|        ResourceGroup* grp = OGRE_NEW_T(ResourceGroup, MEMCATEGORY_RESOURCE)();
   92|  5.81k|        grp->groupStatus = ResourceGroup::UNINITIALSED;
   93|  5.81k|        grp->name = name;
   94|  5.81k|        grp->inGlobalPool = inGlobalPool;
   95|  5.81k|        grp->customStageCount = 0;
   96|       |
   97|  5.81k|        OGRE_LOCK_AUTO_MUTEX;
   98|  5.81k|        mResourceGroupMap.emplace(name, grp);
   99|  5.81k|    }
_ZN4Ogre20ResourceGroupManager19unloadResourceGroupERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
  281|  5.80k|    {
  282|  5.80k|        LogManager::getSingleton().logMessage("Unloading resource group " + name);
  283|  5.80k|        ResourceGroup* grp = getResourceGroup(name, true);
  284|  5.80k|        OGRE_LOCK_AUTO_MUTEX;
  285|       |        // Set current group
  286|  5.80k|        mCurrentGroup = grp;
  287|  5.80k|        OGRE_LOCK_MUTEX(grp->OGRE_AUTO_MUTEX_NAME); // lock group mutex 
  288|       |
  289|       |        // unload in reverse order
  290|  5.80k|        for (auto& oi : grp->loadResourceOrderMap)
  ------------------
  |  Branch (290:23): [True: 5.32k, False: 5.80k]
  ------------------
  291|  5.32k|        {
  292|  5.32k|            for (auto& l : oi.second)
  ------------------
  |  Branch (292:26): [True: 232k, False: 5.32k]
  ------------------
  293|   232k|            {
  294|   232k|                Resource* resource = l.get();
  295|   232k|                if (!reloadableOnly || resource->isReloadable())
  ------------------
  |  Branch (295:21): [True: 232k, False: 0]
  |  Branch (295:40): [True: 0, False: 0]
  ------------------
  296|   232k|                {
  297|   232k|                    resource->unload();
  298|   232k|                }
  299|   232k|            }
  300|  5.32k|        }
  301|       |
  302|  5.80k|        grp->groupStatus = ResourceGroup::INITIALISED;
  303|       |
  304|       |        // reset current group
  305|  5.80k|        mCurrentGroup = 0;
  306|  5.80k|        LogManager::getSingleton().logMessage("Finished unloading resource group " + name);
  307|  5.80k|    }
_ZN4Ogre20ResourceGroupManager20destroyResourceGroupERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  362|  5.80k|    {
  363|  5.80k|        LogManager::getSingleton().logMessage("Destroying resource group " + name);
  364|  5.80k|        ResourceGroup* grp = getResourceGroup(name, true);
  365|  5.80k|        OGRE_LOCK_AUTO_MUTEX;
  366|       |        // set current group
  367|  5.80k|        mCurrentGroup = grp;
  368|  5.80k|        unloadResourceGroup(name, false); // will throw an exception if name not valid
  369|  5.80k|        dropGroupContents(grp);
  370|  5.80k|        deleteGroup(grp);
  371|  5.80k|        mResourceGroupMap.erase(mResourceGroupMap.find(name));
  372|       |        // reset current group
  373|  5.80k|        mCurrentGroup = 0;
  374|  5.80k|    }
_ZN4Ogre20ResourceGroupManager24_registerResourceManagerERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPNS_15ResourceManagerE:
  702|      5|    {
  703|      5|        OGRE_LOCK_AUTO_MUTEX;
  704|       |
  705|      5|        LogManager::getSingleton().logMessage(
  706|      5|            "Registering ResourceManager for type " + resourceType);
  707|      5|        mResourceManagerMap[resourceType] = rm;
  708|      5|    }
_ZN4Ogre20ResourceGroupManager21_registerScriptLoaderEPNS_12ScriptLoaderE:
  726|      1|    {
  727|      1|            OGRE_LOCK_AUTO_MUTEX;
  728|       |
  729|      1|        mScriptLoaderOrderMap.emplace(su->getLoadingOrder(), su);
  730|      1|    }
_ZNK4Ogre20ResourceGroupManager22_notifyResourceCreatedERNS_9SharedPtrINS_8ResourceEEE:
  869|   232k|    {
  870|   232k|        if (mCurrentGroup && res->getGroup() == mCurrentGroup->name)
  ------------------
  |  Branch (870:13): [True: 0, False: 232k]
  |  Branch (870:30): [True: 0, False: 0]
  ------------------
  871|      0|        {
  872|       |            // Use current group (batch loading)
  873|      0|            addCreatedResource(res, *mCurrentGroup);
  874|      0|        }
  875|   232k|        else
  876|   232k|        {
  877|       |            // Find group
  878|   232k|            ResourceGroup* grp = getResourceGroup(res->getGroup());
  879|   232k|            if (grp)
  ------------------
  |  Branch (879:17): [True: 232k, False: 0]
  ------------------
  880|   232k|            {
  881|   232k|                addCreatedResource(res, *grp);
  882|   232k|            }
  883|   232k|        }
  884|       |
  885|   232k|        fireResourceCreated(res);
  886|   232k|    }
_ZNK4Ogre20ResourceGroupManager22_notifyResourceRemovedERKNS_9SharedPtrINS_8ResourceEEE:
  889|   232k|    {
  890|   232k|        fireResourceRemove(res);
  891|       |
  892|   232k|        if (mCurrentGroup && res->getGroup() == mCurrentGroup->name)
  ------------------
  |  Branch (892:13): [True: 232k, False: 0]
  |  Branch (892:30): [True: 232k, False: 0]
  ------------------
  893|   232k|        {
  894|       |            // Do nothing - we're batch unloading so list will be cleared
  895|   232k|        }
  896|      0|        else
  897|      0|        {
  898|       |            // Find group
  899|      0|            ResourceGroup* grp = getResourceGroup(res->getGroup());
  900|      0|            if (grp)
  ------------------
  |  Branch (900:17): [True: 0, False: 0]
  ------------------
  901|      0|            {
  902|      0|                            OGRE_LOCK_MUTEX(grp->OGRE_AUTO_MUTEX_NAME); // lock group mutex
  903|      0|                ResourceGroup::LoadResourceOrderMap::iterator i = 
  904|      0|                    grp->loadResourceOrderMap.find(
  905|      0|                        res->getCreator()->getLoadingOrder());
  906|      0|                if (i != grp->loadResourceOrderMap.end())
  ------------------
  |  Branch (906:21): [True: 0, False: 0]
  ------------------
  907|      0|                {
  908|       |                    // Iterate over the resource list and remove
  909|      0|                    LoadUnloadResourceList& resList = i->second;
  910|      0|                    for (LoadUnloadResourceList::iterator l = resList.begin();
  911|      0|                        l != resList.end(); ++ l)
  ------------------
  |  Branch (911:25): [True: 0, False: 0]
  ------------------
  912|      0|                    {
  913|      0|                        if ((*l).get() == res.get())
  ------------------
  |  Branch (913:29): [True: 0, False: 0]
  ------------------
  914|      0|                        {
  915|       |                            // this is the one
  916|      0|                            resList.erase(l);
  917|      0|                            break;
  918|      0|                        }
  919|      0|                    }
  920|      0|                }
  921|      0|            }
  922|      0|        }
  923|   232k|    }
_ZNK4Ogre20ResourceGroupManager18addCreatedResourceERNS_9SharedPtrINS_8ResourceEEERNS0_13ResourceGroupE:
  996|   232k|    {
  997|   232k|            OGRE_LOCK_MUTEX(grp.OGRE_AUTO_MUTEX_NAME);
  998|   232k|        Real order = res->getCreator()->getLoadingOrder();
  999|       |
 1000|   232k|        ResourceGroup::LoadResourceOrderMap::iterator i = grp.loadResourceOrderMap.find(order);
 1001|   232k|        LoadUnloadResourceList& loadList =
 1002|   232k|            i == grp.loadResourceOrderMap.end() ? grp.loadResourceOrderMap[order] : i->second;
  ------------------
  |  Branch (1002:13): [True: 5.33k, False: 227k]
  ------------------
 1003|       |
 1004|   232k|        loadList.push_back(res);
 1005|   232k|    }
_ZNK4Ogre20ResourceGroupManager16getResourceGroupERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
 1009|  1.56M|    {
 1010|  1.56M|        OGRE_LOCK_AUTO_MUTEX;
 1011|  1.56M|        ResourceGroupMap::const_iterator i = mResourceGroupMap.find(name);
 1012|       |
 1013|  1.56M|        if (i == mResourceGroupMap.end())
  ------------------
  |  Branch (1013:13): [True: 5.81k, False: 1.56M]
  ------------------
 1014|  5.81k|        {
 1015|  5.81k|            if (throwOnFailure)
  ------------------
  |  Branch (1015:17): [True: 0, False: 5.81k]
  ------------------
 1016|  5.81k|                OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "Cannot locate a resource group called '" + name + "'");
 1017|       |
 1018|  5.81k|            return nullptr;
 1019|  5.81k|        }
 1020|       |
 1021|  1.56M|        return i->second;
 1022|  1.56M|    }
_ZN4Ogre20ResourceGroupManager17dropGroupContentsEPNS0_13ResourceGroupE:
 1040|  5.80k|    {
 1041|  5.80k|            OGRE_LOCK_MUTEX(grp->OGRE_AUTO_MUTEX_NAME);
 1042|       |
 1043|  5.80k|        bool groupSet = false;
 1044|  5.80k|        if (!mCurrentGroup)
  ------------------
  |  Branch (1044:13): [True: 5.80k, False: 0]
  ------------------
 1045|  5.80k|        {
 1046|       |            // Set current group to indicate ignoring of notifications
 1047|  5.80k|            mCurrentGroup = grp;
 1048|  5.80k|            groupSet = true;
 1049|  5.80k|        }
 1050|       |        // delete all the load list entries
 1051|  5.80k|        for (auto& j : grp->loadResourceOrderMap)
  ------------------
  |  Branch (1051:22): [True: 5.32k, False: 5.80k]
  ------------------
 1052|  5.32k|        {
 1053|       |            // Iterate over resources
 1054|  5.32k|            for (auto& k : j.second)
  ------------------
  |  Branch (1054:26): [True: 232k, False: 5.32k]
  ------------------
 1055|   232k|            {
 1056|   232k|                k->getCreator()->remove(k);
 1057|   232k|            }
 1058|  5.32k|        }
 1059|  5.80k|        grp->loadResourceOrderMap.clear();
 1060|       |
 1061|  5.80k|        if (groupSet)
  ------------------
  |  Branch (1061:13): [True: 5.80k, False: 0]
  ------------------
 1062|  5.80k|        {
 1063|  5.80k|            mCurrentGroup = 0;
 1064|  5.80k|        }
 1065|  5.80k|    }
_ZN4Ogre20ResourceGroupManager11deleteGroupEPNS0_13ResourceGroupE:
 1068|  5.80k|    {
 1069|  5.80k|        {
 1070|  5.80k|            OGRE_LOCK_MUTEX(grp->OGRE_AUTO_MUTEX_NAME);
 1071|       |            // delete all the load list entries
 1072|  5.80k|            grp->loadResourceOrderMap.clear();
 1073|  5.80k|        }
 1074|       |
 1075|       |        // delete ResourceGroup
 1076|       |        OGRE_DELETE_T(grp, ResourceGroup, MEMCATEGORY_RESOURCE);
 1077|  5.80k|    }
_ZNK4Ogre20ResourceGroupManager19fireResourceCreatedERKNS_9SharedPtrINS_8ResourceEEE:
 1209|   232k|    {
 1210|   232k|        OGRE_LOCK_AUTO_MUTEX;
 1211|   232k|        for (auto l : mResourceGroupListenerList)
  ------------------
  |  Branch (1211:21): [True: 0, False: 232k]
  ------------------
 1212|      0|        {
 1213|      0|            l->resourceCreated(resource);
 1214|      0|        }
 1215|   232k|    }
_ZNK4Ogre20ResourceGroupManager18fireResourceRemoveERKNS_9SharedPtrINS_8ResourceEEE:
 1218|   232k|    {
 1219|   232k|        OGRE_LOCK_AUTO_MUTEX;
 1220|   232k|        for (auto l : mResourceGroupListenerList)
  ------------------
  |  Branch (1220:21): [True: 0, False: 232k]
  ------------------
 1221|      0|        {
 1222|      0|            l->resourceRemove(resource);
 1223|      0|        }
 1224|   232k|    }
_ZNK4Ogre20ResourceGroupManager27isResourceGroupInGlobalPoolERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 1468|  1.31M|    {
 1469|  1.31M|        return getResourceGroup(name, true)->inGlobalPool;
 1470|  1.31M|    }
_ZNK4Ogre20ResourceGroupManager18getLoadingListenerEv:
 1501|   233k|    {
 1502|   233k|        return mLoadingListener;
 1503|   233k|    }

_ZN4Ogre15ResourceManagerC2Ev:
   35|      6|        : mNextHandle(1), mMemoryUsage(0), mVerbose(true), mLoadOrder(0)
   36|      6|    {
   37|       |        // Init memory limit & usage
   38|      6|        mMemoryBudget = std::numeric_limits<unsigned long>::max();
   39|      6|    }
_ZN4Ogre15ResourceManager14createResourceERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_bPNS_20ManualResourceLoaderEPKNS1_3mapIS7_S7_NS1_4lessIS7_EENS5_INS1_4pairIS8_S7_EEEEEE:
   53|   228k|    {
   54|   228k|        OgreAssert(!name.empty(), "resource name must not be empty");
  ------------------
  |  Branch (54:9): [True: 1, False: 228k]
  ------------------
   55|       |
   56|       |        // Call creation implementation
   57|   228k|        ResourcePtr ret = ResourcePtr(
   58|   228k|            createImpl(name, getNextHandle(), group, isManual, loader, params));
   59|   228k|        if (params)
  ------------------
  |  Branch (59:13): [True: 0, False: 228k]
  ------------------
   60|      0|            ret->setParameterList(*params);
   61|       |
   62|   228k|        addImpl(ret);
   63|       |        // Tell resource group manager
   64|   228k|        if(ret)
  ------------------
  |  Branch (64:12): [True: 228k, False: 459]
  ------------------
   65|   228k|            ResourceGroupManager::getSingleton()._notifyResourceCreated(ret);
   66|   228k|        return ret;
   67|       |
   68|   228k|    }
_ZN4Ogre15ResourceManager16createOrRetrieveERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_bPNS_20ManualResourceLoaderEPKNS1_3mapIS7_S7_NS1_4lessIS7_EENS5_INS1_4pairIS8_S7_EEEEEE:
   75|   819k|    {
   76|       |        // Lock for the whole get / insert
   77|   819k|            OGRE_LOCK_AUTO_MUTEX;
   78|       |
   79|   819k|        ResourcePtr res = getResourceByName(name, group);
   80|   819k|        bool created = false;
   81|   819k|        if (!res)
  ------------------
  |  Branch (81:13): [True: 213k, False: 605k]
  ------------------
   82|   213k|        {
   83|   213k|            created = true;
   84|   213k|            res = createResource(name, group, isManual, loader, params);
   85|   213k|        }
   86|       |
   87|   819k|        return ResourceCreateOrRetrieveResult(res, created);
   88|   819k|    }
_ZN4Ogre15ResourceManager7addImplERNS_9SharedPtrINS_8ResourceEEE:
  112|   233k|    {
  113|   233k|            OGRE_LOCK_AUTO_MUTEX;
  114|       |
  115|   233k|            std::pair<ResourceMap::iterator, bool> result;
  116|   233k|        if(ResourceGroupManager::getSingleton().isResourceGroupInGlobalPool(res->getGroup()))
  ------------------
  |  Branch (116:12): [True: 3, False: 233k]
  ------------------
  117|      3|        {
  118|      3|            result = mResources.emplace(res->getName(), res);
  119|      3|        }
  120|   233k|        else
  121|   233k|        {
  122|       |            // we will create the group if it doesn't exists in our list
  123|   233k|            auto resgroup = mResourcesWithGroup.emplace(res->getGroup(), ResourceMap()).first;
  124|   233k|            result = resgroup->second.emplace(res->getName(), res);
  125|   233k|        }
  126|       |
  127|       |        // Attempt to resolve the collision
  128|   233k|        ResourceLoadingListener* listener = ResourceGroupManager::getSingleton().getLoadingListener();
  129|   233k|        if (!result.second && listener)
  ------------------
  |  Branch (129:13): [True: 577, False: 232k]
  |  Branch (129:31): [True: 0, False: 577]
  ------------------
  130|      0|        {
  131|      0|            if(listener->resourceCollision(res.get(), this) == false)
  ------------------
  |  Branch (131:16): [True: 0, False: 0]
  ------------------
  132|      0|            {
  133|       |                // explicitly use previous instance and destroy current
  134|      0|                res.reset();
  135|      0|                return;
  136|      0|            }
  137|       |
  138|       |            // Try to do the addition again, no seconds attempts to resolve collisions are allowed
  139|      0|            if(ResourceGroupManager::getSingleton().isResourceGroupInGlobalPool(res->getGroup()))
  ------------------
  |  Branch (139:16): [True: 0, False: 0]
  ------------------
  140|      0|            {
  141|      0|                result = mResources.emplace(res->getName(), res);
  142|      0|            }
  143|      0|            else
  144|      0|            {
  145|      0|                auto resgroup = mResourcesWithGroup.emplace(res->getGroup(), ResourceMap()).first;
  146|      0|                result = resgroup->second.emplace(res->getName(), res);
  147|      0|            }
  148|      0|        }
  149|       |
  150|   233k|        if (!result.second)
  ------------------
  |  Branch (150:13): [True: 577, False: 232k]
  ------------------
  151|    577|        {
  152|    577|            OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, getResourceType()+" with the name " + res->getName() +
  153|    577|                " already exists.", "ResourceManager::add");
  154|    577|        }
  155|       |
  156|       |        // Insert the handle
  157|   232k|        std::pair<ResourceHandleMap::iterator, bool> resultHandle = mResourcesByHandle.emplace(res->getHandle(), res);
  158|   232k|        if (!resultHandle.second)
  ------------------
  |  Branch (158:13): [True: 0, False: 232k]
  ------------------
  159|      0|        {
  160|       |            OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, getResourceType()+" with the handle " +
  161|      0|                StringConverter::toString((long) (res->getHandle())) +
  162|      0|                " already exists.", "ResourceManager::add");
  163|      0|        }
  164|   232k|    }
_ZN4Ogre15ResourceManager10removeImplERKNS_9SharedPtrINS_8ResourceEEE:
  167|   232k|    {
  168|   232k|        OgreAssert(res, "attempting to remove nullptr");
  ------------------
  |  Branch (168:9): [True: 0, False: 232k]
  ------------------
  169|       |
  170|   232k|#if OGRE_RESOURCEMANAGER_STRICT
  171|   232k|        if (res->getCreator() != this)
  ------------------
  |  Branch (171:13): [True: 0, False: 232k]
  ------------------
  172|   232k|            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Resource '" + res->getName() + "' was not created by the '" +
  173|   232k|                                                          getResourceType() + "' ResourceManager");
  174|   232k|#endif
  175|       |
  176|   232k|        OGRE_LOCK_AUTO_MUTEX;
  177|       |
  178|   232k|        if(ResourceGroupManager::getSingleton().isResourceGroupInGlobalPool(res->getGroup()))
  ------------------
  |  Branch (178:12): [True: 0, False: 232k]
  ------------------
  179|      0|        {
  180|      0|            ResourceMap::iterator nameIt = mResources.find(res->getName());
  181|      0|            if (nameIt != mResources.end())
  ------------------
  |  Branch (181:17): [True: 0, False: 0]
  ------------------
  182|      0|            {
  183|      0|                mResources.erase(nameIt);
  184|      0|            }
  185|      0|        }
  186|   232k|        else
  187|   232k|        {
  188|   232k|            ResourceWithGroupMap::iterator groupIt = mResourcesWithGroup.find(res->getGroup());
  189|   232k|            if (groupIt != mResourcesWithGroup.end())
  ------------------
  |  Branch (189:17): [True: 232k, False: 0]
  ------------------
  190|   232k|            {
  191|   232k|                ResourceMap::iterator nameIt = groupIt->second.find(res->getName());
  192|   232k|                if (nameIt != groupIt->second.end())
  ------------------
  |  Branch (192:21): [True: 232k, False: 0]
  ------------------
  193|   232k|                {
  194|   232k|                    groupIt->second.erase(nameIt);
  195|   232k|                }
  196|       |
  197|   232k|                if (groupIt->second.empty())
  ------------------
  |  Branch (197:21): [True: 5.32k, False: 227k]
  ------------------
  198|  5.32k|                {
  199|  5.32k|                    mResourcesWithGroup.erase(groupIt);
  200|  5.32k|                }
  201|   232k|            }
  202|   232k|        }
  203|       |
  204|   232k|        ResourceHandleMap::iterator handleIt = mResourcesByHandle.find(res->getHandle());
  205|   232k|        if (handleIt != mResourcesByHandle.end())
  ------------------
  |  Branch (205:13): [True: 232k, False: 0]
  ------------------
  206|   232k|        {
  207|   232k|            mResourcesByHandle.erase(handleIt);
  208|   232k|        }
  209|       |        // Tell resource group manager
  210|   232k|        ResourceGroupManager::getSingleton()._notifyResourceRemoved(res);
  211|   232k|    }
_ZN4Ogre15ResourceManager6removeERKNS_9SharedPtrINS_8ResourceEEE:
  298|   232k|    {
  299|   232k|        removeImpl(res);
  300|   232k|    }
_ZNK4Ogre15ResourceManager17getResourceByNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  368|   854k|    {
  369|   854k|        OGRE_LOCK_AUTO_MUTEX;
  370|       |
  371|       |        // resource should be in global pool
  372|   854k|        bool isGlobal = ResourceGroupManager::getSingleton().isResourceGroupInGlobalPool(groupName);
  373|       |
  374|   854k|        if(isGlobal)
  ------------------
  |  Branch (374:12): [True: 5.93k, False: 848k]
  ------------------
  375|  5.93k|        {
  376|  5.93k|            auto it = mResources.find(name);
  377|  5.93k|            if( it != mResources.end())
  ------------------
  |  Branch (377:17): [True: 16, False: 5.91k]
  ------------------
  378|     16|            {
  379|     16|                return it->second;
  380|     16|            }
  381|  5.93k|        }
  382|       |
  383|       |        // look in all grouped pools
  384|   854k|        if (groupName == ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME)
  ------------------
  |  Branch (384:13): [True: 5.91k, False: 848k]
  ------------------
  385|  5.91k|        {
  386|  5.91k|            for (auto& r : mResourcesWithGroup)
  ------------------
  |  Branch (386:26): [True: 4.15k, False: 5.79k]
  ------------------
  387|  4.15k|            {
  388|  4.15k|                auto resMapIt = r.second.find(name);
  389|       |
  390|  4.15k|                if( resMapIt != r.second.end())
  ------------------
  |  Branch (390:21): [True: 125, False: 4.03k]
  ------------------
  391|    125|                {
  392|    125|                    return resMapIt->second;
  393|    125|                }
  394|  4.15k|            }
  395|  5.91k|        }
  396|   848k|        else if (!isGlobal)
  ------------------
  |  Branch (396:18): [True: 848k, False: 0]
  ------------------
  397|   848k|        {
  398|       |            // look in the grouped pool
  399|   848k|            auto itGroup = mResourcesWithGroup.find(groupName);
  400|   848k|            if (itGroup != mResourcesWithGroup.end())
  ------------------
  |  Branch (400:17): [True: 842k, False: 5.44k]
  ------------------
  401|   842k|            {
  402|   842k|                auto it = itGroup->second.find(name);
  403|       |
  404|   842k|                if( it != itGroup->second.end())
  ------------------
  |  Branch (404:21): [True: 620k, False: 222k]
  ------------------
  405|   620k|                {
  406|   620k|                    return it->second;
  407|   620k|                }
  408|   842k|            }
  409|       |
  410|       |#if !OGRE_RESOURCEMANAGER_STRICT
  411|       |            // fall back to global
  412|       |            auto it = mResources.find(name);
  413|       |            if( it != mResources.end())
  414|       |            {
  415|       |                return it->second;
  416|       |            }
  417|       |#endif
  418|   848k|        }
  419|       |    
  420|   233k|        return ResourcePtr();
  421|   854k|    }
_ZN4Ogre15ResourceManager13getNextHandleEv:
  431|   233k|    {
  432|       |        // This is an atomic operation and hence needs no locking
  433|   233k|        return mNextHandle++;
  434|   233k|    }

_ZNK4Ogre18RibbonTrailFactory7getTypeEv:
  433|      3|    {
  434|      3|        return MOT_RIBBON_TRAIL;
  435|      3|    }

_ZN4Ogre4Root15getSingletonPtrEv:
   86|     16|    {
   87|     16|        return msSingleton;
   88|     16|    }
_ZN4Ogre4Root12getSingletonEv:
   90|  4.35k|    {
   91|       |        assert( msSingleton );  return ( *msSingleton );
   92|  4.35k|    }
_ZN4Ogre4RootC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_S9_:
  100|      1|      : mQueuedEnd(false)
  101|      1|      , mCurrentSceneManager(NULL)
  102|      1|      , mNextFrame(1)
  103|      1|      , mFrameSmoothingTime(0.0f)
  104|      1|      , mRemoveQueueStructuresOnClear(false)
  105|      1|      , mDefaultMinPixelSize(0)
  106|      1|      , mNextMovableObjectTypeFlag(1)
  107|      1|      , mIsInitialised(false)
  108|      1|      , mIsBlendIndicesGpuRedundant(true)
  109|      1|      , mIsBlendWeightsGpuRedundant(true)
  110|      1|    {
  111|       |        // superclass will do singleton checking
  112|       |
  113|       |        // Init
  114|      1|        mActiveRenderer = 0;
  115|      1|        mVersion = StringConverter::toString(OGRE_VERSION_MAJOR) + "." +
  116|      1|            StringConverter::toString(OGRE_VERSION_MINOR) + "." +
  117|      1|            StringConverter::toString(OGRE_VERSION_PATCH) +
  118|      1|            OGRE_VERSION_SUFFIX + " " +
  119|      1|            "(" + OGRE_VERSION_NAME + ")";
  120|      1|        mConfigFileName = configFileName;
  121|       |
  122|       |        // Create log manager and default log file if there is no log manager yet
  123|      1|        if(!LogManager::getSingletonPtr())
  ------------------
  |  Branch (123:12): [True: 0, False: 1]
  ------------------
  124|      0|        {
  125|      0|            mLogManager = std::make_unique<LogManager>();
  126|       |
  127|       |#if OGRE_PLATFORM == OGRE_PLATFORM_EMSCRIPTEN
  128|       |            // suppress writing log to Emscripten virtual FS, improves performance
  129|       |            mLogManager->createLog(logFileName, true, true, true);
  130|       |#else
  131|      0|            mLogManager->createLog(logFileName, true, true);
  132|      0|#endif
  133|       |
  134|       |#if OGRE_PLATFORM == OGRE_PLATFORM_ANDROID
  135|       |            mAndroidLogger.reset(new AndroidLogListener());
  136|       |            mLogManager->getDefaultLog()->addListener(mAndroidLogger.get());
  137|       |#endif
  138|      0|        }
  139|       |
  140|      1|        mDynLibManager = std::make_unique<DynLibManager>();
  141|      1|        mArchiveManager = std::make_unique<ArchiveManager>();
  142|      1|        mResourceGroupManager = std::make_unique<ResourceGroupManager>();
  143|       |
  144|       |        // WorkQueue (note: users can replace this if they want)
  145|      1|        DefaultWorkQueue* defaultQ = OGRE_NEW DefaultWorkQueue("Root");
  146|       |        // match threads to hardware
  147|      1|        int threadCount = OGRE_THREAD_HARDWARE_CONCURRENCY;
  148|       |        // but clamp it at 2 by default - we dont scale much beyond that currently
  149|       |        // yet it helps on android where it needlessly burns CPU
  150|      1|        threadCount = Math::Clamp(threadCount, 1, 2);
  151|      1|        defaultQ->setWorkerThreadCount(threadCount);
  152|       |
  153|       |        // only allow workers to access rendersystem if threadsupport is 1
  154|      1|        defaultQ->setWorkersCanAccessRenderSystem(OGRE_THREAD_SUPPORT == 1);
  155|      1|        mWorkQueue.reset(defaultQ);
  156|       |
  157|       |        // ResourceBackgroundQueue
  158|      1|        mResourceBackgroundQueue = std::make_unique<ResourceBackgroundQueue>();
  159|       |
  160|       |        // Create SceneManager enumerator (note - will be managed by singleton)
  161|      1|        mSceneManagerEnum = std::make_unique<SceneManagerEnumerator>();
  162|      1|        mShadowTextureManager = std::make_unique<ShadowTextureManager>();
  163|      1|        mRenderSystemCapabilitiesManager = std::make_unique<RenderSystemCapabilitiesManager>();
  164|      1|        mMaterialManager = std::make_unique<MaterialManager>();
  165|      1|        mMeshManager = std::make_unique<MeshManager>();
  166|      1|        mSkeletonManager = std::make_unique<SkeletonManager>();
  167|      1|        mParticleManager = std::make_unique<ParticleSystemManager>();
  168|      1|        mTimer = std::make_unique<Timer>();
  169|      1|        mLodStrategyManager = std::make_unique<LodStrategyManager>();
  170|       |
  171|       |#if OGRE_PROFILING
  172|       |        // Profiler
  173|       |        mProfiler.reset(new Profiler());
  174|       |        Profiler::getSingleton().setTimer(mTimer.get());
  175|       |#endif
  176|       |
  177|       |
  178|      1|        mFileSystemArchiveFactory = std::make_unique<FileSystemArchiveFactory>();
  179|      1|        ArchiveManager::getSingleton().addArchiveFactory( mFileSystemArchiveFactory.get() );
  180|      1|#   if OGRE_NO_ZIP_ARCHIVE == 0
  181|      1|        mZipArchiveFactory = std::make_unique<ZipArchiveFactory>();
  182|      1|        ArchiveManager::getSingleton().addArchiveFactory( mZipArchiveFactory.get() );
  183|      1|        mEmbeddedZipArchiveFactory = std::make_unique<EmbeddedZipArchiveFactory>();
  184|      1|        ArchiveManager::getSingleton().addArchiveFactory( mEmbeddedZipArchiveFactory.get() );
  185|      1|#   endif
  186|       |
  187|      1|#if OGRE_NO_DDS_CODEC == 0
  188|       |        // Register image codecs
  189|      1|        DDSCodec::startup();
  190|      1|#endif
  191|       |#if OGRE_NO_PVRTC_CODEC == 0
  192|       |        PVRTCCodec::startup();
  193|       |#endif
  194|      1|#if OGRE_NO_ETC_CODEC == 0
  195|      1|        ETCCodec::startup();
  196|      1|#endif
  197|      1|#if OGRE_NO_ASTC_CODEC == 0
  198|      1|        ASTCCodec::startup();
  199|      1|#endif
  200|       |
  201|      1|        mGpuProgramManager = std::make_unique<GpuProgramManager>();
  202|      1|        mExternalTextureSourceManager = std::make_unique<ExternalTextureSourceManager>();
  203|      1|        mCompositorManager = std::make_unique<CompositorManager>();
  204|      1|        mCompilerManager = std::make_unique<ScriptCompilerManager>();
  205|       |
  206|       |        // Auto window
  207|      1|        mAutoWindow = 0;
  208|       |
  209|       |        // instantiate and register base movable factories
  210|      1|        mEntityFactory = std::make_unique<EntityFactory>();
  211|      1|        addMovableObjectFactory(mEntityFactory.get());
  212|      1|        mLightFactory = std::make_unique<LightFactory>();
  213|      1|        addMovableObjectFactory(mLightFactory.get());
  214|      1|        mBillboardSetFactory = std::make_unique<BillboardSetFactory>();
  215|      1|        addMovableObjectFactory(mBillboardSetFactory.get());
  216|      1|        mManualObjectFactory = std::make_unique<ManualObjectFactory>();
  217|      1|        addMovableObjectFactory(mManualObjectFactory.get());
  218|      1|        mBillboardChainFactory = std::make_unique<BillboardChainFactory>();
  219|      1|        addMovableObjectFactory(mBillboardChainFactory.get());
  220|      1|        mRibbonTrailFactory = std::make_unique<RibbonTrailFactory>();
  221|      1|        addMovableObjectFactory(mRibbonTrailFactory.get());
  222|      1|        mStaticGeometryFactory = std::make_unique<StaticGeometryFactory>();
  223|      1|        addMovableObjectFactory(mStaticGeometryFactory.get());
  224|      1|        mRectangle2DFactory = std::make_unique<Rectangle2DFactory>();
  225|      1|        addMovableObjectFactory(mRectangle2DFactory.get());
  226|       |
  227|       |        // Load plugins
  228|      1|        if (!pluginFileName.empty())
  ------------------
  |  Branch (228:13): [True: 0, False: 1]
  ------------------
  229|      0|            loadPlugins(pluginFileName);
  230|       |
  231|      1|        LogManager::getSingleton().logMessage("*-*-* OGRE Initialising");
  232|      1|        LogManager::getSingleton().logMessage("*-*-* Version " + mVersion);
  233|       |
  234|       |        // Can't create managers until initialised
  235|      1|        mControllerManager = 0;
  236|       |
  237|      1|        mFirstTimePostWindowInit = false;
  238|      1|    }
_ZN4Ogre4Root15getRenderSystemEv:
  515|  4.32k|    {
  516|       |        // Gets the currently active renderer
  517|  4.32k|        return mActiveRenderer;
  518|       |
  519|  4.32k|    }
_ZN4Ogre4Root23addMovableObjectFactoryEPNS_20MovableObjectFactoryEb:
 1196|      9|    {
 1197|      9|        MovableObjectFactoryMap::iterator facti = mMovableObjectFactoryMap.find(
 1198|      9|            fact->getType());
 1199|      9|        if (!overrideExisting && facti != mMovableObjectFactoryMap.end())
  ------------------
  |  Branch (1199:13): [True: 9, False: 0]
  |  Branch (1199:13): [True: 0, False: 9]
  |  Branch (1199:34): [True: 0, False: 9]
  ------------------
 1200|      0|        {
 1201|      0|            OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM,
 1202|      0|                "A factory of type '" + fact->getType() + "' already exists.",
 1203|      0|                "Root::addMovableObjectFactory");
 1204|      0|        }
 1205|       |
 1206|      9|        if (fact->requestTypeFlags())
  ------------------
  |  Branch (1206:13): [True: 0, False: 9]
  ------------------
 1207|      0|        {
 1208|      0|            if (facti != mMovableObjectFactoryMap.end() && facti->second->requestTypeFlags())
  ------------------
  |  Branch (1208:17): [True: 0, False: 0]
  |  Branch (1208:17): [True: 0, False: 0]
  |  Branch (1208:60): [True: 0, False: 0]
  ------------------
 1209|      0|            {
 1210|       |                // Copy type flags from the factory we're replacing
 1211|      0|                fact->_notifyTypeFlags(facti->second->getTypeFlags());
 1212|      0|            }
 1213|      0|            else
 1214|      0|            {
 1215|       |                // Allocate new
 1216|      0|                fact->_notifyTypeFlags(_allocateNextMovableObjectTypeFlag());
 1217|      0|            }
 1218|      0|        }
 1219|       |
 1220|       |        // Save
 1221|      9|        mMovableObjectFactoryMap[fact->getType()] = fact;
 1222|       |
 1223|      9|        LogManager::getSingleton().logMessage("MovableObjectFactory for type '" +
 1224|      9|            fact->getType() + "' registered.");
 1225|       |
 1226|      9|    }

_ZN4Ogre22SceneManagerEnumeratorC2Ev:
   47|      1|        : mInstanceCreateCount(0), mCurrentRenderSystem(0)
   48|      1|    {
   49|      1|        addFactory(&mDefaultFactory);
   50|       |
   51|      1|    }
_ZN4Ogre22SceneManagerEnumerator10addFactoryEPNS_19SceneManagerFactoryE:
   75|      1|    {
   76|      1|        mFactories[fact->getTypeName()] = fact;
   77|       |        // add to metadata
   78|      1|        mMetaDataList.push_back(fact->getTypeName());
   79|       |        // Log
   80|      1|        LogManager::getSingleton().logMessage("SceneManagerFactory for type '" + fact->getTypeName() + "' registered.");
   81|      1|    }

_ZN4Ogre26DefaultSceneManagerFactoryC2Ev:
   49|      1|        DefaultSceneManagerFactory() {}
_ZNK4Ogre26DefaultSceneManagerFactory11getTypeNameEv:
   52|      3|        const String& getTypeName(void) const override { return SMT_DEFAULT; }

_ZN4Ogre12AbstractNodeC2EPS0_:
   40|  4.37M|        :line(0), type(ANT_UNKNOWN), parent(ptr)
   41|  4.37M|    {}
_ZN4Ogre16AtomAbstractNodeC2EPNS_12AbstractNodeE:
   45|  1.44M|        :AbstractNode(ptr), id(0)
   46|  1.44M|    {
   47|  1.44M|        type = ANT_ATOM;
   48|  1.44M|    }
_ZNK4Ogre16AtomAbstractNode5cloneEv:
   51|  1.13M|    {
   52|       |        AtomAbstractNode *node = OGRE_NEW AtomAbstractNode(parent);
   53|  1.13M|        node->file = file;
   54|  1.13M|        node->line = line;
   55|  1.13M|        node->id = id;
   56|  1.13M|        node->type = type;
   57|  1.13M|        node->value = value;
   58|  1.13M|        return node;
   59|  1.13M|    }
_ZN4Ogre18ObjectAbstractNodeC2EPNS_12AbstractNodeE:
   63|  1.93M|        :AbstractNode(ptr), id(0), abstract(false)
   64|  1.93M|    {
   65|  1.93M|        type = ANT_OBJECT;
   66|  1.93M|    }
_ZNK4Ogre18ObjectAbstractNode5cloneEv:
   69|  1.82M|    {
   70|  1.82M|        ObjectAbstractNode *node = OGRE_NEW ObjectAbstractNode(parent);
   71|  1.82M|        node->file = file;
   72|  1.82M|        node->line = line;
   73|  1.82M|        node->type = type;
   74|  1.82M|        node->name = name;
   75|  1.82M|        node->cls = cls;
   76|  1.82M|        node->id = id;
   77|  1.82M|        node->abstract = abstract;
   78|  1.82M|        for(const auto & i : children)
  ------------------
  |  Branch (78:28): [True: 2.62M, False: 1.82M]
  ------------------
   79|  2.62M|        {
   80|  2.62M|            AbstractNodePtr newNode = AbstractNodePtr(i->clone());
   81|  2.62M|            newNode->parent = node;
   82|  2.62M|            node->children.push_back(newNode);
   83|  2.62M|        }
   84|  1.82M|        for(const auto & value : values)
  ------------------
  |  Branch (84:32): [True: 134k, False: 1.82M]
  ------------------
   85|   134k|        {
   86|   134k|            AbstractNodePtr newNode = AbstractNodePtr(value->clone());
   87|   134k|            newNode->parent = node;
   88|   134k|            node->values.push_back(newNode);
   89|   134k|        }
   90|  1.82M|        node->mEnv = mEnv;
   91|  1.82M|        return node;
   92|  1.82M|    }
_ZN4Ogre18ObjectAbstractNode11setVariableERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  100|  7.20k|    {
  101|  7.20k|        mEnv[inName] = value;
  102|  7.20k|    }
_ZNK4Ogre18ObjectAbstractNode11getVariableERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  105|  20.3k|    {
  106|  20.3k|        std::map<String,String>::const_iterator i = mEnv.find(inName);
  107|  20.3k|        if(i != mEnv.end())
  ------------------
  |  Branch (107:12): [True: 7.16k, False: 13.1k]
  ------------------
  108|  7.16k|            return std::make_pair(true, i->second);
  109|       |
  110|  13.1k|        auto parentNode = this->parent;
  111|   106k|        while(parentNode && parentNode->type == ANT_OBJECT)
  ------------------
  |  Branch (111:15): [True: 100k, False: 6.53k]
  |  Branch (111:29): [True: 99.5k, False: 646]
  ------------------
  112|  99.5k|        {
  113|  99.5k|            ObjectAbstractNode *parentObj = (ObjectAbstractNode*)parentNode;
  114|  99.5k|            i = parentObj->mEnv.find(inName);
  115|  99.5k|            if(i != parentObj->mEnv.end())
  ------------------
  |  Branch (115:16): [True: 6.00k, False: 93.5k]
  ------------------
  116|  6.00k|                return std::make_pair(true, i->second);
  117|  93.5k|            parentNode = parentNode->parent;
  118|  93.5k|        }
  119|  7.18k|        return std::make_pair(false, "");
  120|  13.1k|    }
_ZNK4Ogre18ObjectAbstractNode12getVariablesEv:
  123|  53.5k|    {
  124|  53.5k|        return mEnv;
  125|  53.5k|    }
_ZN4Ogre20PropertyAbstractNodeC2EPNS_12AbstractNodeE:
  129|   950k|        :AbstractNode(ptr), id(0)
  130|   950k|    {
  131|   950k|        type = ANT_PROPERTY;
  132|   950k|    }
_ZNK4Ogre20PropertyAbstractNode5cloneEv:
  135|   785k|    {
  136|   785k|        PropertyAbstractNode *node = OGRE_NEW PropertyAbstractNode(parent);
  137|   785k|        node->file = file;
  138|   785k|        node->line = line;
  139|   785k|        node->type = type;
  140|   785k|        node->name = name;
  141|   785k|        node->id = id;
  142|   785k|        for(const auto & value : values)
  ------------------
  |  Branch (142:32): [True: 956k, False: 785k]
  ------------------
  143|   956k|        {
  144|   956k|            AbstractNodePtr newNode = AbstractNodePtr(value->clone());
  145|   956k|            newNode->parent = node;
  146|   956k|            node->values.push_back(newNode);
  147|   956k|        }
  148|   785k|        return node;
  149|   785k|    }
_ZN4Ogre18ImportAbstractNodeC2Ev:
  153|  15.9k|        :AbstractNode(0)
  154|  15.9k|    {
  155|  15.9k|        type = ANT_IMPORT;
  156|  15.9k|    }
_ZN4Ogre26VariableAccessAbstractNodeC2EPNS_12AbstractNodeE:
  171|  23.5k|        :AbstractNode(ptr)
  172|  23.5k|    {
  173|  23.5k|        type = ANT_VARIABLE_ACCESS;
  174|  23.5k|    }
_ZNK4Ogre26VariableAccessAbstractNode5cloneEv:
  177|  14.3k|    {
  178|       |        VariableAccessAbstractNode *node = OGRE_NEW VariableAccessAbstractNode(parent);
  179|  14.3k|        node->file = file;
  180|  14.3k|        node->line = line;
  181|  14.3k|        node->type = type;
  182|  14.3k|        node->name = name;
  183|  14.3k|        return node;
  184|  14.3k|    }
_ZN4Ogre22ScriptCompilerListenerC2Ev:
  188|      1|    {
  189|      1|    }
_ZN4Ogre22ScriptCompilerListener13preConversionEPNS_14ScriptCompilerENS_9SharedPtrINSt3__14listINS3_INS_12ConcreteNodeEEENS4_9allocatorIS7_EEEEEE:
  197|  5.71k|    {
  198|       |
  199|  5.71k|    }
_ZN4Ogre22ScriptCompilerListener14postConversionEPNS_14ScriptCompilerERKNS_9SharedPtrINSt3__14listINS3_INS_12AbstractNodeEEENS4_9allocatorIS7_EEEEEE:
  202|  5.70k|    {
  203|  5.70k|        return true;
  204|  5.70k|    }
_ZN4Ogre22ScriptCompilerListener11handleEventEPNS_14ScriptCompilerEPNS_19ScriptCompilerEventEPv:
  220|  97.2k|    {
  221|  97.2k|        return false;
  222|  97.2k|    }
_ZN4Ogre14ScriptCompilerC2Ev:
  261|      1|        :mListener(0)
  262|      1|    {
  263|      1|        initWordMap();
  264|      1|    }
_ZN4Ogre14ScriptCompiler7compileERKNS_9SharedPtrINSt3__14listINS1_INS_12ConcreteNodeEEENS2_9allocatorIS5_EEEEEERKNS2_12basic_stringIcNS2_11char_traitsIcEENS6_IcEEEE:
  327|  5.71k|    {
  328|  5.71k|        if(nodes && !nodes->empty())
  ------------------
  |  Branch (328:12): [True: 5.71k, False: 0]
  |  Branch (328:21): [True: 5.56k, False: 142]
  ------------------
  329|  5.56k|        {
  330|  5.56k|            mSourceFile = nodes->front()->file;
  331|  5.56k|        }
  332|       |
  333|       |        // Set up the compilation context
  334|  5.71k|        mGroup = group;
  335|       |
  336|       |        // Clear the past errors
  337|  5.71k|        mErrors.clear();
  338|       |
  339|       |        // Clear the environment
  340|  5.71k|        mEnv.clear();
  341|       |
  342|  5.71k|        if(mListener)
  ------------------
  |  Branch (342:12): [True: 5.71k, False: 0]
  ------------------
  343|  5.71k|            mListener->preConversion(this, nodes);
  344|       |
  345|       |        // Convert our nodes to an AST
  346|  5.71k|        AbstractNodeListPtr ast = convertToAST(*nodes);
  347|       |        // Processes the imports for this script
  348|  5.71k|        processImports(*ast);
  349|       |        // Process object inheritance
  350|  5.71k|        processObjects(*ast, *ast);
  351|       |        // Process variable expansion
  352|  5.71k|        processVariables(*ast);
  353|       |
  354|       |        // Allows early bail-out through the listener
  355|  5.71k|        if(mListener && !mListener->postConversion(this, ast))
  ------------------
  |  Branch (355:12): [True: 5.70k, False: 6]
  |  Branch (355:25): [True: 0, False: 5.70k]
  ------------------
  356|      0|            return mErrors.empty();
  357|       |
  358|       |        // Translate the nodes
  359|  5.71k|        for(auto & i : *ast)
  ------------------
  |  Branch (359:22): [True: 40.7k, False: 5.71k]
  ------------------
  360|  40.7k|        {
  361|       |#if DEBUG_AST
  362|       |            logAST(0, i);
  363|       |#endif
  364|  40.7k|            if(i->type == ANT_OBJECT && static_cast<ObjectAbstractNode*>(i.get())->abstract)
  ------------------
  |  Branch (364:16): [True: 23.4k, False: 17.2k]
  |  Branch (364:41): [True: 70, False: 23.4k]
  ------------------
  365|     70|                continue;
  366|       |            //LogManager::getSingleton().logMessage(static_cast<ObjectAbstractNode*>((*i).get())->name);
  367|  40.7k|            ScriptTranslator *translator = ScriptCompilerManager::getSingleton().getTranslator(i);
  368|  40.7k|            if(translator)
  ------------------
  |  Branch (368:16): [True: 16.6k, False: 24.0k]
  ------------------
  369|  16.6k|                translator->translate(this, i);
  370|  40.7k|        }
  371|       |
  372|  5.71k|        mImports.clear();
  373|  5.71k|        mImportRequests.clear();
  374|  5.71k|        mImportTable.clear();
  375|  5.71k|        mSourceFile.clear();
  376|       |
  377|  5.71k|        return mErrors.empty();
  378|  5.71k|    }
_ZN4Ogre14ScriptCompiler8addErrorEjRKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiS9_:
  381|  87.2k|    {
  382|  87.2k|        if(mListener)
  ------------------
  |  Branch (382:12): [True: 87.2k, False: 0]
  ------------------
  383|  87.2k|        {
  384|  87.2k|            mListener->handleError(this, code, file, line, msg);
  385|  87.2k|        }
  386|      0|        else
  387|      0|        {
  388|      0|            static ScriptCompilerListener defaultListener;
  389|      0|            defaultListener.handleError(this, code, file, line, msg);
  390|      0|        }
  391|       |
  392|  87.2k|        mErrors.push_back({file, msg, line, code});
  393|  87.2k|    }
_ZN4Ogre14ScriptCompiler8addErrorERKNS_12AbstractNodeERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEj:
  396|  14.4k|    {
  397|  14.4k|        addError(code, mSourceFile, node.line, msg);
  398|  14.4k|    }
_ZN4Ogre14ScriptCompiler11setListenerEPNS_22ScriptCompilerListenerE:
  401|      1|    {
  402|      1|        mListener = listener;
  403|      1|    }
_ZN4Ogre14ScriptCompiler11getListenerEv:
  406|    238|    {
  407|    238|        return mListener;
  408|    238|    }
_ZNK4Ogre14ScriptCompiler16getResourceGroupEv:
  411|  45.4k|    {
  412|  45.4k|        return mGroup;
  413|  45.4k|    }
_ZN4Ogre14ScriptCompiler10_fireEventEPNS_19ScriptCompilerEventEPv:
  416|  97.2k|    {
  417|  97.2k|        if(mListener)
  ------------------
  |  Branch (417:12): [True: 97.2k, False: 0]
  ------------------
  418|  97.2k|            return mListener->handleEvent(this, evt, retval);
  419|      0|        return false;
  420|  97.2k|    }
_ZN4Ogre14ScriptCompiler12convertToASTERKNSt3__14listINS_9SharedPtrINS_12ConcreteNodeEEENS1_9allocatorIS5_EEEE:
  423|  36.0k|    {
  424|  36.0k|        AbstractTreeBuilder builder(this);
  425|  36.0k|        AbstractTreeBuilder::visit(&builder, nodes);
  426|  36.0k|        return builder.getResult();
  427|  36.0k|    }
_ZN4Ogre14ScriptCompiler14processImportsERNSt3__14listINS_9SharedPtrINS_12AbstractNodeEEENS1_9allocatorIS5_EEEE:
  430|  5.71k|    {
  431|       |        // We only need to iterate over the top-level of nodes
  432|  5.71k|        AbstractNodeList::iterator i = nodes.begin();
  433|  64.9k|        while(i != nodes.end())
  ------------------
  |  Branch (433:15): [True: 59.1k, False: 5.71k]
  ------------------
  434|  59.1k|        {
  435|       |            // We move to the next node here and save the current one.
  436|       |            // If any replacement happens, then we are still assured that
  437|       |            // i points to the node *after* the replaced nodes, no matter
  438|       |            // how many insertions and deletions may happen
  439|  59.1k|            AbstractNodeList::iterator cur = i++;
  440|  59.1k|            if((*cur)->type == ANT_IMPORT)
  ------------------
  |  Branch (440:16): [True: 15.9k, False: 43.2k]
  ------------------
  441|  15.9k|            {
  442|  15.9k|                ImportAbstractNode *import = (ImportAbstractNode*)(*cur).get();
  443|       |                // Only process if the file's contents haven't been loaded
  444|  15.9k|                if(mImports.find(import->source) == mImports.end())
  ------------------
  |  Branch (444:20): [True: 15.9k, False: 0]
  ------------------
  445|  15.9k|                {
  446|       |                    // Load the script
  447|  15.9k|                    AbstractNodeListPtr importedNodes = loadImportPath(import->source);
  448|  15.9k|                    if(importedNodes && !importedNodes->empty())
  ------------------
  |  Branch (448:24): [True: 15.9k, False: 0]
  |  Branch (448:41): [True: 0, False: 15.9k]
  ------------------
  449|      0|                    {
  450|      0|                        processImports(*importedNodes);
  451|      0|                        processObjects(*importedNodes, *importedNodes);
  452|      0|                    }
  453|  15.9k|                    else
  454|  15.9k|                    {
  455|  15.9k|                        addError(CE_REFERENCETOANONEXISTINGOBJECT, import->file, import->line, import->source);
  456|  15.9k|                    }
  457|       |
  458|  15.9k|                    if(importedNodes && !importedNodes->empty())
  ------------------
  |  Branch (458:24): [True: 15.9k, False: 0]
  |  Branch (458:41): [True: 0, False: 15.9k]
  ------------------
  459|      0|                        mImports.insert(std::make_pair(import->source, importedNodes));
  460|  15.9k|                }
  461|       |
  462|  15.9k|                ImportRequestMap::iterator iter = mImportRequests.lower_bound(import->source),
  463|  15.9k|                                           end = mImportRequests.upper_bound(import->source);
  464|       |                // Handle the target request now
  465|       |                // If it is a '*' import we remove all previous requests and just use the '*'
  466|       |                // Otherwise, ensure '*' isn't already registered and register our request
  467|  15.9k|                if(import->target == "*")
  ------------------
  |  Branch (467:20): [True: 13.3k, False: 2.65k]
  ------------------
  468|  13.3k|                {
  469|  13.3k|                    mImportRequests.erase(iter, end);
  470|  13.3k|                    mImportRequests.insert(std::make_pair(import->source, "*"));
  471|  13.3k|                }
  472|  2.65k|                else
  473|  2.65k|                {
  474|  2.65k|                    if(iter == end || iter->second != "*")
  ------------------
  |  Branch (474:24): [True: 318, False: 2.33k]
  |  Branch (474:39): [True: 1.85k, False: 478]
  ------------------
  475|  2.17k|                    {
  476|  2.17k|                        mImportRequests.insert(std::make_pair(import->source, import->target));
  477|  2.17k|                    }
  478|  2.65k|                }
  479|       |
  480|  15.9k|                nodes.erase(cur);
  481|  15.9k|            }
  482|  59.1k|        }
  483|       |
  484|       |        // All import nodes are removed
  485|       |        // We have cached the code blocks from all the imported scripts
  486|       |        // We can process all import requests now
  487|  5.71k|        for(auto & import : mImports)
  ------------------
  |  Branch (487:27): [True: 0, False: 5.71k]
  ------------------
  488|      0|        {
  489|      0|            ImportRequestMap::iterator j = mImportRequests.lower_bound(import.first),
  490|      0|                end = mImportRequests.upper_bound(import.first);
  491|      0|            if(j != end)
  ------------------
  |  Branch (491:16): [True: 0, False: 0]
  ------------------
  492|      0|            {
  493|      0|                if(j->second == "*")
  ------------------
  |  Branch (493:20): [True: 0, False: 0]
  ------------------
  494|      0|                {
  495|       |                    // Insert the entire AST into the import table
  496|      0|                    mImportTable.insert(mImportTable.begin(), import.second->begin(), import.second->end());
  497|      0|                    continue; // Skip ahead to the next file
  498|      0|                }
  499|      0|                else
  500|      0|                {
  501|      0|                    for(; j != end; ++j)
  ------------------
  |  Branch (501:27): [True: 0, False: 0]
  ------------------
  502|      0|                    {
  503|       |                        // Locate this target and insert it into the import table
  504|      0|                        auto target = locateTarget(*import.second, j->second);
  505|      0|                        if(target)
  ------------------
  |  Branch (505:28): [True: 0, False: 0]
  ------------------
  506|      0|                            mImportTable.insert(mImportTable.begin(), target);
  507|      0|                        else
  508|       |                            // -1 for line as we lost that info here
  509|      0|                            addError(CE_REFERENCETOANONEXISTINGOBJECT, nodes.front()->file, -1, j->second);
  510|      0|                    }
  511|      0|                }
  512|      0|            }
  513|      0|        }
  514|  5.71k|    }
_ZN4Ogre14ScriptCompiler14loadImportPathERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  517|  15.9k|    {
  518|  15.9k|        AbstractNodeListPtr retval;
  519|  15.9k|        ConcreteNodeListPtr nodes;
  520|       |
  521|  15.9k|        if(mListener)
  ------------------
  |  Branch (521:12): [True: 15.9k, False: 0]
  ------------------
  522|  15.9k|            nodes = mListener->importFile(this, name);
  523|       |
  524|  15.9k|        if(!nodes && ResourceGroupManager::getSingletonPtr())
  ------------------
  |  Branch (524:12): [True: 0, False: 15.9k]
  |  Branch (524:22): [True: 0, False: 0]
  ------------------
  525|      0|        {
  526|      0|            auto stream = ResourceGroupManager::getSingleton().openResource(name, mGroup, NULL, false);
  527|       |
  528|      0|            if (!stream)
  ------------------
  |  Branch (528:17): [True: 0, False: 0]
  ------------------
  529|      0|                return retval;
  530|       |
  531|      0|            nodes = ScriptParser::parse(ScriptLexer::tokenize(stream->getAsString(), name), name);
  532|      0|        }
  533|       |
  534|  15.9k|        if(nodes)
  ------------------
  |  Branch (534:12): [True: 15.9k, False: 0]
  ------------------
  535|  15.9k|            retval = convertToAST(*nodes);
  536|       |
  537|  15.9k|        return retval;
  538|  15.9k|    }
_ZN4Ogre14ScriptCompiler12locateTargetERKNSt3__14listINS_9SharedPtrINS_12AbstractNodeEEENS1_9allocatorIS5_EEEERKNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEE:
  541|  9.28k|    {
  542|       |        // Search for a top-level object node
  543|  9.28k|        for(const auto& n : nodes)
  ------------------
  |  Branch (543:27): [True: 92.6k, False: 5.83k]
  ------------------
  544|  92.6k|        {
  545|  92.6k|            if(n->type == ANT_OBJECT && static_cast<ObjectAbstractNode*>(n.get())->name == target)
  ------------------
  |  Branch (545:16): [True: 50.0k, False: 42.5k]
  |  Branch (545:41): [True: 3.45k, False: 46.6k]
  ------------------
  546|  3.45k|            {
  547|  3.45k|                return n;
  548|  3.45k|            }
  549|  92.6k|        }
  550|       |
  551|  5.83k|        return nullptr;
  552|  9.28k|    }
_ZN4Ogre14ScriptCompiler14processObjectsERNSt3__14listINS_9SharedPtrINS_12AbstractNodeEEENS1_9allocatorIS5_EEEERKS8_:
  555|  1.92M|    {
  556|  1.92M|        for(auto& node : nodes)
  ------------------
  |  Branch (556:24): [True: 2.87M, False: 1.92M]
  ------------------
  557|  2.87M|        {
  558|  2.87M|            if(node->type == ANT_OBJECT)
  ------------------
  |  Branch (558:16): [True: 1.92M, False: 951k]
  ------------------
  559|  1.92M|            {
  560|  1.92M|                ObjectAbstractNode *obj = (ObjectAbstractNode*)node.get();
  561|       |
  562|  1.92M|#ifdef OGRE_BUILD_COMPONENT_OVERLAY
  563|  1.92M|                bool isOverlayElement = obj->cls == "overlay_element";
  564|  1.92M|#endif
  565|       |                // Overlay base classes in order.
  566|  1.92M|                for (String& base : obj->bases)
  ------------------
  |  Branch (566:35): [True: 6.37k, False: 1.92M]
  ------------------
  567|  6.37k|                {
  568|       |                    // Check the top level first, then check the import table
  569|  6.37k|                    auto target = locateTarget(top, base);
  570|  6.37k|                    if(!target)
  ------------------
  |  Branch (570:24): [True: 2.91k, False: 3.45k]
  ------------------
  571|  2.91k|                        target = locateTarget(mImportTable, base);
  572|       |
  573|  6.37k|                    if (!target)
  ------------------
  |  Branch (573:25): [True: 2.91k, False: 3.45k]
  ------------------
  574|  2.91k|                    {
  575|  2.91k|                        addError(CE_OBJECTBASENOTFOUND, obj->file, obj->line, base);
  576|  2.91k|                        continue;
  577|  2.91k|                    }
  578|       |
  579|  3.45k|                    auto src = static_cast<const ObjectAbstractNode&>(*target);
  580|       |
  581|  3.45k|#ifdef OGRE_BUILD_COMPONENT_OVERLAY
  582|       |                    // uses custom inheritance for renaming children
  583|  3.45k|                    if (isOverlayElement)
  ------------------
  |  Branch (583:25): [True: 0, False: 3.45k]
  ------------------
  584|      0|                    {
  585|      0|                        if (src.abstract)
  ------------------
  |  Branch (585:29): [True: 0, False: 0]
  ------------------
  586|      0|                            base = ""; // hide from custom inheritance
  587|      0|                        else
  588|      0|                            continue;
  589|      0|                    }
  590|  3.45k|#endif
  591|  3.45k|                    overlayObject(src, *obj);
  592|  3.45k|                }
  593|       |
  594|       |                // Recurse into children
  595|  1.92M|                processObjects(obj->children, top);
  596|       |
  597|       |                // Overrides now exist in obj's overrides list. These are non-object nodes which must now
  598|       |                // Be placed in the children section of the object node such that overriding from parents
  599|       |                // into children works properly.
  600|  1.92M|                obj->children.insert(obj->children.begin(), obj->overrides.begin(), obj->overrides.end());
  601|  1.92M|            }
  602|  2.87M|        }
  603|  1.92M|    }
_ZN4Ogre14ScriptCompiler13overlayObjectERKNS_18ObjectAbstractNodeERS1_:
  606|  53.5k|    {
  607|       |        // Overlay the environment of one on top the other first
  608|  53.5k|        for(const auto & i : src.getVariables())
  ------------------
  |  Branch (608:28): [True: 419, False: 53.5k]
  ------------------
  609|    419|        {
  610|    419|            std::pair<bool,String> var = dest.getVariable(i.first);
  611|    419|            if(!var.first)
  ------------------
  |  Branch (611:16): [True: 103, False: 316]
  ------------------
  612|    103|                dest.setVariable(i.first, i.second);
  613|    419|        }
  614|       |
  615|       |        // Create a vector storing each pairing of override between source and destination
  616|  53.5k|        typedef SharedPtr<ObjectAbstractNode> ObjectAbstractNodePtr;
  617|  53.5k|        std::vector<std::pair<ObjectAbstractNodePtr,AbstractNodeList::iterator> > overrides;
  618|       |        // A list of indices for each destination node tracks the minimum
  619|       |        // source node they can index-match against
  620|  53.5k|        std::map<ObjectAbstractNode*,size_t> indices;
  621|       |        // A map storing which nodes have overridden from the destination node
  622|  53.5k|        std::map<ObjectAbstractNode*,bool> overridden;
  623|       |
  624|       |        // Fill the vector with objects from the source node (base)
  625|       |        // And insert non-objects into the overrides list of the destination
  626|  53.5k|        AbstractNodeList::iterator insertPos = dest.children.begin();
  627|  53.5k|        for(const auto & i : src.children)
  ------------------
  |  Branch (627:28): [True: 91.6k, False: 53.5k]
  ------------------
  628|  91.6k|        {
  629|  91.6k|            if(i->type == ANT_OBJECT)
  ------------------
  |  Branch (629:16): [True: 58.7k, False: 32.9k]
  ------------------
  630|  58.7k|            {
  631|  58.7k|                overrides.push_back(std::make_pair(static_pointer_cast<ObjectAbstractNode>(i), dest.children.end()));
  632|  58.7k|            }
  633|  32.9k|            else
  634|  32.9k|            {
  635|  32.9k|                AbstractNodePtr newNode(i->clone());
  636|  32.9k|                newNode->parent = &dest;
  637|  32.9k|                dest.overrides.push_back(newNode);
  638|  32.9k|            }
  639|  91.6k|        }
  640|       |
  641|       |        // Track the running maximum override index in the name-matching phase
  642|  53.5k|        size_t maxOverrideIndex = 0;
  643|       |
  644|       |        // Loop through destination children searching for name-matching overrides
  645|   136k|        for(AbstractNodeList::iterator i = dest.children.begin(); i != dest.children.end(); )
  ------------------
  |  Branch (645:67): [True: 82.6k, False: 53.5k]
  ------------------
  646|  82.6k|        {
  647|  82.6k|            if((*i)->type == ANT_OBJECT)
  ------------------
  |  Branch (647:16): [True: 54.0k, False: 28.6k]
  ------------------
  648|  54.0k|            {
  649|       |                // Start tracking the override index position for this object
  650|  54.0k|                size_t overrideIndex = 0;
  651|       |
  652|  54.0k|                ObjectAbstractNode *node = static_cast<ObjectAbstractNode*>((*i).get());
  653|  54.0k|                indices[node] = maxOverrideIndex;
  654|  54.0k|                overridden[node] = false;
  655|       |
  656|       |                // special treatment for materials with * in their name
  657|  54.0k|                bool nodeHasWildcard=node->name.find('*') != String::npos;
  658|       |
  659|       |                // Find the matching name node
  660|   126k|                for(size_t j = 0; j < overrides.size(); ++j)
  ------------------
  |  Branch (660:35): [True: 112k, False: 13.3k]
  ------------------
  661|   112k|                {
  662|   112k|                    ObjectAbstractNode *temp = overrides[j].first.get();
  663|       |                    // Consider a match a node that has a wildcard and matches an input name
  664|   112k|                    bool wildcardMatch = nodeHasWildcard &&
  ------------------
  |  Branch (664:42): [True: 1.78k, False: 110k]
  ------------------
  665|  1.78k|                        (StringUtil::match(temp->name,node->name,true) ||
  ------------------
  |  Branch (665:26): [True: 383, False: 1.40k]
  ------------------
  666|  1.40k|                            (node->name.size() == 1 && temp->name.empty()));
  ------------------
  |  Branch (666:30): [True: 0, False: 1.40k]
  |  Branch (666:56): [True: 0, False: 0]
  ------------------
  667|   112k|                    if(temp->cls == node->cls && !node->name.empty() && (temp->name == node->name || wildcardMatch))
  ------------------
  |  Branch (667:24): [True: 65.7k, False: 46.9k]
  |  Branch (667:50): [True: 53.7k, False: 11.9k]
  |  Branch (667:74): [True: 41.0k, False: 12.7k]
  |  Branch (667:102): [True: 24, False: 12.7k]
  ------------------
  668|  41.0k|                    {
  669|       |                        // Pair these two together unless it's already paired
  670|  41.0k|                        if(overrides[j].second == dest.children.end())
  ------------------
  |  Branch (670:28): [True: 39.7k, False: 1.31k]
  ------------------
  671|  39.7k|                        {
  672|  39.7k|                            AbstractNodeList::iterator currentIterator = i;
  673|  39.7k|                            ObjectAbstractNode *currentNode = node;
  674|  39.7k|                            if (wildcardMatch)
  ------------------
  |  Branch (674:33): [True: 353, False: 39.4k]
  ------------------
  675|    353|                            {
  676|       |                                //If wildcard is matched, make a copy of current material and put it before the iterator, matching its name to the parent. Use same reinterpret cast as above when node is set
  677|    353|                                AbstractNodePtr newNode((*i)->clone());
  678|    353|                                currentIterator = dest.children.insert(currentIterator, newNode);
  679|    353|                                currentNode = static_cast<ObjectAbstractNode*>((*currentIterator).get());
  680|    353|                                currentNode->name = temp->name;//make the regex match its matcher
  681|    353|                            }
  682|  39.7k|                            overrides[j] = std::make_pair(overrides[j].first, currentIterator);
  683|       |                            // Store the max override index for this matched pair
  684|  39.7k|                            overrideIndex = j;
  685|  39.7k|                            overrideIndex = maxOverrideIndex = std::max(overrideIndex, maxOverrideIndex);
  686|  39.7k|                            indices[currentNode] = overrideIndex;
  687|  39.7k|                            overridden[currentNode] = true;
  688|  39.7k|                        }
  689|  1.31k|                        else
  690|  1.31k|                        {
  691|  1.31k|                            addError(CE_DUPLICATEOVERRIDE, node->file, node->line);
  692|  1.31k|                        }
  693|       |
  694|  41.0k|                        if(!wildcardMatch)
  ------------------
  |  Branch (694:28): [True: 40.7k, False: 353]
  ------------------
  695|  40.7k|                            break;
  696|  41.0k|                    }
  697|   112k|                }
  698|       |
  699|  54.0k|                if (nodeHasWildcard)
  ------------------
  |  Branch (699:21): [True: 566, False: 53.4k]
  ------------------
  700|    566|                {
  701|       |                    //if the node has a wildcard it will be deleted since it was duplicated for every match
  702|    566|                    AbstractNodeList::iterator deletable=i++;
  703|    566|                    dest.children.erase(deletable);
  704|    566|                }
  705|  53.4k|                else
  706|  53.4k|                {
  707|  53.4k|                    ++i; //Behavior in absence of regex, just increment iterator
  708|  53.4k|                }
  709|  54.0k|            }
  710|  28.6k|            else
  711|  28.6k|            {
  712|  28.6k|                ++i; //Behavior in absence of replaceable object, just increment iterator to find another
  713|  28.6k|            }
  714|  82.6k|        }
  715|       |
  716|       |        // Now make matches based on index
  717|       |        // Loop through destination children searching for index-matching overrides
  718|   136k|        for(AbstractNodeList::iterator i = dest.children.begin(); i != dest.children.end(); ++i)
  ------------------
  |  Branch (718:67): [True: 82.4k, False: 53.5k]
  ------------------
  719|  82.4k|        {
  720|  82.4k|            if((*i)->type == ANT_OBJECT)
  ------------------
  |  Branch (720:16): [True: 53.8k, False: 28.6k]
  ------------------
  721|  53.8k|            {
  722|  53.8k|                ObjectAbstractNode *node = static_cast<ObjectAbstractNode*>((*i).get());
  723|  53.8k|                if(!overridden[node])
  ------------------
  |  Branch (723:20): [True: 14.0k, False: 39.7k]
  ------------------
  724|  14.0k|                {
  725|       |                    // Retrieve the minimum override index from the map
  726|  14.0k|                    size_t overrideIndex = indices[node];
  727|       |
  728|  14.0k|                    if(overrideIndex < overrides.size())
  ------------------
  |  Branch (728:24): [True: 13.5k, False: 542]
  ------------------
  729|  13.5k|                    {
  730|       |                        // Search for minimum matching override
  731|  26.6k|                        for(size_t j = overrideIndex; j < overrides.size(); ++j)
  ------------------
  |  Branch (731:55): [True: 23.4k, False: 3.22k]
  ------------------
  732|  23.4k|                        {
  733|  23.4k|                            ObjectAbstractNode *temp = overrides[j].first.get();
  734|  23.4k|                            if(temp->name.empty() && node->name.empty() && temp->cls == node->cls && overrides[j].second == dest.children.end())
  ------------------
  |  Branch (734:32): [True: 13.3k, False: 10.1k]
  |  Branch (734:32): [True: 10.2k, False: 13.1k]
  |  Branch (734:54): [True: 11.9k, False: 1.41k]
  |  Branch (734:76): [True: 10.9k, False: 966]
  |  Branch (734:102): [True: 10.2k, False: 657]
  ------------------
  735|  10.2k|                            {
  736|  10.2k|                                overrides[j] = std::make_pair(overrides[j].first, i);
  737|  10.2k|                                break;
  738|  10.2k|                            }
  739|  23.4k|                        }
  740|  13.5k|                    }
  741|  14.0k|                }
  742|  53.8k|            }
  743|  82.4k|        }
  744|       |
  745|       |        // Loop through overrides, either inserting source nodes or overriding
  746|  53.5k|        insertPos = dest.children.begin();
  747|  53.5k|        for(auto & override : overrides)
  ------------------
  |  Branch (747:29): [True: 58.7k, False: 53.5k]
  ------------------
  748|  58.7k|        {
  749|  58.7k|            if(override.second != dest.children.end())
  ------------------
  |  Branch (749:16): [True: 50.0k, False: 8.64k]
  ------------------
  750|  50.0k|            {
  751|       |                // Override the destination with the source (base) object
  752|  50.0k|                overlayObject(*override.first,
  753|  50.0k|                    static_cast<ObjectAbstractNode&>(**override.second));
  754|  50.0k|                insertPos = override.second;
  755|  50.0k|                insertPos++;
  756|  50.0k|            }
  757|  8.64k|            else
  758|  8.64k|            {
  759|       |                // No override was possible, so insert this node at the insert position
  760|       |                // into the destination (child) object
  761|  8.64k|                AbstractNodePtr newNode(override.first->clone());
  762|  8.64k|                newNode->parent = &dest;
  763|  8.64k|                if(insertPos != dest.children.end())
  ------------------
  |  Branch (763:20): [True: 5.70k, False: 2.93k]
  ------------------
  764|  5.70k|                {
  765|  5.70k|                    dest.children.insert(insertPos, newNode);
  766|  5.70k|                }
  767|  2.93k|                else
  768|  2.93k|                {
  769|  2.93k|                    dest.children.push_back(newNode);
  770|  2.93k|                }
  771|  8.64k|            }
  772|  58.7k|        }
  773|  53.5k|    }
_ZN4Ogre14ScriptCompiler14isNameExcludedERKNS_18ObjectAbstractNodeEPNS_12AbstractNodeE:
  776|  57.0k|    {
  777|       |        // Run past the listener
  778|  57.0k|        bool excludeName = false;
  779|  57.0k|        ProcessNameExclusionScriptCompilerEvent evt(node.cls, parent);
  780|  57.0k|        if(_fireEvent(&evt, (void*)&excludeName))
  ------------------
  |  Branch (780:12): [True: 0, False: 57.0k]
  ------------------
  781|      0|            return excludeName;
  782|       |
  783|       |        // Process the built-in name exclusions
  784|  57.0k|        if(node.id == ID_EMITTER || node.id == ID_AFFECTOR)
  ------------------
  |  Branch (784:12): [True: 405, False: 56.6k]
  |  Branch (784:37): [True: 230, False: 56.4k]
  ------------------
  785|    635|        {
  786|       |            // emitters or affectors inside a particle_system are excluded
  787|  1.29k|            while(parent && parent->type == ANT_OBJECT)
  ------------------
  |  Branch (787:19): [True: 1.05k, False: 234]
  |  Branch (787:29): [True: 773, False: 283]
  ------------------
  788|    773|            {
  789|    773|                ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(parent);
  790|    773|                if(obj->id == ID_PARTICLE_SYSTEM)
  ------------------
  |  Branch (790:20): [True: 118, False: 655]
  ------------------
  791|    118|                    return true;
  792|    655|                parent = obj->parent;
  793|    655|            }
  794|    635|        }
  795|  56.4k|        else if(node.id == ID_PASS)
  ------------------
  |  Branch (795:17): [True: 7.40k, False: 48.9k]
  ------------------
  796|  7.40k|        {
  797|       |            // passes inside compositors are excluded
  798|  22.4k|            while(parent && parent->type == ANT_OBJECT)
  ------------------
  |  Branch (798:19): [True: 18.9k, False: 3.51k]
  |  Branch (798:29): [True: 18.6k, False: 336]
  ------------------
  799|  18.6k|            {
  800|  18.6k|                ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(parent);
  801|  18.6k|                if(obj->id == ID_TARGET || obj->id == ID_TARGET_OUTPUT)
  ------------------
  |  Branch (801:20): [True: 2.10k, False: 16.5k]
  |  Branch (801:44): [True: 1.44k, False: 15.0k]
  ------------------
  802|  3.55k|                    return true;
  803|  15.0k|                parent = obj->parent;
  804|  15.0k|            }
  805|  7.40k|        }
  806|  48.9k|        else if(node.id == ID_TEXTURE_SOURCE)
  ------------------
  |  Branch (806:17): [True: 192, False: 48.8k]
  ------------------
  807|    192|        {
  808|       |            // Parent must be texture_unit
  809|    566|            while(parent && parent->type == ANT_OBJECT)
  ------------------
  |  Branch (809:19): [True: 536, False: 30]
  |  Branch (809:29): [True: 396, False: 140]
  ------------------
  810|    396|            {
  811|    396|                ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(parent);
  812|    396|                if(obj->id == ID_TEXTURE_UNIT)
  ------------------
  |  Branch (812:20): [True: 22, False: 374]
  ------------------
  813|     22|                    return true;
  814|    374|                parent = obj->parent;
  815|    374|            }
  816|    192|        }
  817|       |
  818|  53.3k|        return false;
  819|  57.0k|    }
_ZN4Ogre14ScriptCompiler16processVariablesERNSt3__14listINS_9SharedPtrINS_12AbstractNodeEEENS1_9allocatorIS5_EEEE:
  822|  4.78M|    {
  823|  4.78M|        AbstractNodeList::iterator i = nodes.begin();
  824|  9.06M|        while(i != nodes.end())
  ------------------
  |  Branch (824:15): [True: 4.28M, False: 4.78M]
  ------------------
  825|  4.28M|        {
  826|  4.28M|            AbstractNodeList::iterator cur = i;
  827|  4.28M|            ++i;
  828|       |
  829|  4.28M|            if((*cur)->type == ANT_OBJECT)
  ------------------
  |  Branch (829:16): [True: 1.91M, False: 2.36M]
  ------------------
  830|  1.91M|            {
  831|       |                // Only process if this object is not abstract
  832|  1.91M|                ObjectAbstractNode *obj = (ObjectAbstractNode*)(*cur).get();
  833|  1.91M|                if(!obj->abstract)
  ------------------
  |  Branch (833:20): [True: 1.91M, False: 5.57k]
  ------------------
  834|  1.91M|                {
  835|  1.91M|                    processVariables(obj->children);
  836|  1.91M|                    processVariables(obj->values);
  837|  1.91M|                }
  838|  1.91M|            }
  839|  2.36M|            else if((*cur)->type == ANT_PROPERTY)
  ------------------
  |  Branch (839:21): [True: 932k, False: 1.43M]
  ------------------
  840|   932k|            {
  841|   932k|                PropertyAbstractNode *prop = (PropertyAbstractNode*)(*cur).get();
  842|   932k|                processVariables(prop->values);
  843|   932k|            }
  844|  1.43M|            else if((*cur)->type == ANT_VARIABLE_ACCESS)
  ------------------
  |  Branch (844:21): [True: 23.3k, False: 1.41M]
  ------------------
  845|  23.3k|            {
  846|  23.3k|                VariableAccessAbstractNode *var = (VariableAccessAbstractNode*)(*cur).get();
  847|       |
  848|       |                // Look up the enclosing scope
  849|  23.3k|                ObjectAbstractNode *scope = 0;
  850|  23.3k|                AbstractNode *temp = var->parent;
  851|  65.3k|                while(temp)
  ------------------
  |  Branch (851:23): [True: 61.9k, False: 3.43k]
  ------------------
  852|  61.9k|                {
  853|  61.9k|                    if(temp->type == ANT_OBJECT)
  ------------------
  |  Branch (853:24): [True: 19.9k, False: 41.9k]
  ------------------
  854|  19.9k|                    {
  855|  19.9k|                        scope = (ObjectAbstractNode*)temp;
  856|  19.9k|                        break;
  857|  19.9k|                    }
  858|  41.9k|                    temp = temp->parent;
  859|  41.9k|                }
  860|       |
  861|       |                // Look up the variable in the environment
  862|  23.3k|                std::pair<bool,String> varAccess;
  863|  23.3k|                if(scope)
  ------------------
  |  Branch (863:20): [True: 19.9k, False: 3.43k]
  ------------------
  864|  19.9k|                    varAccess = scope->getVariable(var->name);
  865|  23.3k|                if(!scope || !varAccess.first)
  ------------------
  |  Branch (865:20): [True: 3.43k, False: 19.9k]
  |  Branch (865:30): [True: 7.08k, False: 12.8k]
  ------------------
  866|  10.5k|                {
  867|  10.5k|                    std::map<String,String>::iterator k = mEnv.find(var->name);
  868|  10.5k|                    varAccess.first = k != mEnv.end();
  869|  10.5k|                    if(varAccess.first)
  ------------------
  |  Branch (869:24): [True: 1.50k, False: 9.01k]
  ------------------
  870|  1.50k|                        varAccess.second = k->second;
  871|  10.5k|                }
  872|       |
  873|  23.3k|                if(varAccess.first)
  ------------------
  |  Branch (873:20): [True: 14.3k, False: 9.01k]
  ------------------
  874|  14.3k|                {
  875|       |                    // Found the variable, so process it and insert it into the tree
  876|  14.3k|                    ConcreteNodeListPtr cst = ScriptParser::parseChunk(ScriptLexer::tokenize(varAccess.second, var->file), var->file);
  877|  14.3k|                    AbstractNodeListPtr ast = convertToAST(*cst);
  878|       |
  879|       |                    // Set up ownership for these nodes
  880|  14.3k|                    for(auto & j : *ast)
  ------------------
  |  Branch (880:34): [True: 14.3k, False: 14.3k]
  ------------------
  881|  14.3k|                        j->parent = var->parent;
  882|       |
  883|       |                    // Recursively handle variable accesses within the variable expansion
  884|  14.3k|                    processVariables(*ast);
  885|       |
  886|       |                    // Insert the nodes in place of the variable
  887|  14.3k|                    nodes.insert(cur, ast->begin(), ast->end());
  888|  14.3k|                }
  889|  9.01k|                else
  890|  9.01k|                {
  891|       |                    // Error
  892|  9.01k|                    addError(CE_UNDEFINEDVARIABLE, var->file, var->line, var->name);
  893|  9.01k|                }
  894|       |
  895|       |                // Remove the variable node
  896|  23.3k|                nodes.erase(cur);
  897|  23.3k|            }
  898|  4.28M|        }
  899|  4.78M|    }
_ZN4Ogre14ScriptCompiler11initWordMapEv:
  902|      1|    {
  903|      1|        mIds["on"] = ID_ON;
  904|      1|        mIds["off"] = ID_OFF;
  905|      1|        mIds["true"] = ID_TRUE;
  906|      1|        mIds["false"] = ID_FALSE;
  907|      1|        mIds["yes"] = ID_YES;
  908|      1|        mIds["no"] = ID_NO;
  909|       |
  910|       |        // Material ids
  911|      1|        mIds["material"] = ID_MATERIAL;
  912|      1|        mIds["vertex_program"] = ID_VERTEX_PROGRAM;
  913|      1|        mIds["geometry_program"] = ID_GEOMETRY_PROGRAM;
  914|      1|        mIds["fragment_program"] = ID_FRAGMENT_PROGRAM;
  915|      1|        mIds["tessellation_hull_program"] = ID_TESSELLATION_HULL_PROGRAM;
  916|      1|        mIds["tessellation_domain_program"] = ID_TESSELLATION_DOMAIN_PROGRAM;
  917|      1|        mIds["compute_program"] = ID_COMPUTE_PROGRAM;
  918|      1|        mIds["mesh_program"] = ID_MESH_PROGRAM;
  919|      1|        mIds["task_program"] = ID_TASK_PROGRAM;
  920|      1|        mIds["technique"] = ID_TECHNIQUE;
  921|      1|        mIds["pass"] = ID_PASS;
  922|      1|        mIds["texture_unit"] = ID_TEXTURE_UNIT;
  923|      1|        mIds["vertex_program_ref"] = ID_VERTEX_PROGRAM_REF;
  924|      1|        mIds["geometry_program_ref"] = ID_GEOMETRY_PROGRAM_REF;
  925|      1|        mIds["fragment_program_ref"] = ID_FRAGMENT_PROGRAM_REF;
  926|      1|        mIds["tessellation_hull_program_ref"] = ID_TESSELLATION_HULL_PROGRAM_REF;
  927|      1|        mIds["tessellation_domain_program_ref"] = ID_TESSELLATION_DOMAIN_PROGRAM_REF;
  928|      1|        mIds["compute_program_ref"] = ID_COMPUTE_PROGRAM_REF;
  929|      1|        mIds["mesh_program_ref"] = ID_MESH_PROGRAM_REF;
  930|      1|        mIds["task_program_ref"] = ID_TASK_PROGRAM_REF;
  931|      1|        mIds["shadow_caster_vertex_program_ref"] = ID_SHADOW_CASTER_VERTEX_PROGRAM_REF;
  932|      1|        mIds["shadow_caster_fragment_program_ref"] = ID_SHADOW_CASTER_FRAGMENT_PROGRAM_REF;
  933|      1|        mIds["shadow_receiver_vertex_program_ref"] = ID_SHADOW_RECEIVER_VERTEX_PROGRAM_REF;
  934|      1|        mIds["shadow_receiver_fragment_program_ref"] = ID_SHADOW_RECEIVER_FRAGMENT_PROGRAM_REF;
  935|       |
  936|      1|        mIds["lod_values"] = ID_LOD_VALUES;
  937|      1|        mIds["lod_strategy"] = ID_LOD_STRATEGY;
  938|      1|        mIds["lod_distances"] = ID_LOD_DISTANCES;
  939|      1|        mIds["receive_shadows"] = ID_RECEIVE_SHADOWS;
  940|      1|        mIds["transparency_casts_shadows"] = ID_TRANSPARENCY_CASTS_SHADOWS;
  941|      1|        mIds["set_texture_alias"] = ID_SET_TEXTURE_ALIAS;
  942|       |
  943|      1|        mIds["source"] = ID_SOURCE;
  944|      1|        mIds["syntax"] = ID_SYNTAX;
  945|      1|        mIds["default_params"] = ID_DEFAULT_PARAMS;
  946|      1|        mIds["param_indexed"] = ID_PARAM_INDEXED;
  947|      1|        mIds["param_named"] = ID_PARAM_NAMED;
  948|      1|        mIds["param_indexed_auto"] = ID_PARAM_INDEXED_AUTO;
  949|      1|        mIds["param_named_auto"] = ID_PARAM_NAMED_AUTO;
  950|       |
  951|      1|        mIds["scheme"] = ID_SCHEME;
  952|      1|        mIds["lod_index"] = ID_LOD_INDEX;
  953|      1|        mIds["shadow_caster_material"] = ID_SHADOW_CASTER_MATERIAL;
  954|      1|        mIds["shadow_receiver_material"] = ID_SHADOW_RECEIVER_MATERIAL;
  955|      1|        mIds["gpu_vendor_rule"] = ID_GPU_VENDOR_RULE;
  956|      1|        mIds["gpu_device_rule"] = ID_GPU_DEVICE_RULE;
  957|      1|        mIds["include"] = ID_INCLUDE;
  958|      1|        mIds["exclude"] = ID_EXCLUDE;
  959|       |
  960|      1|        mIds["ambient"] = ID_AMBIENT;
  961|      1|        mIds["diffuse"] = ID_DIFFUSE;
  962|      1|        mIds["specular"] = ID_SPECULAR;
  963|      1|        mIds["emissive"] = ID_EMISSIVE;
  964|      1|        mIds["vertexcolour"] = ID_VERTEXCOLOUR;
  965|      1|        mIds["scene_blend"] = ID_SCENE_BLEND;
  966|      1|        mIds["colour_blend"] = ID_COLOUR_BLEND;
  967|      1|        mIds["one"] = ID_ONE;
  968|      1|        mIds["zero"] = ID_ZERO;
  969|      1|        mIds["dest_colour"] = ID_DEST_COLOUR;
  970|      1|        mIds["src_colour"] = ID_SRC_COLOUR;
  971|      1|        mIds["one_minus_src_colour"] = ID_ONE_MINUS_SRC_COLOUR;
  972|      1|        mIds["one_minus_dest_colour"] = ID_ONE_MINUS_DEST_COLOUR;
  973|      1|        mIds["dest_alpha"] = ID_DEST_ALPHA;
  974|      1|        mIds["src_alpha"] = ID_SRC_ALPHA;
  975|      1|        mIds["one_minus_dest_alpha"] = ID_ONE_MINUS_DEST_ALPHA;
  976|      1|        mIds["one_minus_src_alpha"] = ID_ONE_MINUS_SRC_ALPHA;
  977|      1|        mIds["separate_scene_blend"] = ID_SEPARATE_SCENE_BLEND;
  978|      1|        mIds["scene_blend_op"] = ID_SCENE_BLEND_OP;
  979|      1|        mIds["reverse_subtract"] = ID_REVERSE_SUBTRACT;
  980|      1|        mIds["min"] = ID_MIN;
  981|      1|        mIds["max"] = ID_MAX;
  982|      1|        mIds["separate_scene_blend_op"] = ID_SEPARATE_SCENE_BLEND_OP;
  983|      1|        mIds["depth_check"] = ID_DEPTH_CHECK;
  984|      1|        mIds["depth_write"] = ID_DEPTH_WRITE;
  985|      1|        mIds["depth_func"] = ID_DEPTH_FUNC;
  986|      1|        mIds["depth_bias"] = ID_DEPTH_BIAS;
  987|      1|        mIds["iteration_depth_bias"] = ID_ITERATION_DEPTH_BIAS;
  988|      1|        mIds["always_fail"] = ID_ALWAYS_FAIL;
  989|      1|        mIds["always_pass"] = ID_ALWAYS_PASS;
  990|      1|        mIds["less_equal"] = ID_LESS_EQUAL;
  991|      1|        mIds["less"] = ID_LESS;
  992|      1|        mIds["equal"] = ID_EQUAL;
  993|      1|        mIds["not_equal"] = ID_NOT_EQUAL;
  994|      1|        mIds["greater_equal"] = ID_GREATER_EQUAL;
  995|      1|        mIds["greater"] = ID_GREATER;
  996|      1|        mIds["alpha_rejection"] = ID_ALPHA_REJECTION;
  997|      1|        mIds["alpha_to_coverage"] = ID_ALPHA_TO_COVERAGE;
  998|      1|        mIds["light_scissor"] = ID_LIGHT_SCISSOR;
  999|      1|        mIds["light_clip_planes"] = ID_LIGHT_CLIP_PLANES;
 1000|      1|        mIds["transparent_sorting"] = ID_TRANSPARENT_SORTING;
 1001|      1|        mIds["illumination_stage"] = ID_ILLUMINATION_STAGE;
 1002|      1|        mIds["decal"] = ID_DECAL;
 1003|      1|        mIds["cull_hardware"] = ID_CULL_HARDWARE;
 1004|      1|        mIds["clockwise"] = ID_CLOCKWISE;
 1005|      1|        mIds["anticlockwise"] = ID_ANTICLOCKWISE;
 1006|      1|        mIds["cull_software"] = ID_CULL_SOFTWARE;
 1007|      1|        mIds["back"] = ID_BACK;
 1008|      1|        mIds["front"] = ID_FRONT;
 1009|      1|        mIds["lighting"] = ID_LIGHTING;
 1010|      1|        mIds["shading"] = ID_SHADING;
 1011|      1|        mIds["flat"] = ID_FLAT;
 1012|      1|        mIds["gouraud"] = ID_GOURAUD;
 1013|      1|        mIds["phong"] = ID_PHONG;
 1014|      1|        mIds["polygon_mode"] = ID_POLYGON_MODE;
 1015|      1|        mIds["solid"] = ID_SOLID;
 1016|      1|        mIds["wireframe"] = ID_WIREFRAME;
 1017|      1|        mIds["points"] = ID_POINTS;
 1018|      1|        mIds["polygon_mode_overrideable"] = ID_POLYGON_MODE_OVERRIDEABLE;
 1019|      1|        mIds["fog_override"] = ID_FOG_OVERRIDE;
 1020|      1|        mIds["none"] = ID_NONE;
 1021|      1|        mIds["linear"] = ID_LINEAR;
 1022|      1|        mIds["exp"] = ID_EXP;
 1023|      1|        mIds["exp2"] = ID_EXP2;
 1024|      1|        mIds["colour_write"] = ID_COLOUR_WRITE;
 1025|      1|        mIds["max_lights"] = ID_MAX_LIGHTS;
 1026|      1|        mIds["start_light"] = ID_START_LIGHT;
 1027|      1|        mIds["iteration"] = ID_ITERATION;
 1028|      1|        mIds["once"] = ID_ONCE;
 1029|      1|        mIds["once_per_light"] = ID_ONCE_PER_LIGHT;
 1030|      1|        mIds["per_n_lights"] = ID_PER_N_LIGHTS;
 1031|      1|        mIds["per_light"] = ID_PER_LIGHT;
 1032|      1|        mIds["point"] = ID_POINT;
 1033|      1|        mIds["spot"] = ID_SPOT;
 1034|      1|        mIds["directional"] = ID_DIRECTIONAL;
 1035|      1|        mIds["light_mask"] = ID_LIGHT_MASK;
 1036|      1|        mIds["point_size"] = ID_POINT_SIZE;
 1037|      1|        mIds["point_sprites"] = ID_POINT_SPRITES;
 1038|      1|        mIds["point_size_min"] = ID_POINT_SIZE_MIN;
 1039|      1|        mIds["point_size_max"] = ID_POINT_SIZE_MAX;
 1040|      1|        mIds["point_size_attenuation"] = ID_POINT_SIZE_ATTENUATION;
 1041|       |
 1042|      1|        mIds["texture_alias"] = ID_TEXTURE_ALIAS;
 1043|      1|        mIds["texture"] = ID_TEXTURE;
 1044|      1|        mIds["1d"] = ID_1D;
 1045|      1|        mIds["2d"] = ID_2D;
 1046|      1|        mIds["3d"] = ID_3D;
 1047|      1|        mIds["cubic"] = ID_CUBIC;
 1048|      1|        mIds["unlimited"] = ID_UNLIMITED;
 1049|      1|        mIds["2darray"] = ID_2DARRAY; // deprecated and undocumented
 1050|      1|        mIds["2d_array"] = ID_2DARRAY;
 1051|      1|        mIds["2d_ms"] = ID_2DMS;
 1052|      1|        mIds["alpha"] = ID_ALPHA;
 1053|      1|        mIds["gamma"] = ID_GAMMA;
 1054|      1|        mIds["anim_texture"] = ID_ANIM_TEXTURE;
 1055|      1|        mIds["cubic_texture"] = ID_CUBIC_TEXTURE;
 1056|      1|        mIds["separateUV"] = ID_SEPARATE_UV;
 1057|      1|        mIds["combinedUVW"] = ID_COMBINED_UVW;
 1058|      1|        mIds["tex_coord_set"] = ID_TEX_COORD_SET;
 1059|      1|        mIds["tex_address_mode"] = ID_TEX_ADDRESS_MODE;
 1060|      1|        mIds["wrap"] = ID_WRAP;
 1061|      1|        mIds["clamp"] = ID_CLAMP;
 1062|      1|        mIds["mirror"] = ID_MIRROR;
 1063|      1|        mIds["border"] = ID_BORDER;
 1064|      1|        mIds["tex_border_colour"] = ID_TEX_BORDER_COLOUR;
 1065|      1|        mIds["filtering"] = ID_FILTERING;
 1066|      1|        mIds["bilinear"] = ID_BILINEAR;
 1067|      1|        mIds["trilinear"] = ID_TRILINEAR;
 1068|      1|        mIds["anisotropic"] = ID_ANISOTROPIC;
 1069|      1|        mIds["compare_test"] = ID_CMPTEST;
 1070|      1|        mIds["compare_func"] = ID_CMPFUNC;
 1071|      1|        mIds["max_anisotropy"] = ID_MAX_ANISOTROPY;
 1072|      1|        mIds["mipmap_bias"] = ID_MIPMAP_BIAS;
 1073|      1|        mIds["colour_op"] = ID_COLOUR_OP;
 1074|      1|        mIds["replace"] = ID_REPLACE;
 1075|      1|        mIds["add"] = ID_ADD;
 1076|      1|        mIds["modulate"] = ID_MODULATE;
 1077|      1|        mIds["alpha_blend"] = ID_ALPHA_BLEND;
 1078|      1|        mIds["colour_op_ex"] = ID_COLOUR_OP_EX;
 1079|      1|        mIds["source1"] = ID_SOURCE1;
 1080|      1|        mIds["source2"] = ID_SOURCE2;
 1081|      1|        mIds["modulate"] = ID_MODULATE;
 1082|      1|        mIds["modulate_x2"] = ID_MODULATE_X2;
 1083|      1|        mIds["modulate_x4"] = ID_MODULATE_X4;
 1084|      1|        mIds["add"] = ID_ADD;
 1085|      1|        mIds["add_signed"] = ID_ADD_SIGNED;
 1086|      1|        mIds["add_smooth"] = ID_ADD_SMOOTH;
 1087|      1|        mIds["subtract"] = ID_SUBTRACT;
 1088|      1|        mIds["blend_diffuse_alpha"] = ID_BLEND_DIFFUSE_ALPHA;
 1089|      1|        mIds["blend_texture_alpha"] = ID_BLEND_TEXTURE_ALPHA;
 1090|      1|        mIds["blend_current_alpha"] = ID_BLEND_CURRENT_ALPHA;
 1091|      1|        mIds["blend_manual"] = ID_BLEND_MANUAL;
 1092|      1|        mIds["dotproduct"] = ID_DOT_PRODUCT;
 1093|      1|        mIds["blend_diffuse_colour"] = ID_BLEND_DIFFUSE_COLOUR;
 1094|      1|        mIds["src_current"] = ID_SRC_CURRENT;
 1095|      1|        mIds["src_texture"] = ID_SRC_TEXTURE;
 1096|      1|        mIds["src_diffuse"] = ID_SRC_DIFFUSE;
 1097|      1|        mIds["src_specular"] = ID_SRC_SPECULAR;
 1098|      1|        mIds["src_manual"] = ID_SRC_MANUAL;
 1099|      1|        mIds["colour_op_multipass_fallback"] = ID_COLOUR_OP_MULTIPASS_FALLBACK;
 1100|      1|        mIds["alpha_op_ex"] = ID_ALPHA_OP_EX;
 1101|      1|        mIds["env_map"] = ID_ENV_MAP;
 1102|      1|        mIds["spherical"] = ID_SPHERICAL;
 1103|      1|        mIds["planar"] = ID_PLANAR;
 1104|      1|        mIds["cubic_reflection"] = ID_CUBIC_REFLECTION;
 1105|      1|        mIds["cubic_normal"] = ID_CUBIC_NORMAL;
 1106|      1|        mIds["scroll"] = ID_SCROLL;
 1107|      1|        mIds["scroll_anim"] = ID_SCROLL_ANIM;
 1108|      1|        mIds["rotate"] = ID_ROTATE;
 1109|      1|        mIds["rotate_anim"] = ID_ROTATE_ANIM;
 1110|      1|        mIds["scale"] = ID_SCALE;
 1111|      1|        mIds["wave_xform"] = ID_WAVE_XFORM;
 1112|      1|        mIds["scroll_x"] = ID_SCROLL_X;
 1113|      1|        mIds["scroll_y"] = ID_SCROLL_Y;
 1114|      1|        mIds["scale_x"] = ID_SCALE_X;
 1115|      1|        mIds["scale_y"] = ID_SCALE_Y;
 1116|      1|        mIds["sine"] = ID_SINE;
 1117|      1|        mIds["triangle"] = ID_TRIANGLE;
 1118|      1|        mIds["sawtooth"] = ID_SAWTOOTH;
 1119|      1|        mIds["square"] = ID_SQUARE;
 1120|      1|        mIds["inverse_sawtooth"] = ID_INVERSE_SAWTOOTH;
 1121|      1|        mIds["transform"] = ID_TRANSFORM;
 1122|      1|        mIds["geometry"] = ID_GEOMETRY;
 1123|      1|        mIds["tessellation_hull"] = ID_TESSELLATION_HULL;
 1124|      1|        mIds["tessellation_domain"] = ID_TESSELLATION_DOMAIN;
 1125|      1|        mIds["compute"] = ID_COMPUTE;
 1126|      1|        mIds["content_type"] = ID_CONTENT_TYPE;
 1127|      1|        mIds["named"] = ID_NAMED;
 1128|      1|        mIds["shadow"] = ID_SHADOW;
 1129|      1|        mIds["texture_source"] = ID_TEXTURE_SOURCE;
 1130|      1|        mIds["shared_params"] = ID_SHARED_PARAMS;
 1131|      1|        mIds["shared_param_named"] = ID_SHARED_PARAM_NAMED;
 1132|      1|        mIds["shared_params_ref"] = ID_SHARED_PARAMS_REF;
 1133|      1|        mIds["use_linear_colours"] = ID_USE_LINEAR_COLOURS;
 1134|       |
 1135|       |        // Particle system
 1136|      1|        mIds["particle_system"] = ID_PARTICLE_SYSTEM;
 1137|      1|        mIds["emitter"] = ID_EMITTER;
 1138|      1|        mIds["affector"] = ID_AFFECTOR;
 1139|       |
 1140|       |        // Compositor
 1141|      1|        mIds["compositor"] = ID_COMPOSITOR;
 1142|      1|        mIds["target"] = ID_TARGET;
 1143|      1|        mIds["target_output"] = ID_TARGET_OUTPUT;
 1144|       |
 1145|      1|        mIds["input"] = ID_INPUT;
 1146|       |        //mIds["none"] = ID_NONE; - already registered
 1147|      1|        mIds["previous"] = ID_PREVIOUS;
 1148|      1|        mIds["target_width"] = ID_TARGET_WIDTH;
 1149|      1|        mIds["target_height"] = ID_TARGET_HEIGHT;
 1150|      1|        mIds["target_width_scaled"] = ID_TARGET_WIDTH_SCALED;
 1151|      1|        mIds["target_height_scaled"] = ID_TARGET_HEIGHT_SCALED;
 1152|      1|        mIds["pooled"] = ID_POOLED;
 1153|       |        //mIds["gamma"] = ID_GAMMA; - already registered
 1154|      1|        mIds["no_fsaa"] = ID_NO_FSAA;
 1155|      1|        mIds["fsaa"] = ID_FSAA;
 1156|      1|        mIds["depth_pool"] = ID_DEPTH_POOL;
 1157|       |
 1158|      1|        mIds["texture_ref"] = ID_TEXTURE_REF;
 1159|      1|        mIds["local_scope"] = ID_SCOPE_LOCAL;
 1160|      1|        mIds["chain_scope"] = ID_SCOPE_CHAIN;
 1161|      1|        mIds["global_scope"] = ID_SCOPE_GLOBAL;
 1162|      1|        mIds["compositor_logic"] = ID_COMPOSITOR_LOGIC;
 1163|       |
 1164|      1|        mIds["only_initial"] = ID_ONLY_INITIAL;
 1165|      1|        mIds["visibility_mask"] = ID_VISIBILITY_MASK;
 1166|      1|        mIds["lod_bias"] = ID_LOD_BIAS;
 1167|      1|        mIds["material_scheme"] = ID_MATERIAL_SCHEME;
 1168|      1|        mIds["shadows"] = ID_SHADOWS_ENABLED;
 1169|       |
 1170|      1|        mIds["clear"] = ID_CLEAR;
 1171|      1|        mIds["stencil"] = ID_STENCIL;
 1172|      1|        mIds["render_scene"] = ID_RENDER_SCENE;
 1173|      1|        mIds["render_quad"] = ID_RENDER_QUAD;
 1174|      1|        mIds["identifier"] = ID_IDENTIFIER;
 1175|      1|        mIds["first_render_queue"] = ID_FIRST_RENDER_QUEUE;
 1176|      1|        mIds["last_render_queue"] = ID_LAST_RENDER_QUEUE;
 1177|      1|        mIds["quad_normals"] = ID_QUAD_NORMALS;
 1178|      1|        mIds["camera_far_corners_view_space"] = ID_CAMERA_FAR_CORNERS_VIEW_SPACE;
 1179|      1|        mIds["camera_far_corners_world_space"] = ID_CAMERA_FAR_CORNERS_WORLD_SPACE;
 1180|       |
 1181|      1|        mIds["buffers"] = ID_BUFFERS;
 1182|      1|        mIds["colour"] = ID_COLOUR;
 1183|      1|        mIds["depth"] = ID_DEPTH;
 1184|      1|        mIds["colour_value"] = ID_COLOUR_VALUE;
 1185|      1|        mIds["depth_value"] = ID_DEPTH_VALUE;
 1186|      1|        mIds["stencil_value"] = ID_STENCIL_VALUE;
 1187|       |
 1188|      1|        mIds["check"] = ID_CHECK;
 1189|      1|        mIds["comp_func"] = ID_COMP_FUNC;
 1190|      1|        mIds["ref_value"] = ID_REF_VALUE;
 1191|      1|        mIds["mask"] = ID_MASK;
 1192|      1|        mIds["fail_op"] = ID_FAIL_OP;
 1193|      1|        mIds["keep"] = ID_KEEP;
 1194|      1|        mIds["increment"] = ID_INCREMENT;
 1195|      1|        mIds["decrement"] = ID_DECREMENT;
 1196|      1|        mIds["increment_wrap"] = ID_INCREMENT_WRAP;
 1197|      1|        mIds["decrement_wrap"] = ID_DECREMENT_WRAP;
 1198|      1|        mIds["invert"] = ID_INVERT;
 1199|      1|        mIds["depth_fail_op"] = ID_DEPTH_FAIL_OP;
 1200|      1|        mIds["pass_op"] = ID_PASS_OP;
 1201|      1|        mIds["two_sided"] = ID_TWO_SIDED;
 1202|       |
 1203|      1|        mIds["line_width"] = ID_LINE_WIDTH;
 1204|      1|        mIds["sampler"] = ID_SAMPLER;
 1205|      1|        mIds["sampler_ref"] = ID_SAMPLER_REF;
 1206|      1|        mIds["thread_groups"] = ID_THREAD_GROUPS;
 1207|      1|        mIds["render_custom"] = ID_RENDER_CUSTOM;
 1208|      1|        mIds["auto"] = ID_AUTO;
 1209|      1|        mIds["camera"] = ID_CAMERA;
 1210|      1|        mIds["align_to_face"] = ID_ALIGN_TO_FACE;
 1211|      1|        mIds["unordered_access_mip"] = ID_UNORDERED_ACCESS_MIP;
 1212|       |
 1213|      1|		mLargestRegisteredWordId = ID_END_BUILTIN_IDS;
 1214|      1|	}
_ZN4Ogre14ScriptCompiler19AbstractTreeBuilderC2EPS0_:
 1233|  36.0k|        :mNodes(std::make_shared<AbstractNodeList>()), mCurrent(0), mCompiler(compiler)
 1234|  36.0k|    {
 1235|  36.0k|    }
_ZNK4Ogre14ScriptCompiler19AbstractTreeBuilder9getResultEv:
 1238|  36.0k|    {
 1239|  36.0k|        return mNodes;
 1240|  36.0k|    }
_ZN4Ogre14ScriptCompiler19AbstractTreeBuilder5visitEPNS_12ConcreteNodeE:
 1243|   607k|    {
 1244|   607k|        AbstractNodePtr asn;
 1245|       |
 1246|       |        // Import = "import" >> 2 children, mCurrent == null
 1247|   607k|        if(node->type == CNT_IMPORT && mCurrent == 0)
  ------------------
  |  Branch (1247:12): [True: 17.1k, False: 590k]
  |  Branch (1247:40): [True: 15.9k, False: 1.20k]
  ------------------
 1248|  15.9k|        {
 1249|  15.9k|            if(node->children.size() > 2)
  ------------------
  |  Branch (1249:16): [True: 0, False: 15.9k]
  ------------------
 1250|      0|            {
 1251|      0|                mCompiler->addError(CE_FEWERPARAMETERSEXPECTED, node->file, node->line);
 1252|      0|                return;
 1253|      0|            }
 1254|  15.9k|            if(node->children.size() < 2)
  ------------------
  |  Branch (1254:16): [True: 0, False: 15.9k]
  ------------------
 1255|      0|            {
 1256|      0|                mCompiler->addError(CE_STRINGEXPECTED, node->file, node->line);
 1257|      0|                return;
 1258|      0|            }
 1259|       |
 1260|  15.9k|            ImportAbstractNode *impl = OGRE_NEW ImportAbstractNode();
 1261|  15.9k|            impl->line = node->line;
 1262|  15.9k|            impl->file = node->file;
 1263|       |
 1264|  15.9k|            ConcreteNodeList::iterator iter = node->children.begin();
 1265|  15.9k|            impl->target = (*iter)->token;
 1266|       |
 1267|  15.9k|            iter++;
 1268|  15.9k|            impl->source = (*iter)->token;
 1269|       |
 1270|  15.9k|            asn = AbstractNodePtr(impl);
 1271|  15.9k|        }
 1272|       |        // variable set = "set" >> 2 children, children[0] == variable
 1273|   591k|        else if(node->type == CNT_VARIABLE_ASSIGN)
  ------------------
  |  Branch (1273:17): [True: 10.8k, False: 580k]
  ------------------
 1274|  10.8k|        {
 1275|  10.8k|            if(node->children.size() > 2)
  ------------------
  |  Branch (1275:16): [True: 0, False: 10.8k]
  ------------------
 1276|      0|            {
 1277|      0|                mCompiler->addError(CE_FEWERPARAMETERSEXPECTED, node->file, node->line);
 1278|      0|                return;
 1279|      0|            }
 1280|  10.8k|            if(node->children.size() < 2)
  ------------------
  |  Branch (1280:16): [True: 0, False: 10.8k]
  ------------------
 1281|      0|            {
 1282|      0|                mCompiler->addError(CE_STRINGEXPECTED, node->file, node->line);
 1283|      0|                return;
 1284|      0|            }
 1285|  10.8k|            if(node->children.front()->type != CNT_VARIABLE)
  ------------------
  |  Branch (1285:16): [True: 0, False: 10.8k]
  ------------------
 1286|      0|            {
 1287|      0|                mCompiler->addError(CE_VARIABLEEXPECTED, node->children.front()->file, node->children.front()->line);
 1288|      0|                return;
 1289|      0|            }
 1290|       |
 1291|  10.8k|            ConcreteNodeList::iterator i = node->children.begin();
 1292|  10.8k|            String name = (*i)->token;
 1293|       |
 1294|  10.8k|            ++i;
 1295|  10.8k|            String value = (*i)->token;
 1296|       |
 1297|  10.8k|            if(mCurrent && mCurrent->type == ANT_OBJECT)
  ------------------
  |  Branch (1297:16): [True: 9.34k, False: 1.50k]
  |  Branch (1297:28): [True: 7.10k, False: 2.23k]
  ------------------
 1298|  7.10k|            {
 1299|  7.10k|                ObjectAbstractNode *ptr = (ObjectAbstractNode*)mCurrent;
 1300|  7.10k|                ptr->setVariable(name, value);
 1301|  7.10k|            }
 1302|  3.74k|            else
 1303|  3.74k|            {
 1304|  3.74k|                mCompiler->mEnv.insert(std::make_pair(name, value));
 1305|  3.74k|            }
 1306|  10.8k|        }
 1307|       |        // variable = $*, no children
 1308|   580k|        else if(node->type == CNT_VARIABLE)
  ------------------
  |  Branch (1308:17): [True: 8.32k, False: 572k]
  ------------------
 1309|  8.32k|        {
 1310|  8.32k|            if(!node->children.empty())
  ------------------
  |  Branch (1310:16): [True: 0, False: 8.32k]
  ------------------
 1311|      0|            {
 1312|      0|                mCompiler->addError(CE_FEWERPARAMETERSEXPECTED, node->file, node->line);
 1313|      0|                return;
 1314|      0|            }
 1315|       |
 1316|  8.32k|            VariableAccessAbstractNode *impl = OGRE_NEW VariableAccessAbstractNode(mCurrent);
 1317|  8.32k|            impl->line = node->line;
 1318|  8.32k|            impl->file = node->file;
 1319|  8.32k|            impl->name = node->token;
 1320|       |
 1321|  8.32k|            asn = AbstractNodePtr(impl);
 1322|  8.32k|        }
 1323|       |        // Handle properties and objects here
 1324|   572k|        else if(!node->children.empty())
  ------------------
  |  Branch (1324:17): [True: 278k, False: 293k]
  ------------------
 1325|   278k|        {
 1326|       |            // Grab the last two nodes
 1327|   278k|            ConcreteNodePtr temp1, temp2;
 1328|   278k|            ConcreteNodeList::reverse_iterator riter = node->children.rbegin();
 1329|   278k|            if(riter != node->children.rend())
  ------------------
  |  Branch (1329:16): [True: 278k, False: 0]
  ------------------
 1330|   278k|            {
 1331|   278k|                temp1 = *riter;
 1332|   278k|                riter++;
 1333|   278k|            }
 1334|   278k|            if(riter != node->children.rend())
  ------------------
  |  Branch (1334:16): [True: 167k, False: 111k]
  ------------------
 1335|   167k|                temp2 = *riter;
 1336|       |
 1337|       |            // object = last 2 children == { and }
 1338|   278k|            if(temp1 && temp2 &&
  ------------------
  |  Branch (1338:16): [True: 278k, False: 0]
  |  Branch (1338:25): [True: 167k, False: 111k]
  ------------------
 1339|   167k|                temp1->type == CNT_RBRACE && temp2->type == CNT_LBRACE)
  ------------------
  |  Branch (1339:17): [True: 113k, False: 54.1k]
  |  Branch (1339:46): [True: 113k, False: 0]
  ------------------
 1340|   113k|            {
 1341|   113k|                if(node->children.size() < 2)
  ------------------
  |  Branch (1341:20): [True: 0, False: 113k]
  ------------------
 1342|      0|                {
 1343|      0|                    mCompiler->addError(CE_STRINGEXPECTED, node->file, node->line);
 1344|      0|                    return;
 1345|      0|                }
 1346|       |
 1347|   113k|                ObjectAbstractNode *impl = OGRE_NEW ObjectAbstractNode(mCurrent);
 1348|   113k|                impl->line = node->line;
 1349|   113k|                impl->file = node->file;
 1350|   113k|                impl->abstract = false;
 1351|       |
 1352|       |                // Create a temporary detail list
 1353|   113k|                std::list<ConcreteNode*> temp;
 1354|   113k|                if(node->token == "abstract")
  ------------------
  |  Branch (1354:20): [True: 345, False: 112k]
  ------------------
 1355|    345|                {
 1356|    345|                    impl->abstract = true;
 1357|    345|                    for(const auto& c : node->children)
  ------------------
  |  Branch (1357:39): [True: 1.48k, False: 345]
  ------------------
 1358|  1.48k|                        temp.push_back(c.get());
 1359|    345|                }
 1360|   112k|                else
 1361|   112k|                {
 1362|   112k|                    temp.push_back(node);
 1363|   112k|                    for(const auto& c : node->children)
  ------------------
  |  Branch (1363:39): [True: 309k, False: 112k]
  ------------------
 1364|   309k|                        temp.push_back(c.get());
 1365|   112k|                }
 1366|       |
 1367|       |                // Get the type of object
 1368|   113k|                std::list<ConcreteNode*>::const_iterator iter = temp.begin();
 1369|   113k|                impl->cls = (*iter)->token;
 1370|   113k|                ++iter;
 1371|       |
 1372|       |                // try to map the cls to an id
 1373|   113k|                ScriptCompiler::IdMap::const_iterator iter2 = mCompiler->mIds.find(impl->cls);
 1374|   113k|                if(iter2 != mCompiler->mIds.end())
  ------------------
  |  Branch (1374:20): [True: 95.9k, False: 17.3k]
  ------------------
 1375|  95.9k|                {
 1376|  95.9k|                    impl->id = iter2->second;
 1377|  95.9k|                }
 1378|  17.3k|                else
 1379|  17.3k|                {
 1380|  17.3k|                    mCompiler->addError(CE_UNEXPECTEDTOKEN, impl->file, impl->line,
 1381|  17.3k|                                        "'" + impl->cls + "'. If this is a legacy script you must prepend the type (e.g. font, overlay).");
 1382|  17.3k|                }
 1383|       |
 1384|       |                // Get the name
 1385|       |                // Unless the type is in the exclusion list
 1386|   113k|                if(iter != temp.end() && ((*iter)->type == CNT_WORD || (*iter)->type == CNT_QUOTE || (*iter)->type == CNT_VARIABLE) &&
  ------------------
  |  Branch (1386:20): [True: 113k, False: 0]
  |  Branch (1386:20): [True: 53.3k, False: 59.9k]
  |  Branch (1386:43): [True: 56.0k, False: 57.2k]
  |  Branch (1386:72): [True: 843, False: 56.3k]
  |  Branch (1386:102): [True: 120, False: 56.2k]
  ------------------
 1387|  57.0k|                    !mCompiler->isNameExcluded(*impl, mCurrent))
  ------------------
  |  Branch (1387:21): [True: 53.3k, False: 3.69k]
  ------------------
 1388|  53.3k|                {
 1389|  53.3k|                    impl->name = (*iter)->token;
 1390|  53.3k|                    ++iter;
 1391|  53.3k|                }
 1392|       |
 1393|       |                // Everything up until the colon is a "value" of this object
 1394|   135k|                while(iter != temp.end() && (*iter)->type != CNT_COLON && (*iter)->type != CNT_LBRACE)
  ------------------
  |  Branch (1394:23): [True: 135k, False: 25]
  |  Branch (1394:23): [True: 22.1k, False: 113k]
  |  Branch (1394:45): [True: 129k, False: 5.69k]
  |  Branch (1394:75): [True: 22.1k, False: 107k]
  ------------------
 1395|  22.1k|                {
 1396|  22.1k|                    if((*iter)->type == CNT_VARIABLE)
  ------------------
  |  Branch (1396:24): [True: 864, False: 21.2k]
  ------------------
 1397|    864|                    {
 1398|    864|                        VariableAccessAbstractNode *var = OGRE_NEW VariableAccessAbstractNode(impl);
 1399|    864|                        var->file = (*iter)->file;
 1400|    864|                        var->line = (*iter)->line;
 1401|    864|                        var->type = ANT_VARIABLE_ACCESS;
 1402|    864|                        var->name = (*iter)->token;
 1403|    864|                        impl->values.push_back(AbstractNodePtr(var));
 1404|    864|                    }
 1405|  21.2k|                    else
 1406|  21.2k|                    {
 1407|  21.2k|                        AtomAbstractNode *atom = OGRE_NEW AtomAbstractNode(impl);
 1408|  21.2k|                        atom->file = (*iter)->file;
 1409|  21.2k|                        atom->line = (*iter)->line;
 1410|  21.2k|                        atom->type = ANT_ATOM;
 1411|  21.2k|                        atom->value = (*iter)->token;
 1412|       |
 1413|  21.2k|                        auto idpos = mCompiler->mIds.find(atom->value);
 1414|  21.2k|                        if(idpos != mCompiler->mIds.end())
  ------------------
  |  Branch (1414:28): [True: 3.95k, False: 17.2k]
  ------------------
 1415|  3.95k|                            atom->id = idpos->second;
 1416|       |
 1417|  21.2k|                        impl->values.push_back(AbstractNodePtr(atom));
 1418|  21.2k|                    }
 1419|  22.1k|                    ++iter;
 1420|  22.1k|                }
 1421|       |
 1422|       |                // Find the bases
 1423|   113k|                if(iter != temp.end() && (*iter)->type == CNT_COLON)
  ------------------
  |  Branch (1423:20): [True: 113k, False: 25]
  |  Branch (1423:20): [True: 5.69k, False: 107k]
  |  Branch (1423:42): [True: 5.69k, False: 107k]
  ------------------
 1424|  5.69k|                {
 1425|       |                    // Children of the ':' are bases
 1426|  5.69k|                    for(auto & j : (*iter)->children)
  ------------------
  |  Branch (1426:34): [True: 7.27k, False: 5.69k]
  ------------------
 1427|  7.27k|                        impl->bases.push_back(j->token);
 1428|  5.69k|                    ++iter;
 1429|  5.69k|                }
 1430|       |
 1431|   113k|                asn = AbstractNodePtr(impl);
 1432|   113k|                mCurrent = impl;
 1433|       |
 1434|       |                // Visit the children of the {
 1435|   113k|                AbstractTreeBuilder::visit(this, temp2->children);
 1436|       |
 1437|       |                // Go back up the stack
 1438|   113k|                mCurrent = impl->parent;
 1439|   113k|            }
 1440|       |            // Otherwise, it is a property
 1441|   165k|            else
 1442|   165k|            {
 1443|   165k|                PropertyAbstractNode *impl = OGRE_NEW PropertyAbstractNode(mCurrent);
 1444|   165k|                impl->line = node->line;
 1445|   165k|                impl->file = node->file;
 1446|   165k|                impl->name = node->token;
 1447|       |
 1448|   165k|                ScriptCompiler::IdMap::const_iterator iter2 = mCompiler->mIds.find(impl->name);
 1449|   165k|                if(iter2 != mCompiler->mIds.end())
  ------------------
  |  Branch (1449:20): [True: 102k, False: 62.7k]
  ------------------
 1450|   102k|                    impl->id = iter2->second;
 1451|       |
 1452|   165k|                asn = AbstractNodePtr(impl);
 1453|   165k|                mCurrent = impl;
 1454|       |
 1455|       |                // Visit the children of the {
 1456|   165k|                AbstractTreeBuilder::visit(this, node->children);
 1457|       |
 1458|       |                // Go back up the stack
 1459|   165k|                mCurrent = impl->parent;
 1460|   165k|            }
 1461|   278k|        }
 1462|       |        // Otherwise, it is a standard atom
 1463|   293k|        else
 1464|   293k|        {
 1465|   293k|            AtomAbstractNode *impl = OGRE_NEW AtomAbstractNode(mCurrent);
 1466|   293k|            impl->line = node->line;
 1467|   293k|            impl->file = node->file;
 1468|   293k|            impl->value = node->token;
 1469|       |
 1470|   293k|            ScriptCompiler::IdMap::const_iterator iter2 = mCompiler->mIds.find(impl->value);
 1471|   293k|            if(iter2 != mCompiler->mIds.end())
  ------------------
  |  Branch (1471:16): [True: 67.9k, False: 225k]
  ------------------
 1472|  67.9k|                impl->id = iter2->second;
 1473|       |
 1474|   293k|            asn = AbstractNodePtr(impl);
 1475|       |
 1476|   293k|            if(mCurrent && mCurrent->type != ANT_PROPERTY)
  ------------------
  |  Branch (1476:16): [True: 269k, False: 24.6k]
  |  Branch (1476:28): [True: 12.9k, False: 256k]
  ------------------
 1477|  12.9k|            {
 1478|       |                // stray atom outside of a property is likely a property without a value
 1479|  12.9k|                mCompiler->addError(*impl, "missing property value");
 1480|  12.9k|            }
 1481|   293k|        }
 1482|       |
 1483|       |        // Here, we must insert the node into the tree
 1484|   607k|        if(asn)
  ------------------
  |  Branch (1484:12): [True: 596k, False: 10.8k]
  ------------------
 1485|   596k|        {
 1486|   596k|            if(mCurrent)
  ------------------
  |  Branch (1486:16): [True: 523k, False: 73.5k]
  ------------------
 1487|   523k|            {
 1488|   523k|                if(mCurrent->type == ANT_PROPERTY)
  ------------------
  |  Branch (1488:20): [True: 305k, False: 218k]
  ------------------
 1489|   305k|                {
 1490|   305k|                    PropertyAbstractNode *impl = static_cast<PropertyAbstractNode*>(mCurrent);
 1491|   305k|                    impl->values.push_back(asn);
 1492|   305k|                }
 1493|   218k|                else
 1494|   218k|                {
 1495|   218k|                    ObjectAbstractNode *impl = static_cast<ObjectAbstractNode*>(mCurrent);
 1496|   218k|                    impl->children.push_back(asn);
 1497|   218k|                }
 1498|   523k|            }
 1499|  73.5k|            else
 1500|  73.5k|            {
 1501|  73.5k|                mNodes->push_back(asn);
 1502|  73.5k|            }
 1503|   596k|        }
 1504|   607k|    }
_ZN4Ogre14ScriptCompiler19AbstractTreeBuilder5visitEPS1_RKNSt3__14listINS_9SharedPtrINS_12ConcreteNodeEEENS3_9allocatorIS7_EEEE:
 1507|   314k|    {
 1508|   314k|        for(const auto & node : nodes)
  ------------------
  |  Branch (1508:31): [True: 607k, False: 314k]
  ------------------
 1509|   607k|            visitor->visit(node.get());
 1510|   314k|    }
_ZN4Ogre21ScriptCompilerManager12getSingletonEv:
 1522|   103k|    {
 1523|       |        assert( msSingleton );  return ( *msSingleton );
 1524|   103k|    }
_ZN4Ogre21ScriptCompilerManagerC2Ev:
 1527|      1|    {
 1528|      1|            OGRE_LOCK_AUTO_MUTEX;
 1529|      1|        mScriptPatterns.push_back("*.program");
 1530|      1|        mScriptPatterns.push_back("*.material");
 1531|      1|        mScriptPatterns.push_back("*.particle");
 1532|      1|        mScriptPatterns.push_back("*.compositor");
 1533|      1|        mScriptPatterns.push_back("*.os");
 1534|      1|        ResourceGroupManager::getSingleton()._registerScriptLoader(this);
 1535|       |
 1536|       |        mBuiltinTranslatorManager = OGRE_NEW BuiltinScriptTranslatorManager();
 1537|      1|        mManagers.push_back(mBuiltinTranslatorManager);
 1538|      1|    }
_ZN4Ogre21ScriptCompilerManager11setListenerEPNS_22ScriptCompilerListenerE:
 1546|      1|    {
 1547|      1|            OGRE_LOCK_AUTO_MUTEX;
 1548|      1|        mScriptCompiler.setListener(listener);
 1549|      1|    }
_ZN4Ogre21ScriptCompilerManager13getTranslatorERKNS_9SharedPtrINS_12AbstractNodeEEE:
 1582|  98.1k|    {
 1583|  98.1k|        ScriptTranslator *translator = 0;
 1584|  98.1k|        {
 1585|  98.1k|                    OGRE_LOCK_AUTO_MUTEX;
 1586|       |
 1587|       |            // Start looking from the back
 1588|   130k|            for(std::vector<ScriptTranslatorManager*>::reverse_iterator i = mManagers.rbegin(); i != mManagers.rend(); ++i)
  ------------------
  |  Branch (1588:97): [True: 98.1k, False: 32.2k]
  ------------------
 1589|  98.1k|            {
 1590|  98.1k|                translator = (*i)->getTranslator(node);
 1591|  98.1k|                if(translator != 0)
  ------------------
  |  Branch (1591:20): [True: 65.9k, False: 32.2k]
  ------------------
 1592|  65.9k|                    break;
 1593|  98.1k|            }
 1594|  98.1k|        }
 1595|  98.1k|        return translator;
 1596|  98.1k|	}
_ZNK4Ogre21ScriptCompilerManager15getLoadingOrderEv:
 1614|      1|    {
 1615|       |        /// Load relatively early, before most script loaders run
 1616|      1|        return 90.0f;
 1617|      1|    }
_ZN4Ogre21ScriptCompilerManager11parseScriptERNS_9SharedPtrINS_10DataStreamEEERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
 1620|  5.80k|    {
 1621|  5.80k|        ConcreteNodeListPtr nodes =
 1622|  5.80k|            ScriptParser::parse(ScriptLexer::tokenize(stream->getAsString(), stream->getName()), stream->getName());
 1623|  5.80k|        {
 1624|       |            // compile is not reentrant
 1625|  5.80k|            OGRE_LOCK_AUTO_MUTEX;
 1626|  5.80k|            mScriptCompiler.compile(nodes, groupName);
 1627|  5.80k|        }
 1628|  5.80k|    }

_ZN4Ogre11ScriptLexer8tokenizeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
   35|  20.1k|    {
   36|  20.1k|        String error;
   37|  20.1k|        ScriptTokenList ret = _tokenize(str, source.c_str(), error);
   38|       |
   39|  20.1k|        if (!error.empty())
  ------------------
  |  Branch (39:13): [True: 3.63k, False: 16.5k]
  ------------------
   40|  3.63k|            LogManager::getSingleton().logError("ScriptLexer - " + error);
   41|       |
   42|  20.1k|        return ret;
   43|  20.1k|    }
_ZN4Ogre11ScriptLexer9_tokenizeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKcRS7_:
   46|  20.1k|    {
   47|       |        // State enums
   48|  20.1k|        enum{ READY = 0, COMMENT, MULTICOMMENT, WORD, QUOTE, VAR, POSSIBLECOMMENT };
   49|       |
   50|       |        // Set up some constant characters of interest
   51|  20.1k|        const wchar_t varopener = '$', quote = '\"', slash = '/', backslash = '\\', openbrace = '{', closebrace = '}', colon = ':', star = '*', cr = '\r', lf = '\n';
   52|  20.1k|        char c = 0, lastc = 0;
   53|       |
   54|  20.1k|        String lexeme;
   55|  20.1k|        uint32 line = 1, state = READY, lastQuote = 0, firstOpenBrace = 0, braceLayer = 0;
   56|  20.1k|        ScriptTokenList tokens;
   57|       |
   58|       |        // Iterate over the input
   59|  20.1k|        for(char i : str)
  ------------------
  |  Branch (59:20): [True: 15.4M, False: 18.4k]
  ------------------
   60|  15.4M|        {
   61|  15.4M|            lastc = c;
   62|  15.4M|            c = i;
   63|       |
   64|  15.4M|            if(c == quote)
  ------------------
  |  Branch (64:16): [True: 165k, False: 15.3M]
  ------------------
   65|   165k|                lastQuote = line;
   66|       |            
   67|  15.4M|            if(state == READY || state == WORD || state == VAR)
  ------------------
  |  Branch (67:16): [True: 2.92M, False: 12.5M]
  |  Branch (67:34): [True: 10.0M, False: 2.55M]
  |  Branch (67:51): [True: 420k, False: 2.13M]
  ------------------
   68|  13.3M|            {
   69|  13.3M|                if(c == openbrace)
  ------------------
  |  Branch (69:20): [True: 139k, False: 13.2M]
  ------------------
   70|   139k|                {
   71|   139k|                    if(braceLayer == 0)
  ------------------
  |  Branch (71:24): [True: 26.0k, False: 113k]
  ------------------
   72|  26.0k|                        firstOpenBrace = line;
   73|       |
   74|   139k|                    if (braceLayer >= MAX_BRACE_LAYER)
  ------------------
  |  Branch (74:25): [True: 111, False: 139k]
  ------------------
   75|    111|                    {
   76|    111|                        error = StringUtil::format("too deeply nested open brackets '{' (max %u) at %s:%d",
   77|    111|                                                   MAX_BRACE_LAYER, source, line);
   78|    111|                        return tokens;
   79|    111|                    }
   80|       |
   81|   139k|                    braceLayer ++;
   82|   139k|                }
   83|  13.2M|                else if(c == closebrace)
  ------------------
  |  Branch (83:25): [True: 120k, False: 13.0M]
  ------------------
   84|   120k|                {
   85|   120k|                    if (braceLayer == 0)
  ------------------
  |  Branch (85:25): [True: 1.62k, False: 118k]
  ------------------
   86|  1.62k|                    {
   87|  1.62k|                        error = StringUtil::format(
   88|  1.62k|                            "no matching open bracket '{' found for close bracket '}' at %s:%d", source,
   89|  1.62k|                            line);
   90|  1.62k|                        return tokens;
   91|  1.62k|                    }
   92|       |
   93|   118k|                    braceLayer --;
   94|   118k|                }
   95|  13.3M|            }
   96|       |            
   97|       |            
   98|  15.4M|            switch(state)
  ------------------
  |  Branch (98:20): [True: 15.4M, False: 0]
  ------------------
   99|  15.4M|            {
  100|  2.92M|            case READY:
  ------------------
  |  Branch (100:13): [True: 2.92M, False: 12.5M]
  ------------------
  101|  2.92M|                if(c == slash && lastc == slash)
  ------------------
  |  Branch (101:20): [True: 28.7k, False: 2.89M]
  |  Branch (101:34): [True: 23, False: 28.7k]
  ------------------
  102|     23|                {
  103|       |                    // Comment start, clear out the lexeme
  104|     23|                    lexeme = "";
  105|     23|                    state = COMMENT;
  106|     23|                }
  107|  2.92M|                else if(c == star && lastc == slash)
  ------------------
  |  Branch (107:25): [True: 18.0k, False: 2.90M]
  |  Branch (107:38): [True: 8, False: 18.0k]
  ------------------
  108|      8|                {
  109|      8|                    lexeme = "";
  110|      8|                    state = MULTICOMMENT;
  111|      8|                }
  112|  2.92M|                else if(c == quote)
  ------------------
  |  Branch (112:25): [True: 48.3k, False: 2.87M]
  ------------------
  113|  48.3k|                {
  114|       |                    // Clear out the lexeme ready to be filled with quotes!
  115|  48.3k|                    lexeme = c;
  116|  48.3k|                    state = QUOTE;
  117|  48.3k|                }
  118|  2.87M|                else if(c == varopener)
  ------------------
  |  Branch (118:25): [True: 21.9k, False: 2.85M]
  ------------------
  119|  21.9k|                {
  120|       |                    // Set up to read in a variable
  121|  21.9k|                    lexeme = c;
  122|  21.9k|                    state = VAR;
  123|  21.9k|                }
  124|  2.85M|                else if(isNewline(c))
  ------------------
  |  Branch (124:25): [True: 88.3k, False: 2.76M]
  ------------------
  125|  88.3k|                {
  126|  88.3k|                    lexeme = c;
  127|  88.3k|                    setToken(lexeme, line, tokens);
  128|  88.3k|                }
  129|  2.76M|                else if(!isWhitespace(c))
  ------------------
  |  Branch (129:25): [True: 954k, False: 1.80M]
  ------------------
  130|   954k|                {
  131|   954k|                    lexeme = c;
  132|   954k|                    if(c == slash)
  ------------------
  |  Branch (132:24): [True: 28.7k, False: 925k]
  ------------------
  133|  28.7k|                        state = POSSIBLECOMMENT;
  134|   925k|                    else
  135|   925k|                        state = WORD;
  136|   954k|                }
  137|  2.92M|                break;
  138|  1.10M|            case COMMENT:
  ------------------
  |  Branch (138:13): [True: 1.10M, False: 14.3M]
  ------------------
  139|  1.10M|                if(isNewline(c))
  ------------------
  |  Branch (139:20): [True: 27.6k, False: 1.07M]
  ------------------
  140|  27.6k|                {
  141|  27.6k|                    lexeme = c;
  142|  27.6k|                    setToken(lexeme, line, tokens);
  143|  27.6k|                    state = READY;
  144|  27.6k|                }
  145|  1.10M|                break;
  146|  22.0k|            case MULTICOMMENT:
  ------------------
  |  Branch (146:13): [True: 22.0k, False: 15.4M]
  ------------------
  147|  22.0k|                if(c == slash && lastc == star)
  ------------------
  |  Branch (147:20): [True: 478, False: 21.5k]
  |  Branch (147:34): [True: 49, False: 429]
  ------------------
  148|     49|                    state = READY;
  149|  22.0k|                break;
  150|  28.7k|            case POSSIBLECOMMENT:
  ------------------
  |  Branch (150:13): [True: 28.7k, False: 15.4M]
  ------------------
  151|  28.7k|                if(c == slash && lastc == slash)
  ------------------
  |  Branch (151:20): [True: 27.6k, False: 1.06k]
  |  Branch (151:34): [True: 27.6k, False: 0]
  ------------------
  152|  27.6k|                {
  153|  27.6k|                    lexeme = "";
  154|  27.6k|                    state = COMMENT;
  155|  27.6k|                    break;  
  156|  27.6k|                }
  157|  1.06k|                else if(c == star && lastc == slash)
  ------------------
  |  Branch (157:25): [True: 73, False: 987]
  |  Branch (157:38): [True: 73, False: 0]
  ------------------
  158|     73|                {
  159|     73|                    lexeme = "";
  160|     73|                    state = MULTICOMMENT;
  161|     73|                    break;
  162|     73|                }
  163|    987|                else
  164|    987|                {
  165|    987|                    state = WORD;
  166|    987|                    OGRE_FALLTHROUGH;
  167|    987|                }
  168|  10.0M|            case WORD:
  ------------------
  |  Branch (168:13): [True: 10.0M, False: 5.47M]
  ------------------
  169|  10.0M|                if(isNewline(c))
  ------------------
  |  Branch (169:20): [True: 454k, False: 9.56M]
  ------------------
  170|   454k|                {
  171|   454k|                    setToken(lexeme, line, tokens);
  172|   454k|                    lexeme = c;
  173|   454k|                    setToken(lexeme, line, tokens);
  174|   454k|                    state = READY;
  175|   454k|                }
  176|  9.56M|                else if(isWhitespace(c))
  ------------------
  |  Branch (176:25): [True: 415k, False: 9.14M]
  ------------------
  177|   415k|                {
  178|   415k|                    setToken(lexeme, line, tokens);
  179|   415k|                    state = READY;
  180|   415k|                }
  181|  9.14M|                else if(c == openbrace || c == closebrace || c == colon)
  ------------------
  |  Branch (181:25): [True: 16.4k, False: 9.12M]
  |  Branch (181:43): [True: 13.6k, False: 9.11M]
  |  Branch (181:62): [True: 10.9k, False: 9.10M]
  ------------------
  182|  41.0k|                {
  183|  41.0k|                    setToken(lexeme, line, tokens);
  184|  41.0k|                    lexeme = c;
  185|  41.0k|                    setToken(lexeme, line, tokens);
  186|  41.0k|                    state = READY;
  187|  41.0k|                }
  188|  9.10M|                else
  189|  9.10M|                {
  190|  9.10M|                    lexeme += c;
  191|  9.10M|                }
  192|  10.0M|                break;
  193|   981k|            case QUOTE:
  ------------------
  |  Branch (193:13): [True: 981k, False: 14.5M]
  ------------------
  194|   981k|                if(c != backslash)
  ------------------
  |  Branch (194:20): [True: 980k, False: 1.16k]
  ------------------
  195|   980k|                {
  196|       |                    // Allow embedded quotes with escaping
  197|   980k|                    if(c == quote && lastc == backslash)
  ------------------
  |  Branch (197:24): [True: 48.1k, False: 932k]
  |  Branch (197:38): [True: 10, False: 48.1k]
  ------------------
  198|     10|                    {
  199|     10|                        lexeme += c;
  200|     10|                    }
  201|   980k|                    else if(c == quote)
  ------------------
  |  Branch (201:29): [True: 48.1k, False: 932k]
  ------------------
  202|  48.1k|                    {
  203|  48.1k|                        lexeme += c;
  204|  48.1k|                        setToken(lexeme, line, tokens);
  205|  48.1k|                        state = READY;
  206|  48.1k|                    }
  207|   932k|                    else
  208|   932k|                    {
  209|       |                        // Backtrack here and allow a backslash normally within the quote
  210|   932k|                        if(lastc == backslash)
  ------------------
  |  Branch (210:28): [True: 1.05k, False: 931k]
  ------------------
  211|  1.05k|                            lexeme = lexeme + "\\" + c;
  212|   931k|                        else
  213|   931k|                            lexeme += c;
  214|   932k|                    }
  215|   980k|                }
  216|   981k|                break;
  217|   420k|            case VAR:
  ------------------
  |  Branch (217:13): [True: 420k, False: 15.0M]
  ------------------
  218|   420k|                if(isNewline(c))
  ------------------
  |  Branch (218:20): [True: 2.30k, False: 417k]
  ------------------
  219|  2.30k|                {
  220|  2.30k|                    setToken(lexeme, line, tokens);
  221|  2.30k|                    lexeme = c;
  222|  2.30k|                    setToken(lexeme, line, tokens);
  223|  2.30k|                    state = READY;
  224|  2.30k|                }
  225|   417k|                else if(isWhitespace(c))
  ------------------
  |  Branch (225:25): [True: 17.9k, False: 399k]
  ------------------
  226|  17.9k|                {
  227|  17.9k|                    setToken(lexeme, line, tokens);
  228|  17.9k|                    state = READY;
  229|  17.9k|                }
  230|   399k|                else if(c == openbrace || c == closebrace || c == colon)
  ------------------
  |  Branch (230:25): [True: 172, False: 399k]
  |  Branch (230:43): [True: 33, False: 399k]
  |  Branch (230:62): [True: 1.35k, False: 398k]
  ------------------
  231|  1.55k|                {
  232|  1.55k|                    setToken(lexeme, line, tokens);
  233|  1.55k|                    lexeme = c;
  234|  1.55k|                    setToken(lexeme, line, tokens);
  235|  1.55k|                    state = READY;
  236|  1.55k|                }
  237|   398k|                else
  238|   398k|                {
  239|   398k|                    lexeme += c;
  240|   398k|                }
  241|   420k|                break;
  242|  15.4M|            }
  243|       |
  244|       |            // Separate check for newlines just to track line numbers
  245|  15.4M|            if(c == cr || (c == lf && lastc != cr))
  ------------------
  |  Branch (245:16): [True: 3.60k, False: 15.4M]
  |  Branch (245:28): [True: 595k, False: 14.8M]
  |  Branch (245:39): [True: 594k, False: 621]
  ------------------
  246|   598k|                line++;
  247|  15.4M|        }
  248|       |
  249|       |        // Check for valid exit states
  250|  18.4k|        if(state == WORD || state == VAR)
  ------------------
  |  Branch (250:12): [True: 16.2k, False: 2.11k]
  |  Branch (250:29): [True: 95, False: 2.02k]
  ------------------
  251|  16.3k|        {
  252|  16.3k|            if(!lexeme.empty())
  ------------------
  |  Branch (252:16): [True: 16.3k, False: 0]
  ------------------
  253|  16.3k|                setToken(lexeme, line, tokens);
  254|  16.3k|        }
  255|  2.02k|        else
  256|  2.02k|        {
  257|  2.02k|            if(state == QUOTE)
  ------------------
  |  Branch (257:16): [True: 221, False: 1.80k]
  ------------------
  258|    221|            {
  259|    221|                error = StringUtil::format("no matching \" found for \" at %s:%d", source, lastQuote);
  260|    221|                return tokens;
  261|    221|            }
  262|  2.02k|        }
  263|       |        
  264|       |        // Check that all opened brackets have been closed
  265|  18.1k|        if (braceLayer == 1)
  ------------------
  |  Branch (265:13): [True: 683, False: 17.5k]
  ------------------
  266|    683|        {
  267|    683|            error = StringUtil::format("no matching closing bracket '}' for open bracket '{' at %s:%d",
  268|    683|                                       source, firstOpenBrace);
  269|    683|        }
  270|  17.5k|        else if (braceLayer > 1)
  ------------------
  |  Branch (270:18): [True: 988, False: 16.5k]
  ------------------
  271|    988|        {
  272|    988|            error = StringUtil::format(
  273|    988|                "too many open brackets (%d) '{' without matching closing bracket '}' in %s", braceLayer,
  274|    988|                source);
  275|    988|        }
  276|       |       
  277|  18.1k|        return tokens;
  278|  18.4k|    }
_ZN4Ogre11ScriptLexer8setTokenERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEjRNS1_6vectorINS_11ScriptTokenENS5_ISB_EEEE:
  281|  1.61M|    {
  282|  1.61M|        const char openBracket = '{', closeBracket = '}', colon = ':',
  283|  1.61M|            quote = '\"', var = '$';
  284|       |
  285|  1.61M|        ScriptToken token;
  286|  1.61M|        token.line = line;
  287|  1.61M|        bool ignore = false;
  288|       |
  289|       |        // Check the user token map first
  290|  1.61M|        if(lexeme.size() == 1 && isNewline(lexeme[0]))
  ------------------
  |  Branch (290:12): [True: 913k, False: 698k]
  |  Branch (290:34): [True: 572k, False: 340k]
  ------------------
  291|   572k|        {
  292|   572k|            token.type = TID_NEWLINE;
  293|   572k|            if(!tokens.empty() && tokens.back().type == TID_NEWLINE)
  ------------------
  |  Branch (293:16): [True: 570k, False: 1.74k]
  |  Branch (293:35): [True: 84.8k, False: 485k]
  ------------------
  294|  84.8k|                ignore = true;
  295|   572k|        }
  296|  1.03M|        else if(lexeme.size() == 1 && lexeme[0] == openBracket)
  ------------------
  |  Branch (296:17): [True: 340k, False: 698k]
  |  Branch (296:39): [True: 136k, False: 204k]
  ------------------
  297|   136k|            token.type = TID_LBRACKET;
  298|   902k|        else if(lexeme.size() == 1 && lexeme[0] == closeBracket)
  ------------------
  |  Branch (298:17): [True: 204k, False: 698k]
  |  Branch (298:39): [True: 116k, False: 87.3k]
  ------------------
  299|   116k|            token.type = TID_RBRACKET;
  300|   786k|        else if(lexeme.size() == 1 && lexeme[0] == colon)
  ------------------
  |  Branch (300:17): [True: 87.3k, False: 698k]
  |  Branch (300:39): [True: 18.3k, False: 69.0k]
  ------------------
  301|  18.3k|            token.type = TID_COLON;
  302|   767k|        else
  303|   767k|        {
  304|   767k|            token.lexeme = lexeme;
  305|       |
  306|       |            // This is either a non-zero length phrase or quoted phrase
  307|   767k|            if(lexeme.size() >= 2 && lexeme[0] == quote && lexeme[lexeme.size() - 1] == quote)
  ------------------
  |  Branch (307:16): [True: 698k, False: 69.0k]
  |  Branch (307:38): [True: 48.1k, False: 650k]
  |  Branch (307:60): [True: 48.1k, False: 0]
  ------------------
  308|  48.1k|            {
  309|  48.1k|                token.type = TID_QUOTE;
  310|  48.1k|            }
  311|   719k|            else if(lexeme.size() > 1 && lexeme[0] == var)
  ------------------
  |  Branch (311:21): [True: 650k, False: 69.0k]
  |  Branch (311:42): [True: 21.4k, False: 629k]
  ------------------
  312|  21.4k|                token.type = TID_VARIABLE;
  313|   698k|            else
  314|   698k|            {
  315|   698k|                token.type = TID_WORD;
  316|   698k|            }
  317|   767k|        }
  318|       |
  319|  1.61M|        if(!ignore)
  ------------------
  |  Branch (319:12): [True: 1.52M, False: 84.8k]
  ------------------
  320|  1.52M|            tokens.push_back(token);
  321|  1.61M|    }
_ZN4Ogre11ScriptLexer12isWhitespaceEc:
  324|  12.7M|    {
  325|  12.7M|        return c == ' ' || c == '\r' || c == '\t';
  ------------------
  |  Branch (325:16): [True: 1.53M, False: 11.2M]
  |  Branch (325:28): [True: 0, False: 11.2M]
  |  Branch (325:41): [True: 710k, False: 10.5M]
  ------------------
  326|  12.7M|    }
_ZN4Ogre11ScriptLexer9isNewlineEc:
  329|  15.3M|    {
  330|  15.3M|        return c == '\n' || c == '\r';
  ------------------
  |  Branch (330:16): [True: 1.13M, False: 14.1M]
  |  Branch (330:29): [True: 6.84k, False: 14.1M]
  ------------------
  331|  15.3M|    }

_ZN4Ogre12ScriptParser5parseERKNSt3__16vectorINS_11ScriptTokenENS1_9allocatorIS3_EEEERKNS1_12basic_stringIcNS1_11char_traitsIcEENS4_IcEEEE:
   42|  5.80k|    {
   43|  5.80k|        auto nodes = std::make_shared<ConcreteNodeList>();
   44|       |
   45|  5.80k|        enum{READY, OBJECT};
   46|  5.80k|        uint32 state = READY;
   47|       |
   48|  5.80k|        ConcreteNode *parent = 0;
   49|  5.80k|        ConcreteNodePtr node;
   50|  5.80k|        const ScriptToken *token = 0;
   51|  5.80k|        ScriptTokenList::const_iterator i = tokens.begin(), end = tokens.end();
   52|  1.41M|        while(i != end)
  ------------------
  |  Branch (52:15): [True: 1.40M, False: 5.71k]
  ------------------
   53|  1.40M|        {
   54|  1.40M|            token = &*i;
   55|       |
   56|  1.40M|            switch(state)
  ------------------
  |  Branch (56:20): [True: 1.40M, False: 0]
  ------------------
   57|  1.40M|            {
   58|   684k|            case READY:
  ------------------
  |  Branch (58:13): [True: 684k, False: 724k]
  ------------------
   59|   684k|                if(token->type == TID_WORD)
  ------------------
  |  Branch (59:20): [True: 306k, False: 377k]
  ------------------
   60|   306k|                {
   61|   306k|                    if(token->lexeme == "import")
  ------------------
  |  Branch (61:24): [True: 17.3k, False: 289k]
  ------------------
   62|  17.3k|                    {
   63|  17.3k|                        node = std::make_shared<ConcreteNode>();
   64|  17.3k|                        node->token = token->lexeme;
   65|  17.3k|                        node->file = file;
   66|  17.3k|                        node->line = token->line;
   67|  17.3k|                        node->type = CNT_IMPORT;
   68|       |
   69|       |                        // The next token is the target
   70|  17.3k|                        ++i;
   71|  17.3k|                        if(i == end || (i->type != TID_WORD && i->type != TID_QUOTE))
  ------------------
  |  Branch (71:28): [True: 1, False: 17.3k]
  |  Branch (71:41): [True: 6, False: 17.3k]
  |  Branch (71:64): [True: 5, False: 1]
  ------------------
   72|  17.3k|                            OGRE_EXCEPT(Exception::ERR_INVALID_STATE, 
   73|  17.3k|                                Ogre::String("expected import target at line ") + 
   74|  17.3k|                                    Ogre::StringConverter::toString(node->line),
   75|  17.3k|                                "ScriptParser::parse");
   76|  17.3k|                        ConcreteNodePtr temp(OGRE_NEW ConcreteNode());
   77|  17.3k|                        temp->parent = node.get();
   78|  17.3k|                        temp->file = file;
   79|  17.3k|                        temp->line = i->line;
   80|  17.3k|                        temp->type = i->type == TID_WORD ? CNT_WORD : CNT_QUOTE;
  ------------------
  |  Branch (80:38): [True: 17.3k, False: 1]
  ------------------
   81|  17.3k|                        temp->token = unquoted(i->lexeme, temp->type == CNT_QUOTE);
   82|  17.3k|                        node->children.push_back(temp);
   83|       |
   84|       |                        // The next token must be "from"
   85|  17.3k|                        ++i;
   86|  17.3k|                        if (i == end || i->type != TID_WORD || i->lexeme != "from")
  ------------------
  |  Branch (86:29): [True: 4, False: 17.3k]
  |  Branch (86:41): [True: 3, False: 17.3k]
  |  Branch (86:64): [True: 11, False: 17.3k]
  ------------------
   87|  17.3k|                            OGRE_EXCEPT(Exception::ERR_INVALID_STATE,
   88|  17.3k|                                        StringUtil::format("expected 'from' at line %d", node->line));
   89|       |                        // The token after "from" is the source
   90|  17.3k|                        ++i;
   91|  17.3k|                        if(i == end || (i->type != TID_WORD && i->type != TID_QUOTE))
  ------------------
  |  Branch (91:28): [True: 5, False: 17.3k]
  |  Branch (91:41): [True: 16.9k, False: 399]
  |  Branch (91:64): [True: 1, False: 16.9k]
  ------------------
   92|  17.3k|                            OGRE_EXCEPT(Exception::ERR_INVALID_STATE, 
   93|  17.3k|                                Ogre::String("expected import source at line ") + 
   94|  17.3k|                                    Ogre::StringConverter::toString(node->line),
   95|  17.3k|                                "ScriptParser::parse");
   96|  17.3k|                        temp = std::make_shared<ConcreteNode>();
   97|  17.3k|                        temp->parent = node.get();
   98|  17.3k|                        temp->file = file;
   99|  17.3k|                        temp->line = i->line;
  100|  17.3k|                        temp->type = i->type == TID_WORD ? CNT_WORD : CNT_QUOTE;
  ------------------
  |  Branch (100:38): [True: 399, False: 16.9k]
  ------------------
  101|  17.3k|                        temp->token = unquoted(i->lexeme, temp->type == CNT_QUOTE);
  102|  17.3k|                        node->children.push_back(temp);
  103|       |
  104|       |                        // Consume all the newlines
  105|  17.3k|                        i = skipNewlines(i, end);
  106|       |
  107|       |                        // Insert the node
  108|  17.3k|                        if(parent)
  ------------------
  |  Branch (108:28): [True: 1.25k, False: 16.1k]
  ------------------
  109|  1.25k|                        {
  110|  1.25k|                            node->parent = parent;
  111|  1.25k|                            parent->children.push_back(node);
  112|  1.25k|                        }
  113|  16.1k|                        else
  114|  16.1k|                        {
  115|  16.1k|                            node->parent = 0;
  116|  16.1k|                            nodes->push_back(node);
  117|  16.1k|                        }
  118|  17.3k|                        node = ConcreteNodePtr();
  119|  17.3k|                    }
  120|   289k|                    else if(token->lexeme == "set")
  ------------------
  |  Branch (120:29): [True: 10.9k, False: 278k]
  ------------------
  121|  10.9k|                    {
  122|  10.9k|                        node = std::make_shared<ConcreteNode>();
  123|  10.9k|                        node->token = token->lexeme;
  124|  10.9k|                        node->file = file;
  125|  10.9k|                        node->line = token->line;
  126|  10.9k|                        node->type = CNT_VARIABLE_ASSIGN;
  127|       |
  128|       |                        // The next token is the variable
  129|  10.9k|                        ++i;
  130|  10.9k|                        if(i == end || i->type != TID_VARIABLE)
  ------------------
  |  Branch (130:28): [True: 3, False: 10.9k]
  |  Branch (130:40): [True: 1, False: 10.9k]
  ------------------
  131|  10.9k|                            OGRE_EXCEPT(Exception::ERR_INVALID_STATE, 
  132|  10.9k|                                Ogre::String("expected variable name at line ") + 
  133|  10.9k|                                    Ogre::StringConverter::toString(node->line),
  134|  10.9k|                                "ScriptParser::parse");
  135|  10.9k|                        ConcreteNodePtr temp(OGRE_NEW ConcreteNode());
  136|  10.9k|                        temp->parent = node.get();
  137|  10.9k|                        temp->file = file;
  138|  10.9k|                        temp->line = i->line;
  139|  10.9k|                        temp->type = CNT_VARIABLE;
  140|  10.9k|                        temp->token = i->lexeme;
  141|  10.9k|                        node->children.push_back(temp);
  142|       |
  143|       |                        // The next token is the assignment
  144|  10.9k|                        ++i;
  145|  10.9k|                        if(i == end || (i->type != TID_WORD && i->type != TID_QUOTE))
  ------------------
  |  Branch (145:28): [True: 5, False: 10.9k]
  |  Branch (145:41): [True: 132, False: 10.7k]
  |  Branch (145:64): [True: 9, False: 123]
  ------------------
  146|  10.9k|                            OGRE_EXCEPT(Exception::ERR_INVALID_STATE, 
  147|  10.9k|                                Ogre::String("expected variable value at line ") + 
  148|  10.9k|                                    Ogre::StringConverter::toString(node->line),
  149|  10.9k|                                "ScriptParser::parse");
  150|  10.9k|                        temp = std::make_shared<ConcreteNode>();
  151|  10.9k|                        temp->parent = node.get();
  152|  10.9k|                        temp->file = file;
  153|  10.9k|                        temp->line = i->line;
  154|  10.9k|                        temp->type = i->type == TID_WORD ? CNT_WORD : CNT_QUOTE;
  ------------------
  |  Branch (154:38): [True: 10.7k, False: 123]
  ------------------
  155|  10.9k|                        temp->token = unquoted(i->lexeme, temp->type == CNT_QUOTE);
  156|  10.9k|                        node->children.push_back(temp);
  157|       |
  158|       |                        // Consume all the newlines
  159|  10.9k|                        i = skipNewlines(i, end);
  160|       |
  161|       |                        // Insert the node
  162|  10.9k|                        if(parent)
  ------------------
  |  Branch (162:28): [True: 9.35k, False: 1.57k]
  ------------------
  163|  9.35k|                        {
  164|  9.35k|                            node->parent = parent;
  165|  9.35k|                            parent->children.push_back(node);
  166|  9.35k|                        }
  167|  1.57k|                        else
  168|  1.57k|                        {
  169|  1.57k|                            node->parent = 0;
  170|  1.57k|                            nodes->push_back(node);
  171|  1.57k|                        }
  172|  10.9k|                        node = ConcreteNodePtr();
  173|  10.9k|                    }
  174|   278k|                    else
  175|   278k|                    {
  176|   278k|                        node = std::make_shared<ConcreteNode>();
  177|   278k|                        node->file = file;
  178|   278k|                        node->line = token->line;
  179|   278k|                        node->type = token->type == TID_WORD ? CNT_WORD : CNT_QUOTE;
  ------------------
  |  Branch (179:38): [True: 278k, False: 0]
  ------------------
  180|   278k|                        node->token = unquoted(token->lexeme, node->type == CNT_QUOTE);
  181|       |
  182|       |                        // Insert the node
  183|   278k|                        if(parent)
  ------------------
  |  Branch (183:28): [True: 238k, False: 40.3k]
  ------------------
  184|   238k|                        {
  185|   238k|                            node->parent = parent;
  186|   238k|                            parent->children.push_back(node);
  187|   238k|                        }
  188|  40.3k|                        else
  189|  40.3k|                        {
  190|  40.3k|                            node->parent = 0;
  191|  40.3k|                            nodes->push_back(node);
  192|  40.3k|                        }
  193|       |
  194|       |                        // Set the parent
  195|   278k|                        parent = node.get();
  196|       |
  197|       |                        // Switch states
  198|   278k|                        state = OBJECT;
  199|       |
  200|   278k|                        node = ConcreteNodePtr();
  201|   278k|                    }
  202|   306k|                }
  203|   377k|                else if(token->type == TID_RBRACKET)
  ------------------
  |  Branch (203:25): [True: 112k, False: 265k]
  ------------------
  204|   112k|                {
  205|       |                    // Go up one level if we can
  206|   112k|                    if(parent)
  ------------------
  |  Branch (206:24): [True: 109k, False: 2.64k]
  ------------------
  207|   109k|                        parent = parent->parent;
  208|       |
  209|   112k|                    node = std::make_shared<ConcreteNode>();
  210|   112k|                    node->token = token->lexeme;
  211|   112k|                    node->file = file;
  212|   112k|                    node->line = token->line;
  213|   112k|                    node->type = CNT_RBRACE;
  214|       |
  215|       |                    // Consume all the newlines
  216|   112k|                    i = skipNewlines(i, end);
  217|       |
  218|       |                    // Insert the node
  219|   112k|                    if(parent)
  ------------------
  |  Branch (219:24): [True: 109k, False: 2.64k]
  ------------------
  220|   109k|                    {
  221|   109k|                        node->parent = parent;
  222|   109k|                        parent->children.push_back(node);
  223|   109k|                    }
  224|  2.64k|                    else
  225|  2.64k|                    {
  226|  2.64k|                        node->parent = 0;
  227|  2.64k|                        nodes->push_back(node);
  228|  2.64k|                    }
  229|       |
  230|       |                    // Move up another level
  231|   112k|                    if(parent)
  ------------------
  |  Branch (231:24): [True: 109k, False: 2.64k]
  ------------------
  232|   109k|                        parent = parent->parent;
  233|       |
  234|   112k|                    node = ConcreteNodePtr();
  235|   112k|                }
  236|   684k|                break;
  237|   724k|            case OBJECT:
  ------------------
  |  Branch (237:13): [True: 724k, False: 684k]
  ------------------
  238|   724k|                if(token->type == TID_NEWLINE)
  ------------------
  |  Branch (238:20): [True: 247k, False: 477k]
  ------------------
  239|   247k|                {
  240|       |                    // Look ahead to the next non-newline token and if it isn't an {, this was a property
  241|   247k|                    ScriptTokenList::const_iterator next = skipNewlines(i, end);
  242|   247k|                    if(next == end || next->type != TID_LBRACKET)
  ------------------
  |  Branch (242:24): [True: 413, False: 246k]
  |  Branch (242:39): [True: 144k, False: 102k]
  ------------------
  243|   144k|                    {
  244|       |                        // Ended a property here
  245|   144k|                        if(parent)
  ------------------
  |  Branch (245:28): [True: 144k, False: 0]
  ------------------
  246|   144k|                            parent = parent->parent;
  247|   144k|                        state = READY;
  248|   144k|                    }
  249|   247k|                }
  250|   477k|                else if(token->type == TID_COLON)
  ------------------
  |  Branch (250:25): [True: 17.5k, False: 459k]
  ------------------
  251|  17.5k|                {
  252|  17.5k|                    node = std::make_shared<ConcreteNode>();
  253|  17.5k|                    node->token = token->lexeme;
  254|  17.5k|                    node->file = file;
  255|  17.5k|                    node->line = token->line;
  256|  17.5k|                    node->type = CNT_COLON;
  257|       |
  258|       |                    // The following token are the parent objects (base classes).
  259|       |                    // Require at least one of them.
  260|       |
  261|  17.5k|                    ScriptTokenList::const_iterator j = i + 1;
  262|  17.5k|                    j = skipNewlines(j, end);
  263|  17.5k|                    if(j == end || (j->type != TID_WORD && j->type != TID_QUOTE)) {
  ------------------
  |  Branch (263:24): [True: 26, False: 17.5k]
  |  Branch (263:37): [True: 1.65k, False: 15.8k]
  |  Branch (263:60): [True: 21, False: 1.63k]
  ------------------
  264|     47|                        OGRE_EXCEPT(Exception::ERR_INVALID_STATE, 
  265|     47|                            Ogre::String("expected object identifier at line ") + 
  266|     47|                                    Ogre::StringConverter::toString(node->line),
  267|     47|                            "ScriptParser::parse");
  268|     47|                    }
  269|       |
  270|  41.9k|                    while(j != end && (j->type == TID_WORD || j->type == TID_QUOTE))
  ------------------
  |  Branch (270:27): [True: 41.8k, False: 87]
  |  Branch (270:40): [True: 22.3k, False: 19.5k]
  |  Branch (270:63): [True: 2.15k, False: 17.4k]
  ------------------
  271|  24.4k|                    {
  272|  24.4k|                        ConcreteNodePtr tempNode = std::make_shared<ConcreteNode>();
  273|  24.4k|                        tempNode->token = j->lexeme;
  274|  24.4k|                        tempNode->file = file;
  275|  24.4k|                        tempNode->line = j->line;
  276|  24.4k|                        tempNode->type = j->type == TID_WORD ? CNT_WORD : CNT_QUOTE;
  ------------------
  |  Branch (276:42): [True: 22.3k, False: 2.15k]
  ------------------
  277|  24.4k|                        tempNode->parent = node.get();
  278|  24.4k|                        node->children.push_back(tempNode);
  279|  24.4k|                        ++j;
  280|  24.4k|                    }
  281|       |
  282|       |                    // Move it backwards once, since the end of the loop moves it forwards again anyway
  283|  17.5k|                    i = --j;
  284|       |
  285|       |                    // Insert the node
  286|  17.5k|                    if(parent)
  ------------------
  |  Branch (286:24): [True: 17.5k, False: 0]
  ------------------
  287|  17.5k|                    {
  288|  17.5k|                        node->parent = parent;
  289|  17.5k|                        parent->children.push_back(node);
  290|  17.5k|                    }
  291|      0|                    else
  292|      0|                    {
  293|      0|                        node->parent = 0;
  294|      0|                        nodes->push_back(node);
  295|      0|                    }
  296|  17.5k|                    node = ConcreteNodePtr();
  297|  17.5k|                }
  298|   459k|                else if(token->type == TID_LBRACKET)
  ------------------
  |  Branch (298:25): [True: 128k, False: 331k]
  ------------------
  299|   128k|                {
  300|   128k|                    node = std::make_shared<ConcreteNode>();
  301|   128k|                    node->token = token->lexeme;
  302|   128k|                    node->file = file;
  303|   128k|                    node->line = token->line;
  304|   128k|                    node->type = CNT_LBRACE;
  305|       |
  306|       |                    // Consume all the newlines
  307|   128k|                    i = skipNewlines(i, end);
  308|       |
  309|       |                    // Insert the node
  310|   128k|                    if(parent)
  ------------------
  |  Branch (310:24): [True: 128k, False: 0]
  ------------------
  311|   128k|                    {
  312|   128k|                        node->parent = parent;
  313|   128k|                        parent->children.push_back(node);
  314|   128k|                    }
  315|      0|                    else
  316|      0|                    {
  317|      0|                        node->parent = 0;
  318|      0|                        nodes->push_back(node);
  319|      0|                    }
  320|       |
  321|       |                    // Set the parent
  322|   128k|                    parent = node.get();
  323|       |
  324|       |                    // Change the state
  325|   128k|                    state = READY;
  326|       |
  327|   128k|                    node = ConcreteNodePtr();
  328|   128k|                }
  329|   331k|                else if(token->type == TID_RBRACKET)
  ------------------
  |  Branch (329:25): [True: 4.33k, False: 327k]
  ------------------
  330|  4.33k|                {
  331|       |                    // Go up one level if we can
  332|  4.33k|                    if(parent)
  ------------------
  |  Branch (332:24): [True: 4.33k, False: 0]
  ------------------
  333|  4.33k|                        parent = parent->parent;
  334|       |
  335|       |                    // If the parent is currently a { then go up again
  336|  4.33k|                    if(parent && parent->type == CNT_LBRACE && parent->parent)
  ------------------
  |  Branch (336:24): [True: 3.76k, False: 571]
  |  Branch (336:34): [True: 3.76k, False: 0]
  |  Branch (336:64): [True: 3.76k, False: 0]
  ------------------
  337|  3.76k|                        parent = parent->parent;
  338|       |
  339|  4.33k|                    node = std::make_shared<ConcreteNode>();
  340|  4.33k|                    node->token = token->lexeme;
  341|  4.33k|                    node->file = file;
  342|  4.33k|                    node->line = token->line;
  343|  4.33k|                    node->type = CNT_RBRACE;
  344|       |
  345|       |                    // Consume all the newlines
  346|  4.33k|                    i = skipNewlines(i, end);
  347|       |
  348|       |                    // Insert the node
  349|  4.33k|                    if(parent)
  ------------------
  |  Branch (349:24): [True: 3.76k, False: 571]
  ------------------
  350|  3.76k|                    {
  351|  3.76k|                        node->parent = parent;
  352|  3.76k|                        parent->children.push_back(node);
  353|  3.76k|                    }
  354|    571|                    else
  355|    571|                    {
  356|    571|                        node->parent = 0;
  357|    571|                        nodes->push_back(node);
  358|    571|                    }
  359|       |
  360|       |                    // Move up another level
  361|  4.33k|                    if(parent)
  ------------------
  |  Branch (361:24): [True: 3.76k, False: 571]
  ------------------
  362|  3.76k|                        parent = parent->parent;
  363|       |
  364|  4.33k|                    node = ConcreteNodePtr();
  365|  4.33k|                    state = READY;
  366|  4.33k|                }
  367|   327k|                else if(token->type == TID_VARIABLE)
  ------------------
  |  Branch (367:25): [True: 9.83k, False: 317k]
  ------------------
  368|  9.83k|                {
  369|  9.83k|                    node = std::make_shared<ConcreteNode>();
  370|  9.83k|                    node->token = token->lexeme;
  371|  9.83k|                    node->file = file;
  372|  9.83k|                    node->line = token->line;
  373|  9.83k|                    node->type = CNT_VARIABLE;
  374|       |
  375|       |                    // Insert the node
  376|  9.83k|                    if(parent)
  ------------------
  |  Branch (376:24): [True: 9.83k, False: 0]
  ------------------
  377|  9.83k|                    {
  378|  9.83k|                        node->parent = parent;
  379|  9.83k|                        parent->children.push_back(node);
  380|  9.83k|                    }
  381|      0|                    else
  382|      0|                    {
  383|      0|                        node->parent = 0;
  384|      0|                        nodes->push_back(node);
  385|      0|                    }
  386|  9.83k|                    node = ConcreteNodePtr();
  387|  9.83k|                }
  388|   317k|                else if(token->type == TID_QUOTE)
  ------------------
  |  Branch (388:25): [True: 10.5k, False: 306k]
  ------------------
  389|  10.5k|                {
  390|  10.5k|                    node = std::make_shared<ConcreteNode>();
  391|  10.5k|                    node->token = unquoted(token->lexeme);
  392|  10.5k|                    node->file = file;
  393|  10.5k|                    node->line = token->line;
  394|  10.5k|                    node->type = CNT_QUOTE;
  395|       |
  396|       |                    // Insert the node
  397|  10.5k|                    if(parent)
  ------------------
  |  Branch (397:24): [True: 10.5k, False: 0]
  ------------------
  398|  10.5k|                    {
  399|  10.5k|                        node->parent = parent;
  400|  10.5k|                        parent->children.push_back(node);
  401|  10.5k|                    }
  402|      0|                    else
  403|      0|                    {
  404|      0|                        node->parent = 0;
  405|      0|                        nodes->push_back(node);
  406|      0|                    }
  407|  10.5k|                    node = ConcreteNodePtr();
  408|  10.5k|                }
  409|   306k|                else if(token->type == TID_WORD)
  ------------------
  |  Branch (409:25): [True: 306k, False: 0]
  ------------------
  410|   306k|                {
  411|   306k|                    node = std::make_shared<ConcreteNode>();
  412|   306k|                    node->token = token->lexeme;
  413|   306k|                    node->file = file;
  414|   306k|                    node->line = token->line;
  415|   306k|                    node->type = CNT_WORD;
  416|       |
  417|       |                    // Insert the node
  418|   306k|                    if(parent)
  ------------------
  |  Branch (418:24): [True: 306k, False: 0]
  ------------------
  419|   306k|                    {
  420|   306k|                        node->parent = parent;
  421|   306k|                        parent->children.push_back(node);
  422|   306k|                    }
  423|      0|                    else
  424|      0|                    {
  425|      0|                        node->parent = 0;
  426|      0|                        nodes->push_back(node);
  427|      0|                    }
  428|   306k|                    node = ConcreteNodePtr();
  429|   306k|                }
  430|   724k|                break;
  431|  1.40M|            }
  432|       |
  433|  1.40M|            ++i;
  434|  1.40M|        }
  435|       |
  436|  5.71k|        return nodes;
  437|  5.80k|    }
_ZN4Ogre12ScriptParser10parseChunkERKNSt3__16vectorINS_11ScriptTokenENS1_9allocatorIS3_EEEERKNS1_12basic_stringIcNS1_11char_traitsIcEENS4_IcEEEE:
  440|  14.3k|    {
  441|  14.3k|        auto nodes = std::make_shared<ConcreteNodeList>();
  442|       |
  443|  14.3k|        ConcreteNodePtr node;
  444|  14.3k|        for(const auto& token : tokens)
  ------------------
  |  Branch (444:31): [True: 14.4k, False: 14.3k]
  ------------------
  445|  14.4k|        {
  446|  14.4k|            switch(token.type)
  447|  14.4k|            {
  448|      4|            case TID_VARIABLE:
  ------------------
  |  Branch (448:13): [True: 4, False: 14.4k]
  ------------------
  449|      4|                node = std::make_shared<ConcreteNode>();
  450|      4|                node->file = file;
  451|      4|                node->line = token.line;
  452|      4|                node->parent = 0;
  453|      4|                node->token = token.lexeme;
  454|      4|                node->type = CNT_VARIABLE;
  455|      4|                break;
  456|  14.3k|            case TID_WORD:
  ------------------
  |  Branch (456:13): [True: 14.3k, False: 10]
  ------------------
  457|  14.3k|                node = std::make_shared<ConcreteNode>();
  458|  14.3k|                node->file = file;
  459|  14.3k|                node->line = token.line;
  460|  14.3k|                node->parent = 0;
  461|  14.3k|                node->token = token.lexeme;
  462|  14.3k|                node->type = CNT_WORD;
  463|  14.3k|                break;
  464|      0|            case TID_QUOTE:
  ------------------
  |  Branch (464:13): [True: 0, False: 14.4k]
  ------------------
  465|      0|                node = std::make_shared<ConcreteNode>();
  466|      0|                node->file = file;
  467|      0|                node->line = token.line;
  468|      0|                node->parent = 0;
  469|      0|                node->token= unquoted(token.lexeme);
  470|      0|                node->type = CNT_QUOTE;
  471|      0|                break;
  472|      6|            default:
  ------------------
  |  Branch (472:13): [True: 6, False: 14.4k]
  ------------------
  473|      6|                OGRE_EXCEPT(Exception::ERR_INVALID_STATE,
  474|  14.4k|                    Ogre::String("unexpected token") + token.lexeme + " at line " +
  475|  14.4k|                        Ogre::StringConverter::toString(token.line),
  476|  14.4k|                    "ScriptParser::parseChunk");
  477|  14.4k|            }
  478|       |
  479|  14.4k|            if(node)
  ------------------
  |  Branch (479:16): [True: 14.4k, False: 0]
  ------------------
  480|  14.4k|                nodes->push_back(node);
  481|  14.4k|        }
  482|       |
  483|  14.3k|        return nodes;
  484|  14.3k|    }
_ZN4Ogre12ScriptParser12skipNewlinesENSt3__111__wrap_iterIPKNS_11ScriptTokenEEES6_:
  496|   537k|    {
  497|   785k|        while(i != end && i->type == TID_NEWLINE)
  ------------------
  |  Branch (497:15): [True: 784k, False: 439]
  |  Branch (497:27): [True: 247k, False: 537k]
  ------------------
  498|   247k|            ++i;
  499|   537k|        return i;
  500|   537k|    }
OgreScriptParser.cpp:_ZN4OgreL8unquotedERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEb:
   37|   334k|    {
   38|   334k|        return trim ? str.substr(1, str.size() - 2) : str;
  ------------------
  |  Branch (38:16): [True: 27.6k, False: 307k]
  ------------------
   39|   334k|    }

_ZN4Ogre8getValueIfEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
   76|  5.29k|    {
   77|  5.29k|        return StringConverter::parse(node->getString(), result);
   78|  5.29k|    }
_ZN4Ogre8getValueIbEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
   84|  10.2k|    {
   85|  10.2k|        return ScriptTranslator::getBoolean(node, &result);
   86|  10.2k|    }
_ZN4Ogre8getValueIjEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
   88|  1.96k|    {
   89|  1.96k|        return StringConverter::parse(node->getString(), result);
   90|  1.96k|    }
_ZN4Ogre8getValueIiEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
   92|    124|    {
   93|    124|        return StringConverter::parse(node->getString(), result);
   94|    124|    }
_ZN4Ogre8getValueINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
   96|  21.6k|    {
   97|  21.6k|        return ScriptTranslator::getString(node, &result);
   98|  21.6k|    }
_ZN4Ogre8getValueINS_15CompareFunctionEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  101|    108|    {
  102|    108|        return ScriptTranslator::getCompareFunction(node, &result);
  103|    108|    }
_ZN4Ogre8getValueINS_16StencilOperationEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  106|      2|    {
  107|      2|        return ScriptTranslator::getStencilOp(node, &result);
  108|      2|    }
_ZN4Ogre8getValueINS_17IlluminationStageEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  111|     15|    {
  112|     15|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (112:12): [True: 1, False: 14]
  ------------------
  113|      1|            return false;
  114|       |
  115|     14|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  116|     14|        {
  117|      2|        case ID_AMBIENT:
  ------------------
  |  Branch (117:9): [True: 2, False: 12]
  ------------------
  118|      2|            result = IS_AMBIENT;
  119|      2|            return true;
  120|      2|        case ID_PER_LIGHT:
  ------------------
  |  Branch (120:9): [True: 2, False: 12]
  ------------------
  121|      2|            result = IS_PER_LIGHT;
  122|      2|            return true;
  123|      0|        case ID_DECAL:
  ------------------
  |  Branch (123:9): [True: 0, False: 14]
  ------------------
  124|      0|            result = IS_DECAL;
  125|      0|            return true;
  126|     10|        default:
  ------------------
  |  Branch (126:9): [True: 10, False: 4]
  ------------------
  127|     10|            return false;
  128|     14|        }
  129|     14|    }
_ZN4Ogre8getValueINS_14SceneBlendTypeEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  132|  2.98k|    {
  133|  2.98k|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (133:12): [True: 3, False: 2.97k]
  ------------------
  134|      3|            return false;
  135|       |
  136|  2.97k|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  137|  2.97k|        {
  138|  1.47k|        case ID_ADD:
  ------------------
  |  Branch (138:9): [True: 1.47k, False: 1.50k]
  ------------------
  139|  1.47k|            result = SBT_ADD;
  140|  1.47k|            break;
  141|    161|        case ID_MODULATE:
  ------------------
  |  Branch (141:9): [True: 161, False: 2.81k]
  ------------------
  142|    161|            result = SBT_MODULATE;
  143|    161|            break;
  144|    348|        case ID_COLOUR_BLEND:
  ------------------
  |  Branch (144:9): [True: 348, False: 2.62k]
  ------------------
  145|    348|            result = SBT_TRANSPARENT_COLOUR;
  146|    348|            break;
  147|    890|        case ID_ALPHA_BLEND:
  ------------------
  |  Branch (147:9): [True: 890, False: 2.08k]
  ------------------
  148|    890|            result = SBT_TRANSPARENT_ALPHA;
  149|    890|            break;
  150|    104|        default:
  ------------------
  |  Branch (150:9): [True: 104, False: 2.87k]
  ------------------
  151|    104|            return false;
  152|  2.97k|        }
  153|  2.87k|        return true;
  154|  2.97k|    }
_ZN4Ogre8getValueINS_19SceneBlendOperationEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  157|      9|    {
  158|      9|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (158:12): [True: 0, False: 9]
  ------------------
  159|      0|            return false;
  160|       |
  161|      9|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  162|      9|        {
  163|      0|        case ID_ADD:
  ------------------
  |  Branch (163:9): [True: 0, False: 9]
  ------------------
  164|      0|            result = SBO_ADD;
  165|      0|            break;
  166|      0|        case ID_SUBTRACT:
  ------------------
  |  Branch (166:9): [True: 0, False: 9]
  ------------------
  167|      0|            result = SBO_SUBTRACT;
  168|      0|            break;
  169|      0|        case ID_REVERSE_SUBTRACT:
  ------------------
  |  Branch (169:9): [True: 0, False: 9]
  ------------------
  170|      0|            result = SBO_REVERSE_SUBTRACT;
  171|      0|            break;
  172|      0|        case ID_MIN:
  ------------------
  |  Branch (172:9): [True: 0, False: 9]
  ------------------
  173|      0|            result = SBO_MIN;
  174|      0|            break;
  175|      0|        case ID_MAX:
  ------------------
  |  Branch (175:9): [True: 0, False: 9]
  ------------------
  176|      0|            result = SBO_MAX;
  177|      0|            break;
  178|      9|        default:
  ------------------
  |  Branch (178:9): [True: 9, False: 0]
  ------------------
  179|      9|            return false;
  180|      9|        }
  181|      0|        return true;
  182|      9|    }
_ZN4Ogre8getValueINS_11CullingModeEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  185|  2.16k|    {
  186|  2.16k|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (186:12): [True: 5, False: 2.16k]
  ------------------
  187|      5|            return false;
  188|       |
  189|  2.16k|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  190|  2.16k|        {
  191|      0|        case ID_CLOCKWISE:
  ------------------
  |  Branch (191:9): [True: 0, False: 2.16k]
  ------------------
  192|      0|            result = CULL_CLOCKWISE;
  193|      0|            break;
  194|      0|        case ID_ANTICLOCKWISE:
  ------------------
  |  Branch (194:9): [True: 0, False: 2.16k]
  ------------------
  195|      0|            result = CULL_ANTICLOCKWISE;
  196|      0|            break;
  197|  2.10k|        case ID_NONE:
  ------------------
  |  Branch (197:9): [True: 2.10k, False: 55]
  ------------------
  198|  2.10k|            result = CULL_NONE;
  199|  2.10k|            break;
  200|     55|        default:
  ------------------
  |  Branch (200:9): [True: 55, False: 2.10k]
  ------------------
  201|     55|            return false;
  202|  2.16k|        }
  203|  2.10k|        return true;
  204|  2.16k|    }
_ZN4Ogre8getValueINS_17ManualCullingModeEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  207|     55|    {
  208|     55|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (208:12): [True: 1, False: 54]
  ------------------
  209|      1|            return false;
  210|       |
  211|     54|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  212|     54|        {
  213|      0|        case ID_FRONT:
  ------------------
  |  Branch (213:9): [True: 0, False: 54]
  ------------------
  214|      0|            result = MANUAL_CULL_FRONT;
  215|      0|            break;
  216|      0|        case ID_BACK:
  ------------------
  |  Branch (216:9): [True: 0, False: 54]
  ------------------
  217|      0|            result = MANUAL_CULL_BACK;
  218|      0|            break;
  219|     38|        case ID_NONE:
  ------------------
  |  Branch (219:9): [True: 38, False: 16]
  ------------------
  220|     38|            result = MANUAL_CULL_NONE;
  221|     38|            break;
  222|     16|        default:
  ------------------
  |  Branch (222:9): [True: 16, False: 38]
  ------------------
  223|     16|            return false;
  224|     54|        }
  225|     38|        return true;
  226|     54|    }
_ZN4Ogre8getValueINS_12ShadeOptionsEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  229|      3|    {
  230|      3|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (230:12): [True: 0, False: 3]
  ------------------
  231|      0|            return false;
  232|       |
  233|      3|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  234|      3|        {
  235|      0|        case ID_FLAT:
  ------------------
  |  Branch (235:9): [True: 0, False: 3]
  ------------------
  236|      0|            result = SO_FLAT;
  237|      0|            break;
  238|      0|        case ID_GOURAUD:
  ------------------
  |  Branch (238:9): [True: 0, False: 3]
  ------------------
  239|      0|            result = SO_GOURAUD;
  240|      0|            break;
  241|      0|        case ID_PHONG:
  ------------------
  |  Branch (241:9): [True: 0, False: 3]
  ------------------
  242|      0|            result = SO_PHONG;
  243|      0|            break;
  244|      3|        default:
  ------------------
  |  Branch (244:9): [True: 3, False: 0]
  ------------------
  245|      3|            return false;
  246|      3|        }
  247|      0|        return true;
  248|      3|    }
_ZN4Ogre8getValueINS_11PolygonModeEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  251|     23|    {
  252|     23|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (252:12): [True: 1, False: 22]
  ------------------
  253|      1|            return false;
  254|       |
  255|     22|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  256|     22|        {
  257|      0|        case ID_SOLID:
  ------------------
  |  Branch (257:9): [True: 0, False: 22]
  ------------------
  258|      0|            result = PM_SOLID;
  259|      0|            break;
  260|      0|        case ID_POINTS:
  ------------------
  |  Branch (260:9): [True: 0, False: 22]
  ------------------
  261|      0|            result = PM_POINTS;
  262|      0|            break;
  263|      7|        case ID_WIREFRAME:
  ------------------
  |  Branch (263:9): [True: 7, False: 15]
  ------------------
  264|      7|            result = PM_WIREFRAME;
  265|      7|            break;
  266|     15|        default:
  ------------------
  |  Branch (266:9): [True: 15, False: 7]
  ------------------
  267|     15|            return false;
  268|     22|        }
  269|      7|        return true;
  270|     22|    }
_ZN4Ogre8getValueINS_19LayerBlendOperationEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  273|     65|    {
  274|     65|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (274:12): [True: 12, False: 53]
  ------------------
  275|     12|            return false;
  276|       |
  277|     53|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  278|     53|        {
  279|      4|        case ID_REPLACE:
  ------------------
  |  Branch (279:9): [True: 4, False: 49]
  ------------------
  280|      4|            result = LBO_REPLACE;
  281|      4|            break;
  282|      1|        case ID_ADD:
  ------------------
  |  Branch (282:9): [True: 1, False: 52]
  ------------------
  283|      1|            result = LBO_ADD;
  284|      1|            break;
  285|     36|        case ID_MODULATE:
  ------------------
  |  Branch (285:9): [True: 36, False: 17]
  ------------------
  286|     36|            result = LBO_MODULATE;
  287|     36|            break;
  288|      0|        case ID_ALPHA_BLEND:
  ------------------
  |  Branch (288:9): [True: 0, False: 53]
  ------------------
  289|      0|            result = LBO_ALPHA_BLEND;
  290|      0|            break;
  291|     12|        default:
  ------------------
  |  Branch (291:9): [True: 12, False: 41]
  ------------------
  292|     12|            return false;
  293|     53|        }
  294|     41|        return true;
  295|     53|    }
_ZN4Ogre8getValueINS_21LayerBlendOperationExEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  298|    701|    {
  299|    701|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (299:12): [True: 3, False: 698]
  ------------------
  300|      3|            return false;
  301|       |
  302|    698|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  303|    698|        {
  304|    103|        case ID_SOURCE1:
  ------------------
  |  Branch (304:9): [True: 103, False: 595]
  ------------------
  305|    103|            op = LBX_SOURCE1;
  306|    103|            break;
  307|     15|        case ID_SOURCE2:
  ------------------
  |  Branch (307:9): [True: 15, False: 683]
  ------------------
  308|     15|            op = LBX_SOURCE2;
  309|     15|            break;
  310|    160|        case ID_MODULATE:
  ------------------
  |  Branch (310:9): [True: 160, False: 538]
  ------------------
  311|    160|            op = LBX_MODULATE;
  312|    160|            break;
  313|      0|        case ID_MODULATE_X2:
  ------------------
  |  Branch (313:9): [True: 0, False: 698]
  ------------------
  314|      0|            op = LBX_MODULATE_X2;
  315|      0|            break;
  316|      0|        case ID_MODULATE_X4:
  ------------------
  |  Branch (316:9): [True: 0, False: 698]
  ------------------
  317|      0|            op = LBX_MODULATE_X4;
  318|      0|            break;
  319|    387|        case ID_ADD:
  ------------------
  |  Branch (319:9): [True: 387, False: 311]
  ------------------
  320|    387|            op = LBX_ADD;
  321|    387|            break;
  322|      0|        case ID_ADD_SIGNED:
  ------------------
  |  Branch (322:9): [True: 0, False: 698]
  ------------------
  323|      0|            op = LBX_ADD_SIGNED;
  324|      0|            break;
  325|      0|        case ID_ADD_SMOOTH:
  ------------------
  |  Branch (325:9): [True: 0, False: 698]
  ------------------
  326|      0|            op = LBX_ADD_SMOOTH;
  327|      0|            break;
  328|      0|        case ID_SUBTRACT:
  ------------------
  |  Branch (328:9): [True: 0, False: 698]
  ------------------
  329|      0|            op = LBX_SUBTRACT;
  330|      0|            break;
  331|      0|        case ID_BLEND_DIFFUSE_ALPHA:
  ------------------
  |  Branch (331:9): [True: 0, False: 698]
  ------------------
  332|      0|            op = LBX_BLEND_DIFFUSE_ALPHA;
  333|      0|            break;
  334|      0|        case ID_BLEND_TEXTURE_ALPHA:
  ------------------
  |  Branch (334:9): [True: 0, False: 698]
  ------------------
  335|      0|            op = LBX_BLEND_TEXTURE_ALPHA;
  336|      0|            break;
  337|      0|        case ID_BLEND_CURRENT_ALPHA:
  ------------------
  |  Branch (337:9): [True: 0, False: 698]
  ------------------
  338|      0|            op = LBX_BLEND_CURRENT_ALPHA;
  339|      0|            break;
  340|      0|        case ID_BLEND_MANUAL:
  ------------------
  |  Branch (340:9): [True: 0, False: 698]
  ------------------
  341|      0|            op = LBX_BLEND_MANUAL;
  342|      0|            break;
  343|      0|        case ID_DOT_PRODUCT:
  ------------------
  |  Branch (343:9): [True: 0, False: 698]
  ------------------
  344|      0|            op = LBX_DOTPRODUCT;
  345|      0|            break;
  346|      0|        case ID_BLEND_DIFFUSE_COLOUR:
  ------------------
  |  Branch (346:9): [True: 0, False: 698]
  ------------------
  347|      0|            op = LBX_BLEND_DIFFUSE_COLOUR;
  348|      0|            break;
  349|     33|        default:
  ------------------
  |  Branch (349:9): [True: 33, False: 665]
  ------------------
  350|     33|            return false;
  351|    698|        }
  352|    665|        return true;
  353|    698|    }
_ZN4Ogre8getValueINS_16LayerBlendSourceEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  356|  1.31k|    {
  357|  1.31k|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (357:12): [True: 1, False: 1.31k]
  ------------------
  358|      1|            return false;
  359|       |
  360|  1.31k|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  361|  1.31k|        {
  362|    465|        case ID_SRC_CURRENT:
  ------------------
  |  Branch (362:9): [True: 465, False: 846]
  ------------------
  363|    465|            source1 = LBS_CURRENT;
  364|    465|            break;
  365|    534|        case ID_SRC_TEXTURE:
  ------------------
  |  Branch (365:9): [True: 534, False: 777]
  ------------------
  366|    534|            source1 = LBS_TEXTURE;
  367|    534|            break;
  368|      2|        case ID_SRC_DIFFUSE:
  ------------------
  |  Branch (368:9): [True: 2, False: 1.30k]
  ------------------
  369|      2|            source1 = LBS_DIFFUSE;
  370|      2|            break;
  371|      1|        case ID_SRC_SPECULAR:
  ------------------
  |  Branch (371:9): [True: 1, False: 1.31k]
  ------------------
  372|      1|            source1 = LBS_SPECULAR;
  373|      1|            break;
  374|    252|        case ID_SRC_MANUAL:
  ------------------
  |  Branch (374:9): [True: 252, False: 1.05k]
  ------------------
  375|    252|            source1 = LBS_MANUAL;
  376|    252|            break;
  377|     57|        default:
  ------------------
  |  Branch (377:9): [True: 57, False: 1.25k]
  ------------------
  378|     57|            return false;
  379|  1.31k|        }
  380|  1.25k|        return true;
  381|  1.31k|    }
_ZN4Ogre8getValueINS_21CompositionTargetPass9InputModeEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  384|  3.94k|    {
  385|  3.94k|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (385:12): [True: 3, False: 3.94k]
  ------------------
  386|      3|            return false;
  387|       |
  388|  3.94k|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  389|  3.94k|        {
  390|  1.96k|        case ID_NONE:
  ------------------
  |  Branch (390:9): [True: 1.96k, False: 1.98k]
  ------------------
  391|  1.96k|            result = CompositionTargetPass::IM_NONE;
  392|  1.96k|            break;
  393|  1.94k|        case ID_PREVIOUS:
  ------------------
  |  Branch (393:9): [True: 1.94k, False: 1.99k]
  ------------------
  394|  1.94k|            result = CompositionTargetPass::IM_PREVIOUS;
  395|  1.94k|            break;
  396|     34|        default:
  ------------------
  |  Branch (396:9): [True: 34, False: 3.91k]
  ------------------
  397|     34|            return false;
  398|  3.94k|        }
  399|  3.91k|        return true;
  400|  3.94k|    }
_ZN4Ogre8getValueINS_13FilterOptionsEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  403|    961|    {
  404|    961|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (404:12): [True: 1, False: 960]
  ------------------
  405|      1|            return false;
  406|       |
  407|    960|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  408|    960|        {
  409|    251|        case ID_NONE:
  ------------------
  |  Branch (409:9): [True: 251, False: 709]
  ------------------
  410|    251|            tmip = FO_NONE;
  411|    251|            break;
  412|     24|        case ID_POINT:
  ------------------
  |  Branch (412:9): [True: 24, False: 936]
  ------------------
  413|     24|            tmip = FO_POINT;
  414|     24|            break;
  415|    638|        case ID_LINEAR:
  ------------------
  |  Branch (415:9): [True: 638, False: 322]
  ------------------
  416|    638|            tmip = FO_LINEAR;
  417|    638|            break;
  418|      0|        case ID_ANISOTROPIC:
  ------------------
  |  Branch (418:9): [True: 0, False: 960]
  ------------------
  419|      0|            tmip = FO_ANISOTROPIC;
  420|      0|            break;
  421|     47|        default:
  ------------------
  |  Branch (421:9): [True: 47, False: 913]
  ------------------
  422|     47|            return false;
  423|    960|        }
  424|    913|        return true;
  425|    960|    }
_ZN4Ogre8getValueINS_21TextureAddressingModeEEEbRKNS_9SharedPtrINS_12AbstractNodeEEERT_:
  428|  3.88k|    {
  429|  3.88k|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (429:12): [True: 8, False: 3.87k]
  ------------------
  430|      8|            return false;
  431|       |
  432|  3.87k|        switch (static_cast<AtomAbstractNode*>(node.get())->id)
  433|  3.87k|        {
  434|     28|        case ID_WRAP:
  ------------------
  |  Branch (434:9): [True: 28, False: 3.84k]
  ------------------
  435|     28|            result = TextureUnitState::TAM_WRAP;
  436|     28|            break;
  437|  3.70k|        case ID_CLAMP:
  ------------------
  |  Branch (437:9): [True: 3.70k, False: 168]
  ------------------
  438|  3.70k|            result = TextureUnitState::TAM_CLAMP;
  439|  3.70k|            break;
  440|      7|        case ID_MIRROR:
  ------------------
  |  Branch (440:9): [True: 7, False: 3.86k]
  ------------------
  441|      7|            result = TextureUnitState::TAM_MIRROR;
  442|      7|            break;
  443|     16|        case ID_BORDER:
  ------------------
  |  Branch (443:9): [True: 16, False: 3.85k]
  ------------------
  444|     16|            result = TextureUnitState::TAM_BORDER;
  445|     16|            break;
  446|    117|        default:
  ------------------
  |  Branch (446:9): [True: 117, False: 3.75k]
  ------------------
  447|    117|            return false;
  448|  3.87k|        }
  449|  3.75k|        return true;
  450|  3.87k|    }
_ZN4Ogre16ScriptTranslator11processNodeEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
  527|  57.5k|    {
  528|  57.5k|        if(node->type != ANT_OBJECT)
  ------------------
  |  Branch (528:12): [True: 0, False: 57.5k]
  ------------------
  529|      0|            return;
  530|       |
  531|       |        // Abstract objects are completely skipped
  532|  57.5k|        if((static_cast<ObjectAbstractNode*>(node.get()))->abstract)
  ------------------
  |  Branch (532:12): [True: 33, False: 57.4k]
  ------------------
  533|     33|            return;
  534|       |
  535|       |        // Retrieve the translator to use
  536|  57.4k|        ScriptTranslator *translator =
  537|  57.4k|            ScriptCompilerManager::getSingleton().getTranslator(node);
  538|       |
  539|  57.4k|        if(translator)
  ------------------
  |  Branch (539:12): [True: 49.2k, False: 8.18k]
  ------------------
  540|  49.2k|            translator->translate(compiler, node);
  541|  8.18k|        else
  542|  8.18k|            compiler->addError(ScriptCompiler::CE_UNEXPECTEDTOKEN, node->file, node->line,
  543|  8.18k|                               "token \"" + static_cast<ObjectAbstractNode*>(node.get())->cls + "\" is not recognized");
  544|  57.4k|    }
_ZN4Ogre16ScriptTranslator9getNodeAtERKNSt3__14listINS_9SharedPtrINS_12AbstractNodeEEENS1_9allocatorIS5_EEEEm:
  547|  45.3k|    {
  548|  45.3k|        if(index >= nodes.size())
  ------------------
  |  Branch (548:12): [True: 9.67k, False: 35.7k]
  ------------------
  549|  9.67k|            return nodes.end();
  550|       |
  551|  35.7k|        return std::next(nodes.begin(), index);
  552|  45.3k|    }
_ZN4Ogre16ScriptTranslator10getBooleanERKNS_9SharedPtrINS_12AbstractNodeEEEPb:
  555|  10.4k|    {
  556|  10.4k|        if (node->type != ANT_ATOM)
  ------------------
  |  Branch (556:13): [True: 17, False: 10.4k]
  ------------------
  557|     17|            return false;
  558|  10.4k|        AtomAbstractNode *atom = (AtomAbstractNode*)node.get();
  559|  10.4k|		 if (atom->id == 1 || atom->id == 2)
  ------------------
  |  Branch (559:8): [True: 1.13k, False: 9.32k]
  |  Branch (559:25): [True: 8.77k, False: 557]
  ------------------
  560|  9.90k|		{
  561|  9.90k|			*result = atom->id == 1 ? true : false;
  ------------------
  |  Branch (561:14): [True: 1.13k, False: 8.77k]
  ------------------
  562|  9.90k|			return true;
  563|  9.90k|		}
  564|       |        //     return false;
  565|    557|		return false;
  566|  10.4k|    }
_ZN4Ogre16ScriptTranslator9getStringERKNS_9SharedPtrINS_12AbstractNodeEEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE:
  569|  42.6k|    {
  570|  42.6k|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (570:12): [True: 186, False: 42.4k]
  ------------------
  571|    186|            return false;
  572|  42.4k|        AtomAbstractNode *atom = (AtomAbstractNode*)node.get();
  573|  42.4k|        *result = atom->value;
  574|  42.4k|        return true;
  575|  42.6k|    }
_ZN4Ogre16ScriptTranslator8getFloatERKNS_9SharedPtrINS_12AbstractNodeEEEPf:
  578|  21.0k|    {
  579|  21.0k|        return StringConverter::parse(node->getString(), *result);
  580|  21.0k|    }
_ZN4Ogre16ScriptTranslator6getIntERKNS_9SharedPtrINS_12AbstractNodeEEEPi:
  588|    310|    {
  589|    310|        return StringConverter::parse(node->getString(), *result);
  590|    310|    }
_ZN4Ogre16ScriptTranslator7getUIntERKNS_9SharedPtrINS_12AbstractNodeEEEPj:
  593|  2.89k|    {
  594|  2.89k|        return StringConverter::parse(node->getString(), *result);
  595|  2.89k|    }
_ZN4Ogre16ScriptTranslator9getColourENSt3__121__list_const_iteratorINS_9SharedPtrINS_12AbstractNodeEEEPvEES7_PNS_11ColourValueEi:
  598|  5.18k|    {
  599|  5.18k|        int n = 0;
  600|  22.5k|        while(i != end && n < maxEntries)
  ------------------
  |  Branch (600:15): [True: 17.8k, False: 4.72k]
  |  Branch (600:27): [True: 17.6k, False: 249]
  ------------------
  601|  17.6k|        {
  602|  17.6k|            float v = 0;
  603|  17.6k|            if(getFloat(*i, &v))
  ------------------
  |  Branch (603:16): [True: 17.4k, False: 212]
  ------------------
  604|  17.4k|            {
  605|  17.4k|                switch(n)
  ------------------
  |  Branch (605:24): [True: 17.4k, False: 0]
  ------------------
  606|  17.4k|                {
  607|  5.06k|                case 0:
  ------------------
  |  Branch (607:17): [True: 5.06k, False: 12.3k]
  ------------------
  608|  5.06k|                    result->r = v;
  609|  5.06k|                    break;
  610|  4.96k|                case 1:
  ------------------
  |  Branch (610:17): [True: 4.96k, False: 12.4k]
  ------------------
  611|  4.96k|                    result->g = v;
  612|  4.96k|                    break;
  613|  4.89k|                case 2:
  ------------------
  |  Branch (613:17): [True: 4.89k, False: 12.5k]
  ------------------
  614|  4.89k|                    result->b = v;
  615|  4.89k|                    break;
  616|  2.48k|                case 3:
  ------------------
  |  Branch (616:17): [True: 2.48k, False: 14.9k]
  ------------------
  617|  2.48k|                    result->a = v;
  618|  2.48k|                    break;
  619|  17.4k|                }
  620|  17.4k|            }
  621|    212|            else
  622|    212|            {
  623|    212|                return false;
  624|    212|            }
  625|  17.4k|            ++n;
  626|  17.4k|            ++i;
  627|  17.4k|        }
  628|       |        // return error if we found less than rgb before end, unless constrained
  629|  4.97k|        return (n >= 3 || n == maxEntries);
  ------------------
  |  Branch (629:17): [True: 4.87k, False: 102]
  |  Branch (629:27): [True: 0, False: 102]
  ------------------
  630|  5.18k|    }
_ZN4Ogre16ScriptTranslator19getSceneBlendFactorERKNS_9SharedPtrINS_12AbstractNodeEEEPNS_16SceneBlendFactorE:
  633|    740|    {
  634|    740|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (634:12): [True: 2, False: 738]
  ------------------
  635|      2|            return false;
  636|    738|        AtomAbstractNode *atom = (AtomAbstractNode*)node.get();
  637|    738|        switch(atom->id)
  638|    738|        {
  639|    670|        case ID_ONE:
  ------------------
  |  Branch (639:9): [True: 670, False: 68]
  ------------------
  640|    670|            *sbf = SBF_ONE;
  641|    670|            break;
  642|      0|        case ID_ZERO:
  ------------------
  |  Branch (642:9): [True: 0, False: 738]
  ------------------
  643|      0|            *sbf = SBF_ZERO;
  644|      0|            break;
  645|      0|        case ID_DEST_COLOUR:
  ------------------
  |  Branch (645:9): [True: 0, False: 738]
  ------------------
  646|      0|            *sbf = SBF_DEST_COLOUR;
  647|      0|            break;
  648|      0|        case ID_DEST_ALPHA:
  ------------------
  |  Branch (648:9): [True: 0, False: 738]
  ------------------
  649|      0|            *sbf = SBF_DEST_ALPHA;
  650|      0|            break;
  651|      0|        case ID_SRC_ALPHA:
  ------------------
  |  Branch (651:9): [True: 0, False: 738]
  ------------------
  652|      0|            *sbf = SBF_SOURCE_ALPHA;
  653|      0|            break;
  654|      0|        case ID_SRC_COLOUR:
  ------------------
  |  Branch (654:9): [True: 0, False: 738]
  ------------------
  655|      0|            *sbf = SBF_SOURCE_COLOUR;
  656|      0|            break;
  657|      0|        case ID_ONE_MINUS_DEST_COLOUR:
  ------------------
  |  Branch (657:9): [True: 0, False: 738]
  ------------------
  658|      0|            *sbf = SBF_ONE_MINUS_DEST_COLOUR;
  659|      0|            break;
  660|      0|        case ID_ONE_MINUS_SRC_COLOUR:
  ------------------
  |  Branch (660:9): [True: 0, False: 738]
  ------------------
  661|      0|            *sbf = SBF_ONE_MINUS_SOURCE_COLOUR;
  662|      0|            break;
  663|      0|        case ID_ONE_MINUS_DEST_ALPHA:
  ------------------
  |  Branch (663:9): [True: 0, False: 738]
  ------------------
  664|      0|            *sbf = SBF_ONE_MINUS_DEST_ALPHA;
  665|      0|            break;
  666|      0|        case ID_ONE_MINUS_SRC_ALPHA:
  ------------------
  |  Branch (666:9): [True: 0, False: 738]
  ------------------
  667|      0|            *sbf = SBF_ONE_MINUS_SOURCE_ALPHA;
  668|      0|            break;
  669|     68|        default:
  ------------------
  |  Branch (669:9): [True: 68, False: 670]
  ------------------
  670|     68|            return false;
  671|    738|        }
  672|    670|        return true;
  673|    738|    }
_ZN4Ogre16ScriptTranslator18getCompareFunctionERKNS_9SharedPtrINS_12AbstractNodeEEEPNS_15CompareFunctionE:
  676|    259|    {
  677|    259|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (677:12): [True: 12, False: 247]
  ------------------
  678|     12|            return false;
  679|    247|        AtomAbstractNode *atom = (AtomAbstractNode*)node.get();
  680|    247|        switch(atom->id)
  681|    247|        {
  682|      0|        case ID_ALWAYS_FAIL:
  ------------------
  |  Branch (682:9): [True: 0, False: 247]
  ------------------
  683|      0|            *func = CMPF_ALWAYS_FAIL;
  684|      0|            break;
  685|     71|        case ID_ALWAYS_PASS:
  ------------------
  |  Branch (685:9): [True: 71, False: 176]
  ------------------
  686|     71|            *func = CMPF_ALWAYS_PASS;
  687|     71|            break;
  688|      0|        case ID_LESS:
  ------------------
  |  Branch (688:9): [True: 0, False: 247]
  ------------------
  689|      0|            *func = CMPF_LESS;
  690|      0|            break;
  691|      4|        case ID_LESS_EQUAL:
  ------------------
  |  Branch (691:9): [True: 4, False: 243]
  ------------------
  692|      4|            *func = CMPF_LESS_EQUAL;
  693|      4|            break;
  694|      0|        case ID_EQUAL:
  ------------------
  |  Branch (694:9): [True: 0, False: 247]
  ------------------
  695|      0|            *func = CMPF_EQUAL;
  696|      0|            break;
  697|      0|        case ID_NOT_EQUAL:
  ------------------
  |  Branch (697:9): [True: 0, False: 247]
  ------------------
  698|      0|            *func = CMPF_NOT_EQUAL;
  699|      0|            break;
  700|      0|        case ID_GREATER_EQUAL:
  ------------------
  |  Branch (700:9): [True: 0, False: 247]
  ------------------
  701|      0|            *func = CMPF_GREATER_EQUAL;
  702|      0|            break;
  703|    142|        case ID_GREATER:
  ------------------
  |  Branch (703:9): [True: 142, False: 105]
  ------------------
  704|    142|            *func = CMPF_GREATER;
  705|    142|            break;
  706|     30|        default:
  ------------------
  |  Branch (706:9): [True: 30, False: 217]
  ------------------
  707|     30|            return false;
  708|    247|        }
  709|    217|        return true;
  710|    247|    }
_ZN4Ogre16ScriptTranslator10getMatrix4ENSt3__121__list_const_iteratorINS_9SharedPtrINS_12AbstractNodeEEEPvEES7_PNS_7Matrix4E:
  713|     11|    {
  714|     11|        int n = 0;
  715|     19|        while (i != end && n < 16)
  ------------------
  |  Branch (715:16): [True: 17, False: 2]
  |  Branch (715:28): [True: 17, False: 0]
  ------------------
  716|     17|        {
  717|     17|            Real r = 0;
  718|     17|            if (!getReal(*i, &r))
  ------------------
  |  Branch (718:17): [True: 9, False: 8]
  ------------------
  719|      9|                return false;
  720|       |
  721|      8|            (*m)[n/4][n%4] = r;
  722|      8|            ++i;
  723|      8|            ++n;
  724|      8|        }
  725|      2|        return n == 16;
  726|     11|    }
_ZN4Ogre16ScriptTranslator9getVectorENSt3__121__list_const_iteratorINS_9SharedPtrINS_12AbstractNodeEEEPvEES7_RNS1_6vectorIfNS1_9allocatorIfEEEEm:
  784|  1.80k|    {
  785|  1.80k|        return _getVector(i, end, vals, count);
  786|  1.80k|    }
_ZN4Ogre16ScriptTranslator12getStencilOpERKNS_9SharedPtrINS_12AbstractNodeEEEPNS_16StencilOperationE:
  867|      2|    {
  868|      2|        if(node->type != ANT_ATOM)
  ------------------
  |  Branch (868:12): [True: 1, False: 1]
  ------------------
  869|      1|            return false;
  870|      1|        AtomAbstractNode *atom = (AtomAbstractNode*)node.get();
  871|      1|        switch(atom->id)
  872|      1|        {
  873|      0|        case ID_KEEP:
  ------------------
  |  Branch (873:9): [True: 0, False: 1]
  ------------------
  874|      0|            *op = SOP_KEEP;
  875|      0|            break;
  876|      0|        case ID_ZERO:
  ------------------
  |  Branch (876:9): [True: 0, False: 1]
  ------------------
  877|      0|            *op = SOP_ZERO;
  878|      0|            break;
  879|      0|        case ID_REPLACE:
  ------------------
  |  Branch (879:9): [True: 0, False: 1]
  ------------------
  880|      0|            *op = SOP_REPLACE;
  881|      0|            break;
  882|      0|        case ID_INCREMENT:
  ------------------
  |  Branch (882:9): [True: 0, False: 1]
  ------------------
  883|      0|            *op = SOP_INCREMENT;
  884|      0|            break;
  885|      0|        case ID_DECREMENT:
  ------------------
  |  Branch (885:9): [True: 0, False: 1]
  ------------------
  886|      0|            *op = SOP_DECREMENT;
  887|      0|            break;
  888|      0|        case ID_INCREMENT_WRAP:
  ------------------
  |  Branch (888:9): [True: 0, False: 1]
  ------------------
  889|      0|            *op = SOP_INCREMENT_WRAP;
  890|      0|            break;
  891|      0|        case ID_DECREMENT_WRAP:
  ------------------
  |  Branch (891:9): [True: 0, False: 1]
  ------------------
  892|      0|            *op = SOP_DECREMENT_WRAP;
  893|      0|            break;
  894|      0|        case ID_INVERT:
  ------------------
  |  Branch (894:9): [True: 0, False: 1]
  ------------------
  895|      0|            *op = SOP_INVERT;
  896|      0|            break;
  897|      1|        default:
  ------------------
  |  Branch (897:9): [True: 1, False: 0]
  ------------------
  898|      1|            return false;
  899|      1|        }
  900|      0|        return true;
  901|      1|    }
_ZN4Ogre16ScriptTranslator15getConstantTypeENSt3__121__list_const_iteratorINS_9SharedPtrINS_12AbstractNodeEEEPvEEPNS_15GpuConstantTypeE:
  904|     56|    {
  905|     56|        const String& val = (*i)->getString();
  906|     56|        if(val.empty())
  ------------------
  |  Branch (906:12): [True: 0, False: 56]
  ------------------
  907|      0|            return false;
  908|       |
  909|     56|        if (val.find("float") != String::npos)
  ------------------
  |  Branch (909:13): [True: 6, False: 50]
  ------------------
  910|      6|        {
  911|      6|            int count = 1;
  912|      6|            if (val.size() == 6)
  ------------------
  |  Branch (912:17): [True: 5, False: 1]
  ------------------
  913|      5|                count = StringConverter::parseInt(val.substr(5));
  914|      1|            else if (val.size() > 6)
  ------------------
  |  Branch (914:22): [True: 0, False: 1]
  ------------------
  915|      0|                return false;
  916|       |
  917|      6|            if (count > 4 || count == 0)
  ------------------
  |  Branch (917:17): [True: 0, False: 6]
  |  Branch (917:30): [True: 0, False: 6]
  ------------------
  918|      0|                return false;
  919|       |
  920|      6|            *op = (GpuConstantType)(GCT_FLOAT1 + count - 1);
  921|      6|        }
  922|     50|        else if (val.find("double") != String::npos)
  ------------------
  |  Branch (922:18): [True: 0, False: 50]
  ------------------
  923|      0|        {
  924|      0|            int count = 1;
  925|      0|            if (val.size() == 7)
  ------------------
  |  Branch (925:17): [True: 0, False: 0]
  ------------------
  926|      0|                count = StringConverter::parseInt(val.substr(6));
  927|      0|            else if (val.size() > 7)
  ------------------
  |  Branch (927:22): [True: 0, False: 0]
  ------------------
  928|      0|                return false;
  929|       |
  930|      0|            if (count > 4 || count == 0)
  ------------------
  |  Branch (930:17): [True: 0, False: 0]
  |  Branch (930:30): [True: 0, False: 0]
  ------------------
  931|      0|                return false;
  932|       |
  933|      0|            *op = (GpuConstantType)(GCT_DOUBLE1 + count - 1);
  934|      0|        }
  935|     50|        else if (val.find("uint") != String::npos)
  ------------------
  |  Branch (935:18): [True: 21, False: 29]
  ------------------
  936|     21|        {
  937|     21|            int count = 1;
  938|     21|            if (val.size() == 5)
  ------------------
  |  Branch (938:17): [True: 3, False: 18]
  ------------------
  939|      3|                count = StringConverter::parseInt(val.substr(4));
  940|     18|            else if (val.size() > 5)
  ------------------
  |  Branch (940:22): [True: 4, False: 14]
  ------------------
  941|      4|                return false;
  942|       |
  943|     17|            if (count > 4 || count == 0)
  ------------------
  |  Branch (943:17): [True: 0, False: 17]
  |  Branch (943:30): [True: 1, False: 16]
  ------------------
  944|      1|                return false;
  945|       |
  946|     16|            *op = (GpuConstantType)(GCT_UINT1 + count - 1);
  947|     16|        }
  948|     29|        else if (val.find("int") != String::npos)
  ------------------
  |  Branch (948:18): [True: 10, False: 19]
  ------------------
  949|     10|        {
  950|     10|            int count = 1;
  951|     10|            if (val.size() == 4)
  ------------------
  |  Branch (951:17): [True: 1, False: 9]
  ------------------
  952|      1|                count = StringConverter::parseInt(val.substr(3));
  953|      9|            else if (val.size() > 4)
  ------------------
  |  Branch (953:22): [True: 5, False: 4]
  ------------------
  954|      5|                return false;
  955|       |
  956|      5|            if (count > 4 || count == 0)
  ------------------
  |  Branch (956:17): [True: 0, False: 5]
  |  Branch (956:30): [True: 1, False: 4]
  ------------------
  957|      1|                return false;
  958|       |
  959|      4|            *op = (GpuConstantType)(GCT_INT1 + count - 1);
  960|      4|        }
  961|     19|        else if (val.find("bool") != String::npos)
  ------------------
  |  Branch (961:18): [True: 0, False: 19]
  ------------------
  962|      0|        {
  963|      0|            int count = 1;
  964|      0|            if (val.size() == 5)
  ------------------
  |  Branch (964:17): [True: 0, False: 0]
  ------------------
  965|      0|                count = StringConverter::parseInt(val.substr(4));
  966|      0|            else if (val.size() > 5)
  ------------------
  |  Branch (966:22): [True: 0, False: 0]
  ------------------
  967|      0|                return false;
  968|       |
  969|      0|            if (count > 4 || count == 0)
  ------------------
  |  Branch (969:17): [True: 0, False: 0]
  |  Branch (969:30): [True: 0, False: 0]
  ------------------
  970|      0|                return false;
  971|       |
  972|      0|            *op = (GpuConstantType)(GCT_BOOL1 + count - 1);
  973|      0|        }
  974|     19|        else if(val.find("matrix") != String::npos)
  ------------------
  |  Branch (974:17): [True: 0, False: 19]
  ------------------
  975|      0|        {
  976|      0|            int count1, count2;
  977|       |
  978|      0|            if (val.size() == 9)
  ------------------
  |  Branch (978:17): [True: 0, False: 0]
  ------------------
  979|      0|            {
  980|      0|                count1 = StringConverter::parseInt(val.substr(6, 1));
  981|      0|                count2 = StringConverter::parseInt(val.substr(8, 1));
  982|      0|            }
  983|      0|            else
  984|      0|                return false;
  985|       |
  986|      0|            if (count1 > 4 || count1 < 2 || count2 > 4 || count2 < 2)
  ------------------
  |  Branch (986:17): [True: 0, False: 0]
  |  Branch (986:31): [True: 0, False: 0]
  |  Branch (986:45): [True: 0, False: 0]
  |  Branch (986:59): [True: 0, False: 0]
  ------------------
  987|      0|                return false;
  988|       |
  989|      0|            switch(count1)
  ------------------
  |  Branch (989:20): [True: 0, False: 0]
  ------------------
  990|      0|            {
  991|      0|            case 2:
  ------------------
  |  Branch (991:13): [True: 0, False: 0]
  ------------------
  992|      0|                *op = (GpuConstantType)(GCT_MATRIX_2X2 + count2 - 2);
  993|      0|                break;
  994|      0|            case 3:
  ------------------
  |  Branch (994:13): [True: 0, False: 0]
  ------------------
  995|      0|                *op = (GpuConstantType)(GCT_MATRIX_3X2 + count2 - 2);
  996|      0|                break;
  997|      0|            case 4:
  ------------------
  |  Branch (997:13): [True: 0, False: 0]
  ------------------
  998|      0|                *op = (GpuConstantType)(GCT_MATRIX_4X2 + count2 - 2);
  999|      0|                break;
 1000|      0|            }
 1001|       |
 1002|      0|        }
 1003|     19|        else
 1004|     19|        {
 1005|     19|            return false;
 1006|     19|        }
 1007|       |
 1008|     26|        return true;
 1009|     56|    }
_ZN4Ogre18MaterialTranslatorC2Ev:
 1015|      1|    {
 1016|      1|    }
_ZN4Ogre18MaterialTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 1019|  13.1k|    {
 1020|  13.1k|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 1021|  13.1k|        if(obj->name.empty())
  ------------------
  |  Branch (1021:12): [True: 9, False: 13.1k]
  ------------------
 1022|      9|        {
 1023|      9|            compiler->addError(ScriptCompiler::CE_OBJECTNAMEEXPECTED, obj->file, obj->line);
 1024|      9|            return;
 1025|      9|        }
 1026|       |
 1027|  13.1k|        Material* mMaterial = 0;
 1028|       |
 1029|       |        // Create a material with the given name
 1030|  13.1k|        CreateMaterialScriptCompilerEvent evt(node->file, obj->name, compiler->getResourceGroup());
 1031|  13.1k|        bool processed = compiler->_fireEvent(&evt, (void*)&mMaterial);
 1032|       |
 1033|  13.1k|        if(!processed)
  ------------------
  |  Branch (1033:12): [True: 13.1k, False: 0]
  ------------------
 1034|  13.1k|        {
 1035|  13.1k|            mMaterial = MaterialManager::getSingleton().create(obj->name, compiler->getResourceGroup()).get();
 1036|  13.1k|        }
 1037|       |
 1038|  13.1k|        if(!mMaterial)
  ------------------
  |  Branch (1038:12): [True: 0, False: 13.1k]
  ------------------
 1039|      0|        {
 1040|      0|            compiler->addError(ScriptCompiler::CE_OBJECTALLOCATIONERROR, obj->file, obj->line, obj->name);
 1041|      0|            return;
 1042|      0|        }
 1043|       |
 1044|  13.1k|        mMaterial->removeAllTechniques();
 1045|  13.1k|        obj->context = mMaterial;
 1046|  13.1k|        mMaterial->_notifyOrigin(obj->file);
 1047|       |
 1048|  13.1k|        bool bval;
 1049|  13.1k|        String sval;
 1050|       |
 1051|  13.1k|        for(auto & i : obj->children)
  ------------------
  |  Branch (1051:22): [True: 19.0k, False: 13.1k]
  ------------------
 1052|  19.0k|        {
 1053|  19.0k|            if(i->type == ANT_PROPERTY)
  ------------------
  |  Branch (1053:16): [True: 2.07k, False: 17.0k]
  ------------------
 1054|  2.07k|            {
 1055|  2.07k|                PropertyAbstractNode *prop = static_cast<PropertyAbstractNode*>(i.get());
 1056|  2.07k|                switch(prop->id)
 1057|  2.07k|                {
 1058|     99|                case ID_LOD_VALUES:
  ------------------
  |  Branch (1058:17): [True: 99, False: 1.97k]
  ------------------
 1059|     99|                    {
 1060|     99|                        Material::LodValueList lods;
 1061|     99|                        for(const auto& j : prop->values)
  ------------------
  |  Branch (1061:43): [True: 235, False: 99]
  ------------------
 1062|    235|                        {
 1063|    235|                            Real v = 0;
 1064|    235|                            if(getReal(j, &v))
  ------------------
  |  Branch (1064:32): [True: 79, False: 156]
  ------------------
 1065|     79|                                lods.push_back(v);
 1066|    156|                            else
 1067|    156|                                compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 1068|    156|                                                   "lod_values expects only numbers as arguments");
 1069|    235|                        }
 1070|     99|                        mMaterial->setLodLevels(lods);
 1071|     99|                    }
 1072|     99|                    break;
 1073|      0|                case ID_LOD_DISTANCES:
  ------------------
  |  Branch (1073:17): [True: 0, False: 2.07k]
  ------------------
 1074|      0|                    {
 1075|       |                        // Deprecated! Only for backwards compatibility.
 1076|       |                        // Set strategy hard-coded to 'distance' strategy, since that was the only one available back then,
 1077|       |                        // when using this material keyword was still current.
 1078|      0|                        LodStrategy *strategy = DistanceLodSphereStrategy::getSingletonPtr();
 1079|      0|                        mMaterial->setLodStrategy(strategy);
 1080|       |
 1081|      0|                        compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, prop->file,
 1082|      0|                                           prop->line,
 1083|      0|                                           "lod_distances. Use lod_values.");
 1084|       |                        // Read in LOD distances
 1085|      0|                        Material::LodValueList lods;
 1086|      0|                        for(auto& j : prop->values)
  ------------------
  |  Branch (1086:37): [True: 0, False: 0]
  ------------------
 1087|      0|                        {
 1088|      0|                            Real v = 0;
 1089|      0|                            if(getReal(j, &v))
  ------------------
  |  Branch (1089:32): [True: 0, False: 0]
  ------------------
 1090|      0|                                lods.push_back(v);
 1091|      0|                            else
 1092|      0|                                compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 1093|      0|                                                   "lod_values expects only numbers as arguments");
 1094|      0|                        }
 1095|      0|                        mMaterial->setLodLevels(lods);
 1096|      0|                    }
 1097|      0|                    break;
 1098|     66|                case ID_LOD_STRATEGY:
  ------------------
  |  Branch (1098:17): [True: 66, False: 2.00k]
  ------------------
 1099|     66|                    if(getValue(prop, compiler, sval))
  ------------------
  |  Branch (1099:24): [True: 63, False: 3]
  ------------------
 1100|     63|                    {
 1101|     63|                            if (sval == "Distance" || sval == "PixelCount")
  ------------------
  |  Branch (1101:33): [True: 0, False: 63]
  |  Branch (1101:55): [True: 0, False: 63]
  ------------------
 1102|      0|                                compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, prop->file, prop->line,
 1103|      0|                                                   sval + ". use distance_box or pixel_count");
 1104|       |
 1105|     63|                            LodStrategy* strategy = LodStrategyManager::getSingleton().getStrategy(sval);
 1106|     63|                            if (strategy)
  ------------------
  |  Branch (1106:33): [True: 0, False: 63]
  ------------------
 1107|      0|                                mMaterial->setLodStrategy(strategy);
 1108|     63|                            else
 1109|     63|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line, sval);
 1110|     63|                    }
 1111|     66|                    break;
 1112|    285|                case ID_RECEIVE_SHADOWS:
  ------------------
  |  Branch (1112:17): [True: 285, False: 1.78k]
  ------------------
 1113|    285|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (1113:24): [True: 279, False: 6]
  ------------------
 1114|    279|                        mMaterial->setReceiveShadows(bval);
 1115|    285|                    break;
 1116|    108|                case ID_TRANSPARENCY_CASTS_SHADOWS:
  ------------------
  |  Branch (1116:17): [True: 108, False: 1.96k]
  ------------------
 1117|    108|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (1117:24): [True: 104, False: 4]
  ------------------
 1118|    104|                        mMaterial->setTransparencyCastsShadows(bval);
 1119|    108|                    break;
 1120|      7|                case ID_SET_TEXTURE_ALIAS:
  ------------------
  |  Branch (1120:17): [True: 7, False: 2.06k]
  ------------------
 1121|      7|                    if(prop->values.size() != 2)
  ------------------
  |  Branch (1121:24): [True: 1, False: 6]
  ------------------
 1122|      1|                    {
 1123|      1|                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1124|      1|                                            "set_texture_alias must have 2 string arguments");
 1125|      1|                    }
 1126|      6|                    else
 1127|      6|                    {
 1128|      6|                        compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, prop->file, prop->line,
 1129|      6|                                            "set_texture_alias. Use 'set $variable value'");
 1130|       |
 1131|      6|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0), i1 = getNodeAt(prop->values, 1);
 1132|      6|                        String name, value;
 1133|      6|                        if(getString(*i0, &name) && getString(*i1, &value))
  ------------------
  |  Branch (1133:28): [True: 6, False: 0]
  |  Branch (1133:53): [True: 5, False: 1]
  ------------------
 1134|      5|                            mTextureAliases.insert(std::make_pair(name, value));
 1135|      6|                    }
 1136|      7|                    break;
 1137|  1.50k|                default:
  ------------------
  |  Branch (1137:17): [True: 1.50k, False: 565]
  ------------------
 1138|  1.50k|                    compiler->addError(ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line,
 1139|  1.50k|                                       "token \"" + prop->name + "\" is not recognized");
 1140|  2.07k|                }
 1141|  2.07k|            }
 1142|  17.0k|            else if(i->type == ANT_OBJECT)
  ------------------
  |  Branch (1142:21): [True: 15.1k, False: 1.82k]
  ------------------
 1143|  15.1k|            {
 1144|  15.1k|                processNode(compiler, i);
 1145|  15.1k|            }
 1146|  19.0k|        }
 1147|       |
 1148|  13.1k|        applyTextureAliases(compiler, mMaterial, mTextureAliases);
 1149|  13.1k|        mTextureAliases.clear();
 1150|  13.1k|    }
_ZN4Ogre19TechniqueTranslatorC2Ev:
 1156|      1|        :mTechnique(0)
 1157|      1|    {
 1158|      1|    }
_ZN4Ogre19TechniqueTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 1161|  12.3k|    {
 1162|  12.3k|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 1163|       |
 1164|       |        // Create the technique from the material
 1165|  12.3k|        Ogre::Material *material = Ogre::any_cast<Ogre::Material*>(obj->parent->context);
 1166|  12.3k|        mTechnique = material->createTechnique();
 1167|  12.3k|        obj->context = mTechnique;
 1168|       |
 1169|       |        // Get the name of the technique
 1170|  12.3k|        if(!obj->name.empty())
  ------------------
  |  Branch (1170:12): [True: 1.68k, False: 10.6k]
  ------------------
 1171|  1.68k|            mTechnique->setName(obj->name);
 1172|       |
 1173|  12.3k|        uint32 uival;
 1174|  12.3k|        String sval;
 1175|       |
 1176|       |        // Set the properties for the material
 1177|  12.3k|        for(auto & i : obj->children)
  ------------------
  |  Branch (1177:22): [True: 16.8k, False: 12.3k]
  ------------------
 1178|  16.8k|        {
 1179|  16.8k|            if(i->type == ANT_PROPERTY)
  ------------------
  |  Branch (1179:16): [True: 1.77k, False: 15.0k]
  ------------------
 1180|  1.77k|            {
 1181|  1.77k|                PropertyAbstractNode *prop = static_cast<PropertyAbstractNode*>(i.get());
 1182|  1.77k|                switch(prop->id)
 1183|  1.77k|                {
 1184|    196|                case ID_SCHEME:
  ------------------
  |  Branch (1184:17): [True: 196, False: 1.57k]
  ------------------
 1185|    196|                    if(getValue(prop, compiler, sval))
  ------------------
  |  Branch (1185:24): [True: 195, False: 1]
  ------------------
 1186|    195|                        mTechnique->setSchemeName(sval);
 1187|    196|                    break;
 1188|      3|                case ID_LOD_INDEX:
  ------------------
  |  Branch (1188:17): [True: 3, False: 1.76k]
  ------------------
 1189|      3|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (1189:24): [True: 0, False: 3]
  ------------------
 1190|      0|                        mTechnique->setLodIndex(static_cast<uint16>(uival));
 1191|      3|                    break;
 1192|    172|                case ID_SHADOW_CASTER_MATERIAL:
  ------------------
  |  Branch (1192:17): [True: 172, False: 1.60k]
  ------------------
 1193|    172|                    if(getValue(prop, compiler, sval))
  ------------------
  |  Branch (1193:24): [True: 165, False: 7]
  ------------------
 1194|    165|                    {
 1195|    165|                        ProcessResourceNameScriptCompilerEvent evt(ProcessResourceNameScriptCompilerEvent::MATERIAL, sval);
 1196|    165|                        compiler->_fireEvent(&evt, 0);
 1197|    165|                        mTechnique->setShadowCasterMaterial(evt.mName); // Use the processed name
 1198|    165|                    }
 1199|    172|                    break;
 1200|     28|                case ID_SHADOW_RECEIVER_MATERIAL:
  ------------------
  |  Branch (1200:17): [True: 28, False: 1.74k]
  ------------------
 1201|     28|                    if(getValue(prop, compiler, sval))
  ------------------
  |  Branch (1201:24): [True: 10, False: 18]
  ------------------
 1202|     10|                    {
 1203|     10|                        ProcessResourceNameScriptCompilerEvent evt(ProcessResourceNameScriptCompilerEvent::MATERIAL, sval);
 1204|     10|                        compiler->_fireEvent(&evt, 0);
 1205|     10|                        mTechnique->setShadowReceiverMaterial(evt.mName); // Use the processed name
 1206|     10|                    }
 1207|     28|                    break;
 1208|     16|                case ID_GPU_VENDOR_RULE:
  ------------------
  |  Branch (1208:17): [True: 16, False: 1.75k]
  ------------------
 1209|     16|                    if(prop->values.size() < 2)
  ------------------
  |  Branch (1209:24): [True: 3, False: 13]
  ------------------
 1210|      3|                    {
 1211|      3|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line,
 1212|      3|                                           "gpu_vendor_rule must have 2 arguments");
 1213|      3|                    }
 1214|     13|                    else if(prop->values.size() > 2)
  ------------------
  |  Branch (1214:29): [True: 2, False: 11]
  ------------------
 1215|      2|                    {
 1216|      2|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1217|      2|                                           "gpu_vendor_rule must have 2 arguments");
 1218|      2|                    }
 1219|     11|                    else
 1220|     11|                    {
 1221|     11|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0);
 1222|     11|                        AbstractNodeList::const_iterator i1 = getNodeAt(prop->values, 1);
 1223|       |
 1224|     11|                        Technique::GPUVendorRule rule;
 1225|     11|                        if ((*i0)->type == ANT_ATOM)
  ------------------
  |  Branch (1225:29): [True: 10, False: 1]
  ------------------
 1226|     10|                        {
 1227|     10|                            AtomAbstractNode *atom0 = (AtomAbstractNode*)(*i0).get();
 1228|     10|                            if (atom0->id == ID_INCLUDE)
  ------------------
  |  Branch (1228:33): [True: 0, False: 10]
  ------------------
 1229|      0|                            {
 1230|      0|                                rule.includeOrExclude = Technique::INCLUDE;
 1231|      0|                            }
 1232|     10|                            else if (atom0->id == ID_EXCLUDE)
  ------------------
  |  Branch (1232:38): [True: 0, False: 10]
  ------------------
 1233|      0|                            {
 1234|      0|                                rule.includeOrExclude = Technique::EXCLUDE;
 1235|      0|                            }
 1236|     10|                            else
 1237|     10|                            {
 1238|     10|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1239|     10|                                                   "gpu_vendor_rule cannot accept \"" + (*i0)->getValue() + "\" as first argument");
 1240|     10|                            }
 1241|       |
 1242|     10|                            String vendor;
 1243|     10|                            if(!getString(*i1, &vendor))
  ------------------
  |  Branch (1243:32): [True: 1, False: 9]
  ------------------
 1244|      1|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1245|      1|                                                   "gpu_vendor_rule cannot accept \"" + (*i1)->getValue() + "\" as second argument");
 1246|       |
 1247|     10|                            rule.vendor = RenderSystemCapabilities::vendorFromString(vendor);
 1248|       |
 1249|     10|                            if (rule.vendor != GPU_UNKNOWN)
  ------------------
  |  Branch (1249:33): [True: 0, False: 10]
  ------------------
 1250|      0|                            {
 1251|      0|                                mTechnique->addGPUVendorRule(rule);
 1252|      0|                            }
 1253|     10|                        }
 1254|      1|                        else
 1255|      1|                        {
 1256|      1|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1257|      1|                                               "gpu_vendor_rule cannot accept \"" + (*i0)->getValue() + "\" as first argument");
 1258|      1|                        }
 1259|       |
 1260|     11|                    }
 1261|     16|                    break;
 1262|     86|                case ID_GPU_DEVICE_RULE:
  ------------------
  |  Branch (1262:17): [True: 86, False: 1.68k]
  ------------------
 1263|     86|                    if(prop->values.size() < 2)
  ------------------
  |  Branch (1263:24): [True: 6, False: 80]
  ------------------
 1264|      6|                    {
 1265|      6|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line,
 1266|      6|                                           "gpu_device_rule must have at least 2 arguments");
 1267|      6|                    }
 1268|     80|                    else if(prop->values.size() > 3)
  ------------------
  |  Branch (1268:29): [True: 4, False: 76]
  ------------------
 1269|      4|                    {
 1270|      4|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1271|      4|                                           "gpu_device_rule must have at most 3 arguments");
 1272|      4|                    }
 1273|     76|                    else
 1274|     76|                    {
 1275|     76|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0);
 1276|     76|                        AbstractNodeList::const_iterator i1 = getNodeAt(prop->values, 1);
 1277|       |
 1278|     76|                        Technique::GPUDeviceNameRule rule;
 1279|     76|                        if ((*i0)->type == ANT_ATOM)
  ------------------
  |  Branch (1279:29): [True: 75, False: 1]
  ------------------
 1280|     75|                        {
 1281|     75|                            AtomAbstractNode *atom0 = (AtomAbstractNode*)(*i0).get();
 1282|     75|                            if (atom0->id == ID_INCLUDE)
  ------------------
  |  Branch (1282:33): [True: 0, False: 75]
  ------------------
 1283|      0|                            {
 1284|      0|                                rule.includeOrExclude = Technique::INCLUDE;
 1285|      0|                            }
 1286|     75|                            else if (atom0->id == ID_EXCLUDE)
  ------------------
  |  Branch (1286:38): [True: 0, False: 75]
  ------------------
 1287|      0|                            {
 1288|      0|                                rule.includeOrExclude = Technique::EXCLUDE;
 1289|      0|                            }
 1290|     75|                            else
 1291|     75|                            {
 1292|     75|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1293|     75|                                                   "gpu_device_rule cannot accept \"" + (*i0)->getValue() + "\" as first argument");
 1294|     75|                            }
 1295|       |
 1296|     75|                            if(!getString(*i1, &rule.devicePattern))
  ------------------
  |  Branch (1296:32): [True: 33, False: 42]
  ------------------
 1297|     33|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1298|     33|                                                   "gpu_device_rule cannot accept \"" + (*i1)->getValue() + "\" as second argument");
 1299|       |
 1300|     75|                            if (prop->values.size() == 3)
  ------------------
  |  Branch (1300:33): [True: 28, False: 47]
  ------------------
 1301|     28|                            {
 1302|     28|                                AbstractNodeList::const_iterator i2 = getNodeAt(prop->values, 2);
 1303|     28|                                if (!getBoolean(*i2, &rule.caseSensitive))
  ------------------
  |  Branch (1303:37): [True: 27, False: 1]
  ------------------
 1304|     27|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1305|     27|                                                       "gpu_device_rule third argument must be \"true\", \"false\", \"yes\", \"no\", \"on\", or \"off\"");
 1306|     28|                            }
 1307|       |
 1308|     75|                            mTechnique->addGPUDeviceNameRule(rule);
 1309|     75|                        }
 1310|      1|                        else
 1311|      1|                        {
 1312|      1|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1313|      1|                                               "gpu_device_rule cannot accept \"" + (*i0)->getValue() + "\" as first argument");
 1314|      1|                        }
 1315|       |
 1316|     76|                    }
 1317|     86|                    break;
 1318|  1.27k|                default:
  ------------------
  |  Branch (1318:17): [True: 1.27k, False: 501]
  ------------------
 1319|  1.27k|                    compiler->addError(ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line,
 1320|  1.27k|                                       "token \"" + prop->name + "\" is not recognized");
 1321|  1.77k|                }
 1322|  1.77k|            }
 1323|  15.0k|            else if(i->type == ANT_OBJECT)
  ------------------
  |  Branch (1323:21): [True: 14.0k, False: 1.06k]
  ------------------
 1324|  14.0k|            {
 1325|  14.0k|                processNode(compiler, i);
 1326|  14.0k|            }
 1327|  16.8k|        }
 1328|  12.3k|    }
_ZN4Ogre14PassTranslatorC2Ev:
 1334|      1|        :mPass(0)
 1335|      1|    {
 1336|      1|    }
_ZN4Ogre14PassTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 1339|  12.1k|    {
 1340|  12.1k|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 1341|       |
 1342|  12.1k|        Technique *technique = any_cast<Technique*>(obj->parent->context);
 1343|  12.1k|        mPass = technique->createPass();
 1344|  12.1k|        obj->context = mPass;
 1345|       |
 1346|       |        // Get the name of the technique
 1347|  12.1k|        if(!obj->name.empty())
  ------------------
  |  Branch (1347:12): [True: 2.02k, False: 10.1k]
  ------------------
 1348|  2.02k|            mPass->setName(obj->name);
 1349|       |
 1350|  12.1k|        Real fval;
 1351|  12.1k|        bool bval;
 1352|  12.1k|        uint32 uival;
 1353|       |
 1354|       |        // Set the properties for the material
 1355|  12.1k|        for(auto & i : obj->children)
  ------------------
  |  Branch (1355:22): [True: 46.5k, False: 12.1k]
  ------------------
 1356|  46.5k|        {
 1357|  46.5k|            if(i->type == ANT_PROPERTY)
  ------------------
  |  Branch (1357:16): [True: 25.1k, False: 21.3k]
  ------------------
 1358|  25.1k|            {
 1359|  25.1k|                PropertyAbstractNode *prop = static_cast<PropertyAbstractNode*>(i.get());
 1360|  25.1k|                switch(prop->id)
 1361|  25.1k|                {
 1362|  2.34k|                case ID_AMBIENT:
  ------------------
  |  Branch (1362:17): [True: 2.34k, False: 22.8k]
  ------------------
 1363|  2.34k|                    if(prop->values.empty())
  ------------------
  |  Branch (1363:24): [True: 1, False: 2.34k]
  ------------------
 1364|      1|                    {
 1365|      1|                        compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line);
 1366|      1|                    }
 1367|  2.34k|                    else if(prop->values.size() > 4)
  ------------------
  |  Branch (1367:29): [True: 196, False: 2.15k]
  ------------------
 1368|    196|                    {
 1369|    196|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1370|    196|                                           "ambient must have at most 4 parameters");
 1371|    196|                    }
 1372|  2.15k|                    else
 1373|  2.15k|                    {
 1374|  2.15k|                        if(prop->values.front()->type == ANT_ATOM &&
  ------------------
  |  Branch (1374:28): [True: 2.15k, False: 1]
  ------------------
 1375|  2.15k|                           ((AtomAbstractNode*)prop->values.front().get())->id == ID_VERTEXCOLOUR)
  ------------------
  |  Branch (1375:28): [True: 5, False: 2.14k]
  ------------------
 1376|      5|                        {
 1377|      5|                            mPass->setVertexColourTracking(mPass->getVertexColourTracking() | TVC_AMBIENT);
 1378|      5|                        }
 1379|  2.14k|                        else
 1380|  2.14k|                        {
 1381|  2.14k|                            ColourValue val = ColourValue::White;
 1382|  2.14k|                            if(getColour(prop->values.begin(), prop->values.end(), &val))
  ------------------
  |  Branch (1382:32): [True: 2.07k, False: 67]
  ------------------
 1383|  2.07k|                                mPass->setAmbient(val);
 1384|     67|                            else
 1385|     67|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1386|     67|                                                   "ambient requires 3 or 4 colour arguments, or a \"vertexcolour\" directive");
 1387|  2.14k|                        }
 1388|  2.15k|                    }
 1389|  2.34k|                    break;
 1390|  2.48k|                case ID_DIFFUSE:
  ------------------
  |  Branch (1390:17): [True: 2.48k, False: 22.6k]
  ------------------
 1391|  2.48k|                    if(prop->values.empty())
  ------------------
  |  Branch (1391:24): [True: 1, False: 2.48k]
  ------------------
 1392|      1|                    {
 1393|      1|                        compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line);
 1394|      1|                    }
 1395|  2.48k|                    else if(prop->values.size() > 4)
  ------------------
  |  Branch (1395:29): [True: 19, False: 2.46k]
  ------------------
 1396|     19|                    {
 1397|     19|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1398|     19|                                           "diffuse must have at most 4 arguments");
 1399|     19|                    }
 1400|  2.46k|                    else
 1401|  2.46k|                    {
 1402|  2.46k|                        if(prop->values.front()->type == ANT_ATOM &&
  ------------------
  |  Branch (1402:28): [True: 2.46k, False: 4]
  ------------------
 1403|  2.46k|                           ((AtomAbstractNode*)prop->values.front().get())->id == ID_VERTEXCOLOUR)
  ------------------
  |  Branch (1403:28): [True: 535, False: 1.92k]
  ------------------
 1404|    535|                        {
 1405|    535|                            mPass->setVertexColourTracking(mPass->getVertexColourTracking() | TVC_DIFFUSE);
 1406|    535|                        }
 1407|  1.93k|                        else
 1408|  1.93k|                        {
 1409|  1.93k|                            ColourValue val = ColourValue::White;
 1410|  1.93k|                            if(getColour(prop->values.begin(), prop->values.end(), &val))
  ------------------
  |  Branch (1410:32): [True: 1.79k, False: 134]
  ------------------
 1411|  1.79k|                                mPass->setDiffuse(val);
 1412|    134|                            else
 1413|    134|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1414|    134|                                                   "diffuse requires 3 or 4 colour arguments, or a \"vertexcolour\" directive");
 1415|  1.93k|                        }
 1416|  2.46k|                    }
 1417|  2.48k|                    break;
 1418|    637|                case ID_SPECULAR:
  ------------------
  |  Branch (1418:17): [True: 637, False: 24.5k]
  ------------------
 1419|    637|                    if(prop->values.empty())
  ------------------
  |  Branch (1419:24): [True: 1, False: 636]
  ------------------
 1420|      1|                    {
 1421|      1|                        compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line);
 1422|      1|                    }
 1423|    636|                    else if(prop->values.size() > 5)
  ------------------
  |  Branch (1423:29): [True: 16, False: 620]
  ------------------
 1424|     16|                    {
 1425|     16|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1426|     16|                                           "specular must have at most 5 arguments");
 1427|     16|                    }
 1428|    620|                    else
 1429|    620|                    {
 1430|    620|                        if(prop->values.front()->type == ANT_ATOM &&
  ------------------
  |  Branch (1430:28): [True: 619, False: 1]
  ------------------
 1431|    619|                           ((AtomAbstractNode*)prop->values.front().get())->id == ID_VERTEXCOLOUR)
  ------------------
  |  Branch (1431:28): [True: 1, False: 618]
  ------------------
 1432|      1|                        {
 1433|      1|                            mPass->setVertexColourTracking(mPass->getVertexColourTracking() | TVC_SPECULAR);
 1434|       |
 1435|      1|                            if(prop->values.size() >= 2)
  ------------------
  |  Branch (1435:32): [True: 0, False: 1]
  ------------------
 1436|      0|                            {
 1437|      0|                                Real val = 0;
 1438|      0|                                if(getReal(prop->values.back(), &val))
  ------------------
  |  Branch (1438:36): [True: 0, False: 0]
  ------------------
 1439|      0|                                    mPass->setShininess(val);
 1440|      0|                                else
 1441|      0|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1442|      0|                                                       "specular does not support \"" + prop->values.back()->getValue() + "\" as its second argument");
 1443|      0|                            }
 1444|      1|                        }
 1445|    619|                        else
 1446|    619|                        {
 1447|    619|                            if(prop->values.size() < 4)
  ------------------
  |  Branch (1447:32): [True: 16, False: 603]
  ------------------
 1448|     16|                            {
 1449|     16|                                compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 1450|     16|                                                   "specular expects at least 4 arguments");
 1451|     16|                            }
 1452|    603|                            else
 1453|    603|                            {
 1454|    603|                                ColourValue val;
 1455|    603|                                if(getColour(prop->values.begin(), prop->values.end(), &val))
  ------------------
  |  Branch (1455:36): [True: 587, False: 16]
  ------------------
 1456|    587|                                {
 1457|    587|                                    if(prop->values.size() == 4)
  ------------------
  |  Branch (1457:40): [True: 343, False: 244]
  ------------------
 1458|    343|                                    {
 1459|    343|                                        mPass->setShininess(val.a);
 1460|    343|                                        val.a = 1.0f;
 1461|    343|                                        mPass->setSpecular(val);
 1462|    343|                                    }
 1463|    244|                                    else
 1464|    244|                                    {
 1465|    244|                                        mPass->setSpecular(val);
 1466|       |
 1467|    244|                                        Real shininess;
 1468|    244|                                        if(getReal(*getNodeAt(prop->values, 4), &shininess))
  ------------------
  |  Branch (1468:44): [True: 236, False: 8]
  ------------------
 1469|    236|                                            mPass->setShininess(shininess);
 1470|      8|                                        else
 1471|      8|                                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1472|      8|                                                               "specular fourth argument must be a valid number for shininess attribute");
 1473|    244|                                    }
 1474|    587|                                }
 1475|     16|                                else
 1476|     16|                                {
 1477|     16|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1478|     16|                                                       "specular must have first 3 arguments be a valid colour");
 1479|     16|                                }
 1480|    603|                            }
 1481|       |
 1482|    619|                        }
 1483|    620|                    }
 1484|    637|                    break;
 1485|    249|                case ID_EMISSIVE:
  ------------------
  |  Branch (1485:17): [True: 249, False: 24.9k]
  ------------------
 1486|    249|                    if(prop->values.empty())
  ------------------
  |  Branch (1486:24): [True: 0, False: 249]
  ------------------
 1487|      0|                    {
 1488|      0|                        compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line);
 1489|      0|                    }
 1490|    249|                    else if(prop->values.size() > 4)
  ------------------
  |  Branch (1490:29): [True: 6, False: 243]
  ------------------
 1491|      6|                    {
 1492|      6|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1493|      6|                                           "emissive must have at most 4 arguments");
 1494|      6|                    }
 1495|    243|                    else
 1496|    243|                    {
 1497|    243|                        if(prop->values.front()->type == ANT_ATOM &&
  ------------------
  |  Branch (1497:28): [True: 243, False: 0]
  ------------------
 1498|    243|                           ((AtomAbstractNode*)prop->values.front().get())->id == ID_VERTEXCOLOUR)
  ------------------
  |  Branch (1498:28): [True: 45, False: 198]
  ------------------
 1499|     45|                        {
 1500|     45|                            mPass->setVertexColourTracking(mPass->getVertexColourTracking() | TVC_EMISSIVE);
 1501|     45|                        }
 1502|    198|                        else
 1503|    198|                        {
 1504|    198|                            ColourValue val(0.0f, 0.0f, 0.0f, 1.0f);
 1505|    198|                            if(getColour(prop->values.begin(), prop->values.end(), &val))
  ------------------
  |  Branch (1505:32): [True: 175, False: 23]
  ------------------
 1506|    175|                                mPass->setSelfIllumination(val);
 1507|     23|                            else
 1508|     23|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1509|     23|                                                   "emissive requires 3 or 4 colour arguments, or a \"vertexcolour\" directive");
 1510|    198|                        }
 1511|    243|                    }
 1512|    249|                    break;
 1513|  3.03k|                case ID_SCENE_BLEND:
  ------------------
  |  Branch (1513:17): [True: 3.03k, False: 22.1k]
  ------------------
 1514|  3.03k|                    if(prop->values.empty())
  ------------------
  |  Branch (1514:24): [True: 2, False: 3.03k]
  ------------------
 1515|      2|                    {
 1516|      2|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 1517|      2|                    }
 1518|  3.03k|                    else if(prop->values.size() > 2)
  ------------------
  |  Branch (1518:29): [True: 23, False: 3.00k]
  ------------------
 1519|     23|                    {
 1520|     23|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1521|     23|                                           "scene_blend supports at most 2 arguments");
 1522|     23|                    }
 1523|  3.00k|                    else if(prop->values.size() == 1)
  ------------------
  |  Branch (1523:29): [True: 2.97k, False: 32]
  ------------------
 1524|  2.97k|                    {
 1525|  2.97k|                        SceneBlendType enval;
 1526|  2.97k|                        if(getValue(prop->values.front(), enval))
  ------------------
  |  Branch (1526:28): [True: 2.87k, False: 104]
  ------------------
 1527|  2.87k|                        {
 1528|  2.87k|                            mPass->setSceneBlending(enval);
 1529|  2.87k|                        }
 1530|    104|                        else
 1531|    104|                        {
 1532|    104|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1533|    104|                                               "scene_blend does not support \"" + prop->values.front()->getValue() + "\" for argument 1");
 1534|    104|                        }
 1535|  2.97k|                    }
 1536|     32|                    else
 1537|     32|                    {
 1538|     32|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0), i1 = getNodeAt(prop->values, 1);
 1539|     32|                        SceneBlendFactor sbf0, sbf1;
 1540|     32|                        if(getSceneBlendFactor(*i0, &sbf0) && getSceneBlendFactor(*i1, &sbf1))
  ------------------
  |  Branch (1540:28): [True: 0, False: 32]
  |  Branch (1540:63): [True: 0, False: 0]
  ------------------
 1541|      0|                        {
 1542|      0|                            mPass->setSceneBlending(sbf0, sbf1);
 1543|      0|                        }
 1544|     32|                        else
 1545|     32|                        {
 1546|     32|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1547|     32|                                               "scene_blend does not support \"" + (*i0)->getValue() + "\" and \"" + (*i1)->getValue() + "\" as arguments");
 1548|     32|                        }
 1549|     32|                    }
 1550|  3.03k|                    break;
 1551|     16|                case ID_SEPARATE_SCENE_BLEND:
  ------------------
  |  Branch (1551:17): [True: 16, False: 25.1k]
  ------------------
 1552|     16|                    if(prop->values.empty())
  ------------------
  |  Branch (1552:24): [True: 0, False: 16]
  ------------------
 1553|      0|                    {
 1554|      0|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 1555|      0|                    }
 1556|     16|                    else if(prop->values.size() == 3)
  ------------------
  |  Branch (1556:29): [True: 3, False: 13]
  ------------------
 1557|      3|                    {
 1558|      3|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1559|      3|                                           "separate_scene_blend must have 2 or 4 arguments");
 1560|      3|                    }
 1561|     13|                    else if(prop->values.size() > 4)
  ------------------
  |  Branch (1561:29): [True: 5, False: 8]
  ------------------
 1562|      5|                    {
 1563|      5|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1564|      5|                                           "separate_scene_blend must have 2 or 4 arguments");
 1565|      5|                    }
 1566|      8|                    else if(prop->values.size() == 2)
  ------------------
  |  Branch (1566:29): [True: 3, False: 5]
  ------------------
 1567|      3|                    {
 1568|      3|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0), i1 = getNodeAt(prop->values, 1);
 1569|      3|                        SceneBlendType sbt0, sbt1;
 1570|      3|                        if (getValue(*i0, sbt0) && getValue(*i1, sbt1))
  ------------------
  |  Branch (1570:29): [True: 0, False: 3]
  |  Branch (1570:52): [True: 0, False: 0]
  ------------------
 1571|      0|                        {
 1572|      0|                            mPass->setSeparateSceneBlending(sbt0, sbt1);
 1573|      0|                        }
 1574|      3|                        else
 1575|      3|                        {
 1576|      3|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1577|      3|                                               "separate_scene_blend does not support \"" + (*i0)->getValue() + "\" as argument 1");
 1578|      3|                        }
 1579|      3|                    }
 1580|      5|                    else
 1581|      5|                    {
 1582|      5|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0), i1 = getNodeAt(prop->values, 1),
 1583|      5|                            i2 = getNodeAt(prop->values, 2), i3 = getNodeAt(prop->values, 3);
 1584|      5|                        if((*i0)->type == ANT_ATOM && (*i1)->type == ANT_ATOM && (*i2)->type == ANT_ATOM && (*i3)->type == ANT_ATOM)
  ------------------
  |  Branch (1584:28): [True: 5, False: 0]
  |  Branch (1584:55): [True: 5, False: 0]
  |  Branch (1584:82): [True: 5, False: 0]
  |  Branch (1584:109): [True: 5, False: 0]
  ------------------
 1585|      5|                        {
 1586|      5|                            SceneBlendFactor sbf0, sbf1, sbf2, sbf3;
 1587|      5|                            if(getSceneBlendFactor(*i0, &sbf0) && getSceneBlendFactor(*i1, &sbf1) && getSceneBlendFactor(*i2, &sbf2) &&
  ------------------
  |  Branch (1587:32): [True: 0, False: 5]
  |  Branch (1587:67): [True: 0, False: 0]
  |  Branch (1587:102): [True: 0, False: 0]
  ------------------
 1588|      0|                               getSceneBlendFactor(*i3, &sbf3))
  ------------------
  |  Branch (1588:32): [True: 0, False: 0]
  ------------------
 1589|      0|                            {
 1590|      0|                                mPass->setSeparateSceneBlending(sbf0, sbf1, sbf2, sbf3);
 1591|      0|                            }
 1592|      5|                            else
 1593|      5|                            {
 1594|      5|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1595|      5|                                                   "one of the arguments to separate_scene_blend is not a valid scene blend factor directive");
 1596|      5|                            }
 1597|      5|                        }
 1598|      0|                        else
 1599|      0|                        {
 1600|      0|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1601|      0|                                               "one of the arguments to separate_scene_blend is not a valid scene blend factor directive");
 1602|      0|                        }
 1603|      5|                    }
 1604|     16|                    break;
 1605|      6|                case ID_SCENE_BLEND_OP:
  ------------------
  |  Branch (1605:17): [True: 6, False: 25.1k]
  ------------------
 1606|      6|                    SceneBlendOperation sop;
 1607|      6|                    if(getValue(prop, compiler, sop))
  ------------------
  |  Branch (1607:24): [True: 0, False: 6]
  ------------------
 1608|      0|                        mPass->setSceneBlendingOperation(sop);
 1609|      6|                    break;
 1610|     13|                case ID_SEPARATE_SCENE_BLEND_OP:
  ------------------
  |  Branch (1610:17): [True: 13, False: 25.1k]
  ------------------
 1611|     13|                    if(prop->values.empty())
  ------------------
  |  Branch (1611:24): [True: 0, False: 13]
  ------------------
 1612|      0|                    {
 1613|      0|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 1614|      0|                    }
 1615|     13|                    else if(prop->values.size() != 2)
  ------------------
  |  Branch (1615:29): [True: 7, False: 6]
  ------------------
 1616|      7|                    {
 1617|      7|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1618|      7|                                           "separate_scene_blend_op must have 2 arguments");
 1619|      7|                    }
 1620|      6|                    else
 1621|      6|                    {
 1622|      6|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0), i1 = getNodeAt(prop->values, 1);
 1623|      6|                        SceneBlendOperation op, alphaOp;
 1624|      6|                        if(getValue(*i0, op) && getValue(*i1, alphaOp))
  ------------------
  |  Branch (1624:28): [True: 0, False: 6]
  |  Branch (1624:49): [True: 0, False: 0]
  ------------------
 1625|      0|                        {
 1626|      0|                            mPass->setSeparateSceneBlendingOperation(op, alphaOp);
 1627|      0|                        }
 1628|      6|                        else
 1629|      6|                        {
 1630|      6|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1631|      6|                                               prop->values.front()->getValue() + ": unrecognized argument");
 1632|      6|                        }
 1633|      6|                    }
 1634|     13|                    break;
 1635|    958|                case ID_DEPTH_CHECK:
  ------------------
  |  Branch (1635:17): [True: 958, False: 24.2k]
  ------------------
 1636|    958|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (1636:24): [True: 835, False: 123]
  ------------------
 1637|    835|                        mPass->setDepthCheckEnabled(bval);
 1638|    958|                    break;
 1639|  3.96k|                case ID_DEPTH_WRITE:
  ------------------
  |  Branch (1639:17): [True: 3.96k, False: 21.2k]
  ------------------
 1640|  3.96k|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (1640:24): [True: 3.71k, False: 247]
  ------------------
 1641|  3.71k|                        mPass->setDepthWriteEnabled(bval);
 1642|  3.96k|                    break;
 1643|    126|                case ID_DEPTH_BIAS:
  ------------------
  |  Branch (1643:17): [True: 126, False: 25.0k]
  ------------------
 1644|    126|                    if(prop->values.empty())
  ------------------
  |  Branch (1644:24): [True: 0, False: 126]
  ------------------
 1645|      0|                    {
 1646|      0|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 1647|      0|                    }
 1648|    126|                    else if(prop->values.size() > 2)
  ------------------
  |  Branch (1648:29): [True: 3, False: 123]
  ------------------
 1649|      3|                    {
 1650|      3|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1651|      3|                                           "depth_bias must have at most 2 arguments");
 1652|      3|                    }
 1653|    123|                    else
 1654|    123|                    {
 1655|    123|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0), i1 = getNodeAt(prop->values, 1);
 1656|    123|                        float val0, val1 = 0.0f;
 1657|    123|                        if(getFloat(*i0, &val0))
  ------------------
  |  Branch (1657:28): [True: 16, False: 107]
  ------------------
 1658|     16|                        {
 1659|     16|                            if(i1 != prop->values.end())
  ------------------
  |  Branch (1659:32): [True: 15, False: 1]
  ------------------
 1660|     15|                                getFloat(*i1, &val1);
 1661|     16|                            mPass->setDepthBias(val0, val1);
 1662|     16|                        }
 1663|    107|                        else
 1664|    107|                        {
 1665|    107|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1666|    107|                                               "depth_bias does not support \"" + (*i0)->getValue() + "\" for argument 1");
 1667|    107|                        }
 1668|    123|                    }
 1669|    126|                    break;
 1670|    128|                case ID_DEPTH_FUNC:
  ------------------
  |  Branch (1670:17): [True: 128, False: 25.0k]
  ------------------
 1671|    128|                    CompareFunction dfunc;
 1672|    128|                    if(getValue(prop, compiler, dfunc))
  ------------------
  |  Branch (1672:24): [True: 71, False: 57]
  ------------------
 1673|     71|                        mPass->setDepthFunction(dfunc);
 1674|    128|                    break;
 1675|     11|                case ID_ITERATION_DEPTH_BIAS:
  ------------------
  |  Branch (1675:17): [True: 11, False: 25.1k]
  ------------------
 1676|     11|                    if(getValue(prop, compiler, fval))
  ------------------
  |  Branch (1676:24): [True: 1, False: 10]
  ------------------
 1677|      1|                        mPass->setIterationDepthBias(fval);
 1678|     11|                    break;
 1679|    161|                case ID_ALPHA_REJECTION:
  ------------------
  |  Branch (1679:17): [True: 161, False: 25.0k]
  ------------------
 1680|    161|                    if(prop->values.empty())
  ------------------
  |  Branch (1680:24): [True: 0, False: 161]
  ------------------
 1681|      0|                    {
 1682|      0|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 1683|      0|                    }
 1684|    161|                    else if(prop->values.size() > 2)
  ------------------
  |  Branch (1684:29): [True: 10, False: 151]
  ------------------
 1685|     10|                    {
 1686|     10|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1687|     10|                                           "alpha_rejection must have at most 2 arguments");
 1688|     10|                    }
 1689|    151|                    else
 1690|    151|                    {
 1691|    151|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0), i1 = getNodeAt(prop->values, 1);
 1692|    151|                        CompareFunction func;
 1693|    151|                        if(getCompareFunction(*i0, &func))
  ------------------
  |  Branch (1693:28): [True: 142, False: 9]
  ------------------
 1694|    142|                        {
 1695|    142|                            if(i1 != prop->values.end())
  ------------------
  |  Branch (1695:32): [True: 139, False: 3]
  ------------------
 1696|    139|                            {
 1697|    139|                                uint32 val = 0;
 1698|    139|                                if(getUInt(*i1, &val))
  ------------------
  |  Branch (1698:36): [True: 119, False: 20]
  ------------------
 1699|    119|                                    mPass->setAlphaRejectSettings(func, static_cast<unsigned char>(val));
 1700|     20|                                else
 1701|     20|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1702|     20|                                                       (*i1)->getValue() + " is not a valid integer");
 1703|    139|                            }
 1704|      3|                            else
 1705|      3|                                mPass->setAlphaRejectFunction(func);
 1706|    142|                        }
 1707|      9|                        else
 1708|      9|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1709|      9|                                               (*i0)->getValue() + " is not a valid CompareFunction");
 1710|    151|                    }
 1711|    161|                    break;
 1712|      6|                case ID_ALPHA_TO_COVERAGE:
  ------------------
  |  Branch (1712:17): [True: 6, False: 25.1k]
  ------------------
 1713|      6|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (1713:24): [True: 0, False: 6]
  ------------------
 1714|      0|                        mPass->setAlphaToCoverageEnabled(bval);
 1715|      6|                    break;
 1716|      8|                case ID_LIGHT_SCISSOR:
  ------------------
  |  Branch (1716:17): [True: 8, False: 25.1k]
  ------------------
 1717|      8|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (1717:24): [True: 2, False: 6]
  ------------------
 1718|      2|                        mPass->setLightScissoringEnabled(bval);
 1719|      8|                    break;
 1720|      9|                case ID_LIGHT_CLIP_PLANES:
  ------------------
  |  Branch (1720:17): [True: 9, False: 25.1k]
  ------------------
 1721|      9|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (1721:24): [True: 0, False: 9]
  ------------------
 1722|      0|                        mPass->setLightClipPlanesEnabled(bval);
 1723|      9|                    break;
 1724|     11|                case ID_TRANSPARENT_SORTING:
  ------------------
  |  Branch (1724:17): [True: 11, False: 25.1k]
  ------------------
 1725|     11|                    if(prop->values.empty())
  ------------------
  |  Branch (1725:24): [True: 0, False: 11]
  ------------------
 1726|      0|                    {
 1727|      0|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 1728|      0|                    }
 1729|     11|                    else if(prop->values.size() > 1)
  ------------------
  |  Branch (1729:29): [True: 6, False: 5]
  ------------------
 1730|      6|                    {
 1731|      6|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1732|      6|                                           "transparent_sorting must have at most 1 argument");
 1733|      6|                    }
 1734|      5|                    else
 1735|      5|                    {
 1736|      5|                        bool val = true;
 1737|      5|                        if(getBoolean(prop->values.front(), &val))
  ------------------
  |  Branch (1737:28): [True: 0, False: 5]
  ------------------
 1738|      0|                        {
 1739|      0|                            mPass->setTransparentSortingEnabled(val);
 1740|      0|                            mPass->setTransparentSortingForced(false);
 1741|      0|                        }
 1742|      5|                        else
 1743|      5|                        {
 1744|      5|                            String val2;
 1745|      5|                            if (prop->values.front()->getString()=="force")
  ------------------
  |  Branch (1745:33): [True: 0, False: 5]
  ------------------
 1746|      0|                            {
 1747|      0|                                mPass->setTransparentSortingEnabled(true);
 1748|      0|                                mPass->setTransparentSortingForced(true);
 1749|      0|                            }
 1750|      5|                            else
 1751|      5|                            {
 1752|      5|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1753|      5|                                                   prop->values.front()->getValue() + " must be boolean or force");
 1754|      5|                            }
 1755|      5|                        }
 1756|      5|                    }
 1757|     11|                    break;
 1758|     28|                case ID_ILLUMINATION_STAGE:
  ------------------
  |  Branch (1758:17): [True: 28, False: 25.1k]
  ------------------
 1759|     28|                    IlluminationStage is;
 1760|     28|                    if(getValue(prop, compiler, is))
  ------------------
  |  Branch (1760:24): [True: 4, False: 24]
  ------------------
 1761|      4|                        mPass->setIlluminationStage(is);
 1762|     28|                    break;
 1763|  2.20k|                case ID_CULL_HARDWARE:
  ------------------
  |  Branch (1763:17): [True: 2.20k, False: 22.9k]
  ------------------
 1764|  2.20k|                    CullingMode cmode;
 1765|  2.20k|                    if(getValue(prop, compiler, cmode))
  ------------------
  |  Branch (1765:24): [True: 2.10k, False: 97]
  ------------------
 1766|  2.10k|                        mPass->setCullingMode(cmode);
 1767|  2.20k|                    break;
 1768|     61|                case ID_CULL_SOFTWARE:
  ------------------
  |  Branch (1768:17): [True: 61, False: 25.1k]
  ------------------
 1769|     61|                    ManualCullingMode mmode;
 1770|     61|                    if(getValue(prop, compiler, mmode))
  ------------------
  |  Branch (1770:24): [True: 38, False: 23]
  ------------------
 1771|     38|                        mPass->setManualCullingMode(mmode);
 1772|     61|                    compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, prop->file, prop->line,
 1773|     61|                                       prop->name + ". Only used by the BSP scene manager.");
 1774|     61|                    break;
 1775|  4.60k|                case ID_LIGHTING:
  ------------------
  |  Branch (1775:17): [True: 4.60k, False: 20.5k]
  ------------------
 1776|  4.60k|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (1776:24): [True: 4.53k, False: 67]
  ------------------
 1777|  4.53k|                        mPass->setLightingEnabled(bval);
 1778|  4.60k|                    break;
 1779|     40|                case ID_SHADING:
  ------------------
  |  Branch (1779:17): [True: 40, False: 25.1k]
  ------------------
 1780|     40|                    ShadeOptions smode;
 1781|     40|                    if(getValue(prop, compiler, smode))
  ------------------
  |  Branch (1781:24): [True: 0, False: 40]
  ------------------
 1782|      0|                        mPass->setShadingMode(smode);
 1783|     40|                    break;
 1784|     30|                case ID_POLYGON_MODE:
  ------------------
  |  Branch (1784:17): [True: 30, False: 25.1k]
  ------------------
 1785|     30|                    PolygonMode pmode;
 1786|     30|                    if(getValue(prop, compiler, pmode))
  ------------------
  |  Branch (1786:24): [True: 7, False: 23]
  ------------------
 1787|      7|                        mPass->setPolygonMode(pmode);
 1788|     30|                    break;
 1789|    114|                case ID_POLYGON_MODE_OVERRIDEABLE:
  ------------------
  |  Branch (1789:17): [True: 114, False: 25.0k]
  ------------------
 1790|    114|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (1790:24): [True: 107, False: 7]
  ------------------
 1791|    107|                        mPass->setPolygonModeOverrideable(bval);
 1792|    114|                    break;
 1793|    111|                case ID_FOG_OVERRIDE:
  ------------------
  |  Branch (1793:17): [True: 111, False: 25.0k]
  ------------------
 1794|    111|                    if(prop->values.empty())
  ------------------
  |  Branch (1794:24): [True: 2, False: 109]
  ------------------
 1795|      2|                    {
 1796|      2|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 1797|      2|                    }
 1798|    109|                    else if(prop->values.size() > 8)
  ------------------
  |  Branch (1798:29): [True: 4, False: 105]
  ------------------
 1799|      4|                    {
 1800|      4|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1801|      4|                                           "fog_override must have at most 8 arguments");
 1802|      4|                    }
 1803|    105|                    else
 1804|    105|                    {
 1805|    105|                        AbstractNodeList::const_iterator i1 = getNodeAt(prop->values, 1), i2 = getNodeAt(prop->values, 2);
 1806|    105|                        bool val = false;
 1807|    105|                        if(getBoolean(prop->values.front(), &val))
  ------------------
  |  Branch (1807:28): [True: 84, False: 21]
  ------------------
 1808|     84|                        {
 1809|     84|                            FogMode mode = FOG_NONE;
 1810|     84|                            ColourValue clr = ColourValue::White;
 1811|     84|                            Real dens = 0.001, start = 0.0f, end = 1.0f;
 1812|       |
 1813|     84|                            if(i1 != prop->values.end())
  ------------------
  |  Branch (1813:32): [True: 78, False: 6]
  ------------------
 1814|     78|                            {
 1815|     78|                                if((*i1)->type == ANT_ATOM)
  ------------------
  |  Branch (1815:36): [True: 77, False: 1]
  ------------------
 1816|     77|                                {
 1817|     77|                                    AtomAbstractNode *atom = (AtomAbstractNode*)(*i1).get();
 1818|     77|                                    switch(atom->id)
 1819|     77|                                    {
 1820|     53|                                    case ID_NONE:
  ------------------
  |  Branch (1820:37): [True: 53, False: 24]
  ------------------
 1821|     53|                                        mode = FOG_NONE;
 1822|     53|                                        break;
 1823|      0|                                    case ID_LINEAR:
  ------------------
  |  Branch (1823:37): [True: 0, False: 77]
  ------------------
 1824|      0|                                        mode = FOG_LINEAR;
 1825|      0|                                        break;
 1826|      0|                                    case ID_EXP:
  ------------------
  |  Branch (1826:37): [True: 0, False: 77]
  ------------------
 1827|      0|                                        mode = FOG_EXP;
 1828|      0|                                        break;
 1829|      0|                                    case ID_EXP2:
  ------------------
  |  Branch (1829:37): [True: 0, False: 77]
  ------------------
 1830|      0|                                        mode = FOG_EXP2;
 1831|      0|                                        break;
 1832|     24|                                    default:
  ------------------
  |  Branch (1832:37): [True: 24, False: 53]
  ------------------
 1833|     24|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1834|     24|                                                           (*i1)->getValue() + " is not a valid FogMode");
 1835|     24|                                        break;
 1836|     77|                                    }
 1837|     77|                                }
 1838|      1|                                else
 1839|      1|                                {
 1840|      1|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1841|      1|                                                       (*i1)->getValue() + " is not a valid FogMode");
 1842|      1|                                    break;
 1843|      1|                                }
 1844|     78|                            }
 1845|       |
 1846|     83|                            if(i2 != prop->values.end())
  ------------------
  |  Branch (1846:32): [True: 15, False: 68]
  ------------------
 1847|     15|                            {
 1848|     15|                                if(!getColour(i2, prop->values.end(), &clr, 3))
  ------------------
  |  Branch (1848:36): [True: 9, False: 6]
  ------------------
 1849|      9|                                {
 1850|      9|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1851|      9|                                                       (*i2)->getValue() + " is not a valid colour");
 1852|      9|                                    break;
 1853|      9|                                }
 1854|       |
 1855|      6|                                i2 = getNodeAt(prop->values, 5);
 1856|      6|                            }
 1857|       |
 1858|     74|                            if(i2 != prop->values.end())
  ------------------
  |  Branch (1858:32): [True: 5, False: 69]
  ------------------
 1859|      5|                            {
 1860|      5|                                if(!getReal(*i2, &dens))
  ------------------
  |  Branch (1860:36): [True: 2, False: 3]
  ------------------
 1861|      2|                                {
 1862|      2|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1863|      2|                                                       (*i2)->getValue() + " is not a valid number");
 1864|      2|                                    break;
 1865|      2|                                }
 1866|      3|                                ++i2;
 1867|      3|                            }
 1868|       |
 1869|     72|                            if(i2 != prop->values.end())
  ------------------
  |  Branch (1869:32): [True: 3, False: 69]
  ------------------
 1870|      3|                            {
 1871|      3|                                if(!getReal(*i2, &start))
  ------------------
  |  Branch (1871:36): [True: 1, False: 2]
  ------------------
 1872|      1|                                {
 1873|      1|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1874|      1|                                                       (*i2)->getValue() + " is not a valid number");
 1875|      1|                                    return;
 1876|      1|                                }
 1877|      2|                                ++i2;
 1878|      2|                            }
 1879|       |
 1880|     71|                            if(i2 != prop->values.end())
  ------------------
  |  Branch (1880:32): [True: 2, False: 69]
  ------------------
 1881|      2|                            {
 1882|      2|                                if(!getReal(*i2, &end))
  ------------------
  |  Branch (1882:36): [True: 1, False: 1]
  ------------------
 1883|      1|                                {
 1884|      1|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1885|      1|                                                       (*i2)->getValue() + " is not a valid number");
 1886|      1|                                    return;
 1887|      1|                                }
 1888|      1|                                ++i2;
 1889|      1|                            }
 1890|       |
 1891|     70|                            mPass->setFog(val, mode, clr, dens, start, end);
 1892|     70|                        }
 1893|     21|                        else
 1894|     21|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1895|     21|                                               prop->values.front()->getValue() + " is not a valid boolean");
 1896|    105|                    }
 1897|     97|                    break;
 1898|     97|                case ID_COLOUR_WRITE:
  ------------------
  |  Branch (1898:17): [True: 17, False: 25.1k]
  ------------------
 1899|     17|                    if(prop->values.empty())
  ------------------
  |  Branch (1899:24): [True: 0, False: 17]
  ------------------
 1900|      0|                    {
 1901|      0|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 1902|      0|                    }
 1903|     17|                    else if(prop->values.size() == 1)
  ------------------
  |  Branch (1903:29): [True: 3, False: 14]
  ------------------
 1904|      3|                    {
 1905|      3|                        if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (1905:28): [True: 0, False: 3]
  ------------------
 1906|      0|                            mPass->setColourWriteEnabled(bval);
 1907|      3|                    }
 1908|     14|                    else if(prop->values.size() != 4)
  ------------------
  |  Branch (1908:29): [True: 12, False: 2]
  ------------------
 1909|     12|                    {
 1910|     12|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 1911|     12|                                           "colour_write must have exactly 1 or 4 arguments");
 1912|     12|                    }
 1913|      2|                    else
 1914|      2|                    {
 1915|      2|                        bool colourMask[] = {false ,false ,false, false};
 1916|       |
 1917|      2|                        uint8 channelIndex = 0;
 1918|      2|                        for(const AbstractNodePtr& abstractNode : prop->values)
  ------------------
  |  Branch (1918:65): [True: 2, False: 0]
  ------------------
 1919|      2|                        {
 1920|      2|                            if(!getBoolean(abstractNode, &colourMask[channelIndex++]))
  ------------------
  |  Branch (1920:32): [True: 2, False: 0]
  ------------------
 1921|      2|                            {
 1922|      2|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1923|      2|                                                   abstractNode->getValue() + " is not a valid boolean");
 1924|      2|                                break;
 1925|      2|                            }
 1926|      2|                        }
 1927|       |
 1928|      2|                        mPass->setColourWriteEnabled(colourMask[0], colourMask[1], colourMask[2], colourMask[3]);
 1929|      2|                    }
 1930|     17|                    break;
 1931|    154|                case ID_MAX_LIGHTS:
  ------------------
  |  Branch (1931:17): [True: 154, False: 25.0k]
  ------------------
 1932|    154|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (1932:24): [True: 146, False: 8]
  ------------------
 1933|    146|                        mPass->setMaxSimultaneousLights(Math::uint16Cast(uival));
 1934|    154|                    break;
 1935|     21|                case ID_START_LIGHT:
  ------------------
  |  Branch (1935:17): [True: 21, False: 25.1k]
  ------------------
 1936|     21|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (1936:24): [True: 3, False: 18]
  ------------------
 1937|      3|                        mPass->setStartLight(static_cast<uint16>(uival));
 1938|     21|                    break;
 1939|      0|                case ID_LIGHT_MASK:
  ------------------
  |  Branch (1939:17): [True: 0, False: 25.1k]
  ------------------
 1940|      0|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (1940:24): [True: 0, False: 0]
  ------------------
 1941|      0|                        mPass->setLightMask(static_cast<uint16>(uival));
 1942|      0|                    break;
 1943|    230|                case ID_ITERATION:
  ------------------
  |  Branch (1943:17): [True: 230, False: 24.9k]
  ------------------
 1944|    230|                    if(prop->values.empty())
  ------------------
  |  Branch (1944:24): [True: 0, False: 230]
  ------------------
 1945|      0|                    {
 1946|      0|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 1947|      0|                    }
 1948|    230|                    else
 1949|    230|                    {
 1950|    230|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0);
 1951|    230|                        if((*i0)->type == ANT_ATOM)
  ------------------
  |  Branch (1951:28): [True: 221, False: 9]
  ------------------
 1952|    221|                        {
 1953|    221|                            AtomAbstractNode *atom = (AtomAbstractNode*)(*i0).get();
 1954|    221|                            if(atom->id == ID_ONCE)
  ------------------
  |  Branch (1954:32): [True: 17, False: 204]
  ------------------
 1955|     17|                            {
 1956|     17|                                mPass->setIteratePerLight(false);
 1957|     17|                            }
 1958|    204|                            else if(atom->id == ID_ONCE_PER_LIGHT)
  ------------------
  |  Branch (1958:37): [True: 144, False: 60]
  ------------------
 1959|    144|                            {
 1960|    144|                                AbstractNodeList::const_iterator i1 = getNodeAt(prop->values, 1);
 1961|    144|                                if(i1 != prop->values.end() && (*i1)->type == ANT_ATOM)
  ------------------
  |  Branch (1961:36): [True: 6, False: 138]
  |  Branch (1961:36): [True: 6, False: 138]
  |  Branch (1961:64): [True: 6, False: 0]
  ------------------
 1962|      6|                                {
 1963|      6|                                    atom = (AtomAbstractNode*)(*i1).get();
 1964|      6|                                    switch(atom->id)
 1965|      6|                                    {
 1966|      2|                                    case ID_POINT:
  ------------------
  |  Branch (1966:37): [True: 2, False: 4]
  ------------------
 1967|      2|                                        mPass->setIteratePerLight(true);
 1968|      2|                                        break;
 1969|      0|                                    case ID_DIRECTIONAL:
  ------------------
  |  Branch (1969:37): [True: 0, False: 6]
  ------------------
 1970|      0|                                        mPass->setIteratePerLight(true, true, Light::LT_DIRECTIONAL);
 1971|      0|                                        break;
 1972|      0|                                    case ID_SPOT:
  ------------------
  |  Branch (1972:37): [True: 0, False: 6]
  ------------------
 1973|      0|                                        mPass->setIteratePerLight(true, true, Light::LT_SPOTLIGHT);
 1974|      0|                                        break;
 1975|      4|                                    default:
  ------------------
  |  Branch (1975:37): [True: 4, False: 2]
  ------------------
 1976|      4|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 1977|      4|                                                           prop->values.front()->getValue() + " is not a valid light type (point, directional, or spot)");
 1978|      6|                                    }
 1979|      6|                                }
 1980|    138|                                else
 1981|    138|                                {
 1982|    138|                                    mPass->setIteratePerLight(true, false);
 1983|    138|                                }
 1984|       |
 1985|    144|                            }
 1986|     60|                            else if(getValue(*i0, uival))
  ------------------
  |  Branch (1986:37): [True: 53, False: 7]
  ------------------
 1987|     53|                            {
 1988|     53|                                mPass->setPassIterationCount(uival);
 1989|       |
 1990|     53|                                AbstractNodeList::const_iterator i1 = getNodeAt(prop->values, 1);
 1991|     53|                                if(i1 != prop->values.end() && (*i1)->type == ANT_ATOM)
  ------------------
  |  Branch (1991:36): [True: 51, False: 2]
  |  Branch (1991:36): [True: 50, False: 3]
  |  Branch (1991:64): [True: 50, False: 1]
  ------------------
 1992|     50|                                {
 1993|     50|                                    atom = (AtomAbstractNode*)(*i1).get();
 1994|     50|                                    if(atom->id == ID_PER_LIGHT)
  ------------------
  |  Branch (1994:40): [True: 0, False: 50]
  ------------------
 1995|      0|                                    {
 1996|      0|                                        AbstractNodeList::const_iterator i2 = getNodeAt(prop->values, 2);
 1997|      0|                                        if(i2 != prop->values.end() && (*i2)->type == ANT_ATOM)
  ------------------
  |  Branch (1997:44): [True: 0, False: 0]
  |  Branch (1997:44): [True: 0, False: 0]
  |  Branch (1997:72): [True: 0, False: 0]
  ------------------
 1998|      0|                                        {
 1999|      0|                                            atom = (AtomAbstractNode*)(*i2).get();
 2000|      0|                                            switch(atom->id)
 2001|      0|                                            {
 2002|      0|                                            case ID_POINT:
  ------------------
  |  Branch (2002:45): [True: 0, False: 0]
  ------------------
 2003|      0|                                                mPass->setIteratePerLight(true);
 2004|      0|                                                break;
 2005|      0|                                            case ID_DIRECTIONAL:
  ------------------
  |  Branch (2005:45): [True: 0, False: 0]
  ------------------
 2006|      0|                                                mPass->setIteratePerLight(true, true, Light::LT_DIRECTIONAL);
 2007|      0|                                                break;
 2008|      0|                                            case ID_SPOT:
  ------------------
  |  Branch (2008:45): [True: 0, False: 0]
  ------------------
 2009|      0|                                                mPass->setIteratePerLight(true, true, Light::LT_SPOTLIGHT);
 2010|      0|                                                break;
 2011|      0|                                            default:
  ------------------
  |  Branch (2011:45): [True: 0, False: 0]
  ------------------
 2012|      0|                                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2013|      0|                                                                   (*i2)->getValue() + " is not a valid light type (point, directional, or spot)");
 2014|      0|                                            }
 2015|      0|                                        }
 2016|      0|                                        else
 2017|      0|                                        {
 2018|      0|                                            mPass->setIteratePerLight(true, false);
 2019|      0|                                        }
 2020|      0|                                    }
 2021|     50|                                    else if(atom->id == ID_PER_N_LIGHTS)
  ------------------
  |  Branch (2021:45): [True: 48, False: 2]
  ------------------
 2022|     48|                                    {
 2023|     48|                                        AbstractNodeList::const_iterator i2 = getNodeAt(prop->values, 2);
 2024|     48|                                        if(i2 != prop->values.end() && (*i2)->type == ANT_ATOM)
  ------------------
  |  Branch (2024:44): [True: 47, False: 1]
  |  Branch (2024:44): [True: 46, False: 2]
  |  Branch (2024:72): [True: 46, False: 1]
  ------------------
 2025|     46|                                        {
 2026|     46|                                            if(getValue(*i2, uival))
  ------------------
  |  Branch (2026:48): [True: 45, False: 1]
  ------------------
 2027|     45|                                            {
 2028|     45|                                                mPass->setLightCountPerIteration(static_cast<unsigned short>(uival));
 2029|       |
 2030|     45|                                                AbstractNodeList::const_iterator i3 = getNodeAt(prop->values, 3);
 2031|     45|                                                if(i3 != prop->values.end() && (*i3)->type == ANT_ATOM)
  ------------------
  |  Branch (2031:52): [True: 44, False: 1]
  |  Branch (2031:52): [True: 44, False: 1]
  |  Branch (2031:80): [True: 44, False: 0]
  ------------------
 2032|     44|                                                {
 2033|     44|                                                    atom = (AtomAbstractNode*)(*i3).get();
 2034|     44|                                                    switch(atom->id)
 2035|     44|                                                    {
 2036|     16|                                                    case ID_POINT:
  ------------------
  |  Branch (2036:53): [True: 16, False: 28]
  ------------------
 2037|     16|                                                        mPass->setIteratePerLight(true);
 2038|     16|                                                        break;
 2039|      0|                                                    case ID_DIRECTIONAL:
  ------------------
  |  Branch (2039:53): [True: 0, False: 44]
  ------------------
 2040|      0|                                                        mPass->setIteratePerLight(true, true, Light::LT_DIRECTIONAL);
 2041|      0|                                                        break;
 2042|      0|                                                    case ID_SPOT:
  ------------------
  |  Branch (2042:53): [True: 0, False: 44]
  ------------------
 2043|      0|                                                        mPass->setIteratePerLight(true, true, Light::LT_SPOTLIGHT);
 2044|      0|                                                        break;
 2045|     28|                                                    default:
  ------------------
  |  Branch (2045:53): [True: 28, False: 16]
  ------------------
 2046|     28|                                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2047|     28|                                                                           (*i3)->getValue() + " is not a valid light type (point, directional, or spot)");
 2048|     44|                                                    }
 2049|     44|                                                }
 2050|      1|                                                else
 2051|      1|                                                {
 2052|      1|                                                    mPass->setIteratePerLight(true, false);
 2053|      1|                                                }
 2054|     45|                                            }
 2055|      1|                                            else
 2056|      1|                                            {
 2057|      1|                                                compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 2058|      1|                                                                   (*i2)->getValue() + " is not a valid number");
 2059|      1|                                            }
 2060|     46|                                        }
 2061|      2|                                        else
 2062|      2|                                        {
 2063|      2|                                            compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 2064|      2|                                                               prop->values.front()->getValue() + " is not a valid number");
 2065|      2|                                        }
 2066|     48|                                    }
 2067|     50|                                }
 2068|     53|                            }
 2069|      7|                            else
 2070|      7|                            {
 2071|      7|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 2072|      7|                            }
 2073|    221|                        }
 2074|      9|                        else
 2075|      9|                        {
 2076|      9|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 2077|      9|                        }
 2078|    230|                    }
 2079|    230|                    break;
 2080|    230|                case ID_LINE_WIDTH:
  ------------------
  |  Branch (2080:17): [True: 0, False: 25.1k]
  ------------------
 2081|      0|                    if(getValue(prop, compiler, fval))
  ------------------
  |  Branch (2081:24): [True: 0, False: 0]
  ------------------
 2082|      0|                        mPass->setLineWidth(fval);
 2083|      0|                    break;
 2084|    105|                case ID_POINT_SIZE:
  ------------------
  |  Branch (2084:17): [True: 105, False: 25.0k]
  ------------------
 2085|    105|                    if(getValue(prop, compiler, fval))
  ------------------
  |  Branch (2085:24): [True: 90, False: 15]
  ------------------
 2086|     90|                        mPass->setPointSize(fval);
 2087|    105|                    break;
 2088|     96|                case ID_POINT_SPRITES:
  ------------------
  |  Branch (2088:17): [True: 96, False: 25.0k]
  ------------------
 2089|     96|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (2089:24): [True: 90, False: 6]
  ------------------
 2090|     90|                        mPass->setPointSpritesEnabled(bval);
 2091|     96|                    break;
 2092|    112|                case ID_POINT_SIZE_ATTENUATION:
  ------------------
  |  Branch (2092:17): [True: 112, False: 25.0k]
  ------------------
 2093|    112|                    if(prop->values.empty())
  ------------------
  |  Branch (2093:24): [True: 2, False: 110]
  ------------------
 2094|      2|                    {
 2095|      2|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 2096|      2|                    }
 2097|    110|                    else if(prop->values.size() > 4)
  ------------------
  |  Branch (2097:29): [True: 1, False: 109]
  ------------------
 2098|      1|                    {
 2099|      1|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 2100|      1|                                           "point_size_attenuation must have at most 4 arguments");
 2101|      1|                    }
 2102|    109|                    else
 2103|    109|                    {
 2104|    109|                        bool val = false;
 2105|    109|                        if(getBoolean(prop->values.front(), &val))
  ------------------
  |  Branch (2105:28): [True: 92, False: 17]
  ------------------
 2106|     92|                        {
 2107|     92|                            if(val)
  ------------------
  |  Branch (2107:32): [True: 92, False: 0]
  ------------------
 2108|     92|                            {
 2109|     92|                                if (prop->values.size() > 1)
  ------------------
  |  Branch (2109:37): [True: 5, False: 87]
  ------------------
 2110|      5|                                {
 2111|      5|                                    std::vector<float> data;
 2112|      5|                                    if(prop->values.size() != 4 || !getVector(++prop->values.begin(), prop->values.end(), data, 3))
  ------------------
  |  Branch (2112:40): [True: 2, False: 3]
  |  Branch (2112:40): [True: 3, False: 2]
  |  Branch (2112:68): [True: 1, False: 2]
  ------------------
 2113|      3|                                    {
 2114|      3|                                        compiler->addError(*prop);
 2115|      3|                                        return;
 2116|      3|                                    }
 2117|      2|                                    mPass->setPointAttenuation(true, data[0], data[1], data[2]);
 2118|      2|                                }
 2119|     87|                                else
 2120|     87|                                {
 2121|     87|                                    mPass->setPointAttenuation(true);
 2122|     87|                                }
 2123|     92|                            }
 2124|      0|                            else
 2125|      0|                            {
 2126|      0|                                mPass->setPointAttenuation(false);
 2127|      0|                            }
 2128|     92|                        }
 2129|     17|                        else
 2130|     17|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2131|     17|                                               prop->values.front()->getValue() + " is not a valid boolean");
 2132|    109|                    }
 2133|    109|                    break;
 2134|    109|                case ID_POINT_SIZE_MIN:
  ------------------
  |  Branch (2134:17): [True: 11, False: 25.1k]
  ------------------
 2135|     11|                    if(getValue(prop, compiler, fval))
  ------------------
  |  Branch (2135:24): [True: 1, False: 10]
  ------------------
 2136|      1|                        mPass->setPointMinSize(fval);
 2137|     11|                    break;
 2138|      3|                case ID_POINT_SIZE_MAX:
  ------------------
  |  Branch (2138:17): [True: 3, False: 25.1k]
  ------------------
 2139|      3|                    if(getValue(prop, compiler, fval))
  ------------------
  |  Branch (2139:24): [True: 1, False: 2]
  ------------------
 2140|      1|                        mPass->setPointMaxSize(fval);
 2141|      3|                    break;
 2142|  3.06k|                default:
  ------------------
  |  Branch (2142:17): [True: 3.06k, False: 22.1k]
  ------------------
 2143|  3.06k|                    compiler->addError(ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line,
 2144|  3.06k|                                       "token \"" + prop->name + "\" is not recognized");
 2145|  25.1k|                }
 2146|  25.1k|            }
 2147|  21.3k|            else if(i->type == ANT_OBJECT)
  ------------------
  |  Branch (2147:21): [True: 20.3k, False: 1.01k]
  ------------------
 2148|  20.3k|            {
 2149|  20.3k|                ObjectAbstractNode *child = static_cast<ObjectAbstractNode*>(i.get());
 2150|  20.3k|                switch(child->id)
 2151|  20.3k|                {
 2152|    885|                case ID_FRAGMENT_PROGRAM_REF:
  ------------------
  |  Branch (2152:17): [True: 885, False: 19.4k]
  ------------------
 2153|  1.67k|                case ID_VERTEX_PROGRAM_REF:
  ------------------
  |  Branch (2153:17): [True: 785, False: 19.5k]
  ------------------
 2154|  1.74k|                case ID_GEOMETRY_PROGRAM_REF:
  ------------------
  |  Branch (2154:17): [True: 75, False: 20.3k]
  ------------------
 2155|  3.49k|                case ID_TESSELLATION_HULL_PROGRAM_REF:
  ------------------
  |  Branch (2155:17): [True: 1.75k, False: 18.6k]
  ------------------
 2156|  4.47k|                case ID_TESSELLATION_DOMAIN_PROGRAM_REF:
  ------------------
  |  Branch (2156:17): [True: 977, False: 19.4k]
  ------------------
 2157|  4.49k|                case ID_COMPUTE_PROGRAM_REF:
  ------------------
  |  Branch (2157:17): [True: 18, False: 20.3k]
  ------------------
 2158|  4.49k|                case ID_MESH_PROGRAM_REF:
  ------------------
  |  Branch (2158:17): [True: 0, False: 20.3k]
  ------------------
 2159|  4.49k|                case ID_TASK_PROGRAM_REF:
  ------------------
  |  Branch (2159:17): [True: 0, False: 20.3k]
  ------------------
 2160|  4.49k|                    translateProgramRef(getProgramType(child->id), compiler, child);
 2161|  4.49k|                    break;
 2162|      3|                case ID_SHADOW_CASTER_VERTEX_PROGRAM_REF:
  ------------------
  |  Branch (2162:17): [True: 3, False: 20.3k]
  ------------------
 2163|      3|                    translateShadowCasterProgramRef(GPT_VERTEX_PROGRAM, compiler, child);
 2164|      3|                    break;
 2165|     12|                case ID_SHADOW_CASTER_FRAGMENT_PROGRAM_REF:
  ------------------
  |  Branch (2165:17): [True: 12, False: 20.3k]
  ------------------
 2166|     12|                    translateShadowCasterProgramRef(GPT_FRAGMENT_PROGRAM, compiler, child);
 2167|     12|                    break;
 2168|      6|                case ID_SHADOW_RECEIVER_VERTEX_PROGRAM_REF:
  ------------------
  |  Branch (2168:17): [True: 6, False: 20.3k]
  ------------------
 2169|      6|                    translateShadowReceiverProgramRef(GPT_VERTEX_PROGRAM, compiler, child);
 2170|      6|                    break;
 2171|      3|                case ID_SHADOW_RECEIVER_FRAGMENT_PROGRAM_REF:
  ------------------
  |  Branch (2171:17): [True: 3, False: 20.3k]
  ------------------
 2172|      3|                    translateShadowReceiverProgramRef(GPT_FRAGMENT_PROGRAM, compiler, child);
 2173|      3|                    break;
 2174|  15.3k|                default:
  ------------------
  |  Branch (2174:17): [True: 15.3k, False: 5.02k]
  ------------------
 2175|  15.3k|                    processNode(compiler, i);
 2176|  15.3k|                    break;
 2177|    243|                case ID_FRAGMENT_PROGRAM:
  ------------------
  |  Branch (2177:17): [True: 243, False: 20.1k]
  ------------------
 2178|    387|                case ID_VERTEX_PROGRAM:
  ------------------
  |  Branch (2178:17): [True: 144, False: 20.2k]
  ------------------
 2179|    417|                case ID_GEOMETRY_PROGRAM:
  ------------------
  |  Branch (2179:17): [True: 30, False: 20.3k]
  ------------------
 2180|    453|                case ID_TESSELLATION_HULL_PROGRAM:
  ------------------
  |  Branch (2180:17): [True: 36, False: 20.3k]
  ------------------
 2181|    493|                case ID_TESSELLATION_DOMAIN_PROGRAM:
  ------------------
  |  Branch (2181:17): [True: 40, False: 20.3k]
  ------------------
 2182|    500|                case ID_COMPUTE_PROGRAM:
  ------------------
  |  Branch (2182:17): [True: 7, False: 20.3k]
  ------------------
 2183|    506|                case ID_MESH_PROGRAM:
  ------------------
  |  Branch (2183:17): [True: 6, False: 20.3k]
  ------------------
 2184|    506|                case ID_TASK_PROGRAM:
  ------------------
  |  Branch (2184:17): [True: 0, False: 20.3k]
  ------------------
 2185|    506|                {
 2186|       |                    // auto assign inline defined programs
 2187|    506|                    processNode(compiler, i);
 2188|    506|                    GpuProgramType type = getProgramType(child->id);
 2189|    506|                    mPass->setGpuProgram(type, GpuProgramUsage::_getProgramByName(child->name, mPass->getResourceGroup(), type));
 2190|    506|                }
 2191|  20.3k|                }
 2192|  20.3k|            }
 2193|  46.5k|        }
 2194|  12.1k|    }
_ZN4Ogre14PassTranslator19translateProgramRefENS_14GpuProgramTypeEPNS_14ScriptCompilerEPNS_18ObjectAbstractNodeE:
 2222|  4.49k|    {
 2223|  4.49k|        auto program = getProgram(compiler, node);
 2224|  4.49k|        if(!program) return;
  ------------------
  |  Branch (2224:12): [True: 1.71k, False: 2.78k]
  ------------------
 2225|  2.78k|        auto pass = any_cast<Pass*>(node->parent->context);
 2226|       |
 2227|  2.78k|        pass->setGpuProgram(type, program);
 2228|  2.78k|        if(program->isSupported())
  ------------------
  |  Branch (2228:12): [True: 0, False: 2.78k]
  ------------------
 2229|      0|        {
 2230|      0|            GpuProgramParametersSharedPtr params = pass->getGpuProgramParameters(type);
 2231|      0|            GpuProgramTranslator::translateProgramParameters(compiler, params, node);
 2232|      0|        }
 2233|  2.78k|    }
_ZN4Ogre14PassTranslator31translateShadowCasterProgramRefENS_14GpuProgramTypeEPNS_14ScriptCompilerEPNS_18ObjectAbstractNodeE:
 2236|     15|    {
 2237|     15|        auto program = getProgram(compiler, node);
 2238|     15|        if(!program) return;
  ------------------
  |  Branch (2238:12): [True: 15, False: 0]
  ------------------
 2239|      0|        auto pass = any_cast<Pass*>(node->parent->context);
 2240|       |
 2241|      0|        compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, node->file, node->line,
 2242|      0|                           node->cls + ". Use shadow_caster_material instead");
 2243|       |
 2244|      0|        auto caster_mat = pass->getParent()->getShadowCasterMaterial();
 2245|      0|        if(!caster_mat)
  ------------------
  |  Branch (2245:12): [True: 0, False: 0]
  ------------------
 2246|      0|        {
 2247|      0|            auto src_mat = pass->getParent()->getParent();
 2248|       |            // only first pass of this will be used. The caster material is technique specific.
 2249|      0|            caster_mat = src_mat->clone(
 2250|      0|                StringUtil::format("%s/%p/CasterFallback", src_mat->getName().c_str(), pass->getParent()));
 2251|      0|            pass->getParent()->setShadowCasterMaterial(caster_mat);
 2252|      0|        }
 2253|      0|        auto caster_pass = caster_mat->getTechnique(0)->getPass(0);
 2254|       |
 2255|      0|        caster_pass->setGpuProgram(type, program);
 2256|      0|        if(program->isSupported())
  ------------------
  |  Branch (2256:12): [True: 0, False: 0]
  ------------------
 2257|      0|        {
 2258|      0|            GpuProgramParametersSharedPtr params = caster_pass->getGpuProgramParameters(type);
 2259|      0|            GpuProgramTranslator::translateProgramParameters(compiler, params, node);
 2260|      0|        }
 2261|      0|    }
_ZN4Ogre14PassTranslator33translateShadowReceiverProgramRefENS_14GpuProgramTypeEPNS_14ScriptCompilerEPNS_18ObjectAbstractNodeE:
 2264|      9|    {
 2265|      9|        auto program = getProgram(compiler, node);
 2266|      9|        if(!program) return;
  ------------------
  |  Branch (2266:12): [True: 9, False: 0]
  ------------------
 2267|      0|        auto pass = any_cast<Pass*>(node->parent->context);
 2268|       |
 2269|      0|        compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, node->file, node->line,
 2270|      0|                           node->cls + ". Use shadow_receiver_material instead");
 2271|       |
 2272|      0|        auto receiver_mat = pass->getParent()->getShadowReceiverMaterial();
 2273|      0|        if(!receiver_mat)
  ------------------
  |  Branch (2273:12): [True: 0, False: 0]
  ------------------
 2274|      0|        {
 2275|      0|            auto src_mat = pass->getParent()->getParent();
 2276|       |            // only first pass of this will be used
 2277|      0|            receiver_mat = src_mat->clone(src_mat->getName()+"/ReceiverFallback");
 2278|      0|            pass->getParent()->setShadowReceiverMaterial(receiver_mat);
 2279|      0|        }
 2280|      0|        auto receiver_pass = receiver_mat->getTechnique(0)->getPass(0);
 2281|       |
 2282|      0|        receiver_pass->setGpuProgram(type, program);
 2283|      0|        if(program->isSupported())
  ------------------
  |  Branch (2283:12): [True: 0, False: 0]
  ------------------
 2284|      0|        {
 2285|      0|            GpuProgramParametersSharedPtr params = receiver_pass->getGpuProgramParameters(type);
 2286|      0|            GpuProgramTranslator::translateProgramParameters(compiler, params, node);
 2287|      0|        }
 2288|      0|    }
_ZN4Ogre21TextureUnitTranslatorC2Ev:
 2293|      1|        :mUnit(0)
 2294|      1|    {
 2295|      1|    }
_ZN4Ogre17SamplerTranslator21translateSamplerParamEPNS_14ScriptCompilerERKNSt3__110shared_ptrINS_7SamplerEEEPNS_20PropertyAbstractNodeE:
 2298|  6.62k|    {
 2299|  6.62k|        bool bval;
 2300|  6.62k|        Real fval;
 2301|  6.62k|        uint32 uival;
 2302|       |
 2303|  6.62k|        switch(prop->id)
  ------------------
  |  Branch (2303:16): [True: 6.62k, False: 0]
  ------------------
 2304|  6.62k|        {
 2305|  3.84k|        case ID_TEX_ADDRESS_MODE:
  ------------------
  |  Branch (2305:9): [True: 3.84k, False: 2.78k]
  ------------------
 2306|  3.84k|            {
 2307|  3.84k|                if(prop->values.empty())
  ------------------
  |  Branch (2307:20): [True: 1, False: 3.84k]
  ------------------
 2308|      1|                {
 2309|      1|                    compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 2310|      1|                }
 2311|  3.84k|                else
 2312|  3.84k|                {
 2313|  3.84k|                    AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0),
 2314|  3.84k|                        i1 = getNodeAt(prop->values, 1),
 2315|  3.84k|                        i2 = getNodeAt(prop->values, 2);
 2316|  3.84k|                    Sampler::UVWAddressingMode mode;
 2317|       |
 2318|  3.84k|                    if(!getValue(*i0, mode.u))
  ------------------
  |  Branch (2318:24): [True: 85, False: 3.75k]
  ------------------
 2319|     85|                    {
 2320|     85|                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2321|     85|                                           (*i0)->getValue() + " not supported as first argument (must be \"wrap\", \"clamp\", \"mirror\", or \"border\")");
 2322|     85|                        return;
 2323|     85|                    }
 2324|  3.75k|                    mode.v = mode.u;
 2325|  3.75k|                    mode.w = mode.u;
 2326|       |
 2327|  3.75k|                    if(i1 != prop->values.end())
  ------------------
  |  Branch (2327:24): [True: 22, False: 3.73k]
  ------------------
 2328|     22|                    {
 2329|     22|                        if(!getValue(*i1, mode.v))
  ------------------
  |  Branch (2329:28): [True: 22, False: 0]
  ------------------
 2330|     22|                        {
 2331|     22|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2332|     22|                                               (*i1)->getValue() + " not supported as second argument (must be \"wrap\", \"clamp\", \"mirror\", or \"border\")");
 2333|     22|                        }
 2334|     22|                    }
 2335|       |
 2336|  3.75k|                    if(i2 != prop->values.end())
  ------------------
  |  Branch (2336:24): [True: 19, False: 3.73k]
  ------------------
 2337|     19|                    {
 2338|     19|                        if(!getValue(*i2, mode.w))
  ------------------
  |  Branch (2338:28): [True: 18, False: 1]
  ------------------
 2339|     18|                        {
 2340|     18|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2341|     18|                                               (*i2)->getValue() + " not supported as third argument (must be \"wrap\", \"clamp\", \"mirror\", or \"border\")");
 2342|     18|                        }
 2343|     19|                    }
 2344|       |
 2345|  3.75k|                    sampler->setAddressingMode(mode);
 2346|  3.75k|                }
 2347|  3.84k|            }
 2348|  3.75k|            break;
 2349|  3.75k|        case ID_TEX_BORDER_COLOUR:
  ------------------
  |  Branch (2349:9): [True: 68, False: 6.56k]
  ------------------
 2350|     68|            if(prop->values.empty())
  ------------------
  |  Branch (2350:16): [True: 0, False: 68]
  ------------------
 2351|      0|            {
 2352|      0|                compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line);
 2353|      0|            }
 2354|     68|            else
 2355|     68|            {
 2356|     68|                ColourValue val;
 2357|     68|                if(getColour(prop->values.begin(), prop->values.end(), &val))
  ------------------
  |  Branch (2357:20): [True: 22, False: 46]
  ------------------
 2358|     22|                    sampler->setBorderColour(val);
 2359|     46|                else
 2360|     46|                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2361|     46|                                       "tex_border_colour only accepts a colour argument");
 2362|     68|            }
 2363|     68|            break;
 2364|  2.55k|        case ID_FILTERING:
  ------------------
  |  Branch (2364:9): [True: 2.55k, False: 4.07k]
  ------------------
 2365|  2.55k|            if(prop->values.empty())
  ------------------
  |  Branch (2365:16): [True: 0, False: 2.55k]
  ------------------
 2366|      0|            {
 2367|      0|                compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 2368|      0|            }
 2369|  2.55k|            else if(prop->values.size() == 1)
  ------------------
  |  Branch (2369:21): [True: 2.19k, False: 356]
  ------------------
 2370|  2.19k|            {
 2371|  2.19k|                if(prop->values.front()->type == ANT_ATOM)
  ------------------
  |  Branch (2371:20): [True: 2.18k, False: 10]
  ------------------
 2372|  2.18k|                {
 2373|  2.18k|                    AtomAbstractNode *atom = (AtomAbstractNode*)prop->values.front().get();
 2374|  2.18k|                    switch(atom->id)
 2375|  2.18k|                    {
 2376|  1.83k|                    case ID_NONE:
  ------------------
  |  Branch (2376:21): [True: 1.83k, False: 351]
  ------------------
 2377|  1.83k|                        sampler->setFiltering(TFO_NONE);
 2378|  1.83k|                        break;
 2379|     19|                    case ID_BILINEAR:
  ------------------
  |  Branch (2379:21): [True: 19, False: 2.17k]
  ------------------
 2380|     19|                        sampler->setFiltering(TFO_BILINEAR);
 2381|     19|                        break;
 2382|    198|                    case ID_TRILINEAR:
  ------------------
  |  Branch (2382:21): [True: 198, False: 1.99k]
  ------------------
 2383|    198|                        sampler->setFiltering(TFO_TRILINEAR);
 2384|    198|                        break;
 2385|      5|                    case ID_ANISOTROPIC:
  ------------------
  |  Branch (2385:21): [True: 5, False: 2.18k]
  ------------------
 2386|      5|                        sampler->setFiltering(TFO_ANISOTROPIC);
 2387|      5|                        break;
 2388|    129|                    default:
  ------------------
  |  Branch (2388:21): [True: 129, False: 2.06k]
  ------------------
 2389|    129|                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2390|    129|                                           prop->values.front()->getValue() + " not supported as first argument (must be \"none\", \"bilinear\", \"trilinear\", or \"anisotropic\")");
 2391|  2.18k|                    }
 2392|  2.18k|                }
 2393|     10|                else
 2394|     10|                {
 2395|     10|                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2396|     10|                                       prop->values.front()->getValue() + " not supported as first argument (must be \"none\", \"bilinear\", \"trilinear\", or \"anisotropic\")");
 2397|     10|                }
 2398|  2.19k|            }
 2399|    356|            else if(prop->values.size() == 3)
  ------------------
  |  Branch (2399:21): [True: 343, False: 13]
  ------------------
 2400|    343|            {
 2401|    343|                AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0),
 2402|    343|                    i1 = getNodeAt(prop->values, 1),
 2403|    343|                    i2 = getNodeAt(prop->values, 2);
 2404|    343|                FilterOptions tmin, tmax, tmip;
 2405|    343|                if (getValue(*i0, tmin) && getValue(*i1, tmax) && getValue(*i2, tmip))
  ------------------
  |  Branch (2405:21): [True: 315, False: 28]
  |  Branch (2405:44): [True: 303, False: 12]
  |  Branch (2405:67): [True: 295, False: 8]
  ------------------
 2406|    295|                {
 2407|    295|                    sampler->setFiltering(tmin, tmax, tmip);
 2408|    295|                }
 2409|     48|                else
 2410|     48|                {
 2411|     48|                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 2412|     48|                }
 2413|    343|            }
 2414|     13|            else
 2415|     13|            {
 2416|     13|                compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 2417|     13|                                   "filtering must have either 1 or 3 arguments");
 2418|     13|            }
 2419|  2.55k|            break;
 2420|  2.55k|        case ID_CMPTEST:
  ------------------
  |  Branch (2420:9): [True: 117, False: 6.51k]
  ------------------
 2421|    117|            if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (2421:16): [True: 4, False: 113]
  ------------------
 2422|      4|                sampler->setCompareEnabled(bval);
 2423|    117|            break;
 2424|      0|        case ID_CMPFUNC:
  ------------------
  |  Branch (2424:9): [True: 0, False: 6.62k]
  ------------------
 2425|      0|            compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, prop->file,
 2426|      0|                prop->line,
 2427|      0|                "compare_func. Use comp_func.");
 2428|      0|            OGRE_FALLTHROUGH;
 2429|     23|        case ID_COMP_FUNC:
  ------------------
  |  Branch (2429:9): [True: 23, False: 6.60k]
  ------------------
 2430|     23|            CompareFunction func;
 2431|     23|            if(getValue(prop, compiler, func))
  ------------------
  |  Branch (2431:16): [True: 4, False: 19]
  ------------------
 2432|      4|                sampler->setCompareFunction(func);
 2433|     23|            break;
 2434|     13|        case ID_MAX_ANISOTROPY:
  ------------------
  |  Branch (2434:9): [True: 13, False: 6.61k]
  ------------------
 2435|     13|            if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (2435:16): [True: 7, False: 6]
  ------------------
 2436|      7|                sampler->setAnisotropy(uival);
 2437|     13|            break;
 2438|     10|        case ID_MIPMAP_BIAS:
  ------------------
  |  Branch (2438:9): [True: 10, False: 6.61k]
  ------------------
 2439|     10|            if(getValue(prop, compiler, fval))
  ------------------
  |  Branch (2439:16): [True: 2, False: 8]
  ------------------
 2440|      2|                sampler->setMipmapBias(fval);
 2441|     10|            break;
 2442|  6.62k|        }
 2443|  6.62k|    }
_ZN4Ogre17SamplerTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 2445|    185|    {
 2446|    185|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 2447|       |
 2448|    185|        if(obj->name.empty())
  ------------------
  |  Branch (2448:12): [True: 53, False: 132]
  ------------------
 2449|     53|        {
 2450|     53|            compiler->addError(ScriptCompiler::CE_OBJECTNAMEEXPECTED, obj->file, obj->line);
 2451|     53|            return;
 2452|     53|        }
 2453|       |
 2454|    132|        SamplerPtr sampler = TextureManager::getSingleton().createSampler(obj->name);
 2455|       |
 2456|       |        // Set the properties for the material
 2457|    132|        for(auto & i : obj->children)
  ------------------
  |  Branch (2457:22): [True: 304, False: 132]
  ------------------
 2458|    304|        {
 2459|    304|            if(i->type == ANT_PROPERTY)
  ------------------
  |  Branch (2459:16): [True: 242, False: 62]
  ------------------
 2460|    242|            {
 2461|    242|                PropertyAbstractNode *prop = static_cast<PropertyAbstractNode*>(i.get());
 2462|    242|                switch(prop->id)
 2463|    242|                {
 2464|      8|                case ID_TEX_ADDRESS_MODE:
  ------------------
  |  Branch (2464:17): [True: 8, False: 234]
  ------------------
 2465|     15|                case ID_TEX_BORDER_COLOUR:
  ------------------
  |  Branch (2465:17): [True: 7, False: 235]
  ------------------
 2466|     41|                case ID_FILTERING:
  ------------------
  |  Branch (2466:17): [True: 26, False: 216]
  ------------------
 2467|    155|                case ID_CMPTEST:
  ------------------
  |  Branch (2467:17): [True: 114, False: 128]
  ------------------
 2468|    159|                case ID_COMP_FUNC:
  ------------------
  |  Branch (2468:17): [True: 4, False: 238]
  ------------------
 2469|    165|                case ID_MAX_ANISOTROPY:
  ------------------
  |  Branch (2469:17): [True: 6, False: 236]
  ------------------
 2470|    166|                case ID_MIPMAP_BIAS:
  ------------------
  |  Branch (2470:17): [True: 1, False: 241]
  ------------------
 2471|    166|                    translateSamplerParam(compiler, sampler, prop);
 2472|    166|                    break;
 2473|     76|                default:
  ------------------
  |  Branch (2473:17): [True: 76, False: 166]
  ------------------
 2474|     76|                    compiler->addError(ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line,
 2475|     76|                                       "token \"" + prop->name + "\" is not recognized");
 2476|    242|                }
 2477|    242|            }
 2478|     62|            else if(i->type == ANT_OBJECT)
  ------------------
  |  Branch (2478:21): [True: 42, False: 20]
  ------------------
 2479|     42|            {
 2480|     42|                processNode(compiler, i);
 2481|     42|            }
 2482|    304|        }
 2483|    132|    }
_ZN4Ogre21TextureUnitTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 2486|  12.6k|    {
 2487|  12.6k|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 2488|       |
 2489|  12.6k|        Pass *pass = any_cast<Pass*>(obj->parent->context);
 2490|  12.6k|        mUnit = pass->createTextureUnitState();
 2491|  12.6k|        obj->context = mUnit;
 2492|       |
 2493|       |        // Get the name of the technique
 2494|  12.6k|        if(!obj->name.empty())
  ------------------
  |  Branch (2494:12): [True: 2.34k, False: 10.2k]
  ------------------
 2495|  2.34k|            mUnit->setName(obj->name);
 2496|       |
 2497|  12.6k|        Real fval;
 2498|  12.6k|        uint32 uival;
 2499|  12.6k|        String sval;
 2500|       |
 2501|       |        // Set the properties for the material
 2502|  12.6k|        for(auto & i : obj->children)
  ------------------
  |  Branch (2502:22): [True: 29.5k, False: 12.6k]
  ------------------
 2503|  29.5k|        {
 2504|  29.5k|            if(i->type == ANT_PROPERTY)
  ------------------
  |  Branch (2504:16): [True: 27.1k, False: 2.38k]
  ------------------
 2505|  27.1k|            {
 2506|  27.1k|                PropertyAbstractNode *prop = static_cast<PropertyAbstractNode*>(i.get());
 2507|  27.1k|                switch(prop->id)
 2508|  27.1k|                {
 2509|  3.83k|                case ID_TEX_ADDRESS_MODE:
  ------------------
  |  Branch (2509:17): [True: 3.83k, False: 23.3k]
  ------------------
 2510|  3.89k|                case ID_TEX_BORDER_COLOUR:
  ------------------
  |  Branch (2510:17): [True: 61, False: 27.1k]
  ------------------
 2511|  6.42k|                case ID_FILTERING:
  ------------------
  |  Branch (2511:17): [True: 2.52k, False: 24.6k]
  ------------------
 2512|  6.42k|                case ID_CMPTEST:
  ------------------
  |  Branch (2512:17): [True: 3, False: 27.1k]
  ------------------
 2513|  6.42k|                case ID_CMPFUNC:
  ------------------
  |  Branch (2513:17): [True: 0, False: 27.1k]
  ------------------
 2514|  6.44k|                case ID_COMP_FUNC:
  ------------------
  |  Branch (2514:17): [True: 19, False: 27.1k]
  ------------------
 2515|  6.45k|                case ID_MAX_ANISOTROPY:
  ------------------
  |  Branch (2515:17): [True: 7, False: 27.1k]
  ------------------
 2516|  6.46k|                case ID_MIPMAP_BIAS:
  ------------------
  |  Branch (2516:17): [True: 9, False: 27.1k]
  ------------------
 2517|  6.46k|                    SamplerTranslator::translateSamplerParam(compiler, mUnit->_getLocalSampler(), prop);
 2518|  6.46k|                    break;
 2519|    317|                case ID_SAMPLER_REF:
  ------------------
  |  Branch (2519:17): [True: 317, False: 26.8k]
  ------------------
 2520|    317|                    if(getValue(prop, compiler, sval))
  ------------------
  |  Branch (2520:24): [True: 313, False: 4]
  ------------------
 2521|    313|                    {
 2522|    313|                        auto sampler = TextureManager::getSingleton().getSampler(sval);
 2523|    313|                        if(sampler)
  ------------------
  |  Branch (2523:28): [True: 292, False: 21]
  ------------------
 2524|    292|                            mUnit->setSampler(sampler);
 2525|     21|                        else
 2526|     21|                            compiler->addError(ScriptCompiler::CE_REFERENCETOANONEXISTINGOBJECT,
 2527|     21|                                               prop->file, prop->line, sval);
 2528|    313|                    }
 2529|    317|                    break;
 2530|     13|                case ID_UNORDERED_ACCESS_MIP:
  ------------------
  |  Branch (2530:17): [True: 13, False: 27.1k]
  ------------------
 2531|     13|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (2531:24): [True: 7, False: 6]
  ------------------
 2532|      7|                        mUnit->setUnorderedAccessMipLevel(uival);
 2533|     13|                    break;
 2534|      9|                case ID_TEXTURE_ALIAS:
  ------------------
  |  Branch (2534:17): [True: 9, False: 27.1k]
  ------------------
 2535|      9|                    compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, prop->file, prop->line,
 2536|      9|                        "texture_alias. Use 'texture $variable'");
 2537|      9|                    if(getValue(prop, compiler, sval))
  ------------------
  |  Branch (2537:24): [True: 3, False: 6]
  ------------------
 2538|      3|                        mUnit->setName(sval);
 2539|      9|                    break;
 2540|  9.83k|                case ID_TEXTURE:
  ------------------
  |  Branch (2540:17): [True: 9.83k, False: 17.3k]
  ------------------
 2541|  9.83k|                    if(prop->values.empty())
  ------------------
  |  Branch (2541:24): [True: 108, False: 9.72k]
  ------------------
 2542|    108|                    {
 2543|    108|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 2544|    108|                    }
 2545|  9.72k|                    else if(prop->values.size() > 5)
  ------------------
  |  Branch (2545:29): [True: 17, False: 9.71k]
  ------------------
 2546|     17|                    {
 2547|     17|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 2548|     17|                                           "texture must have at most 5 arguments");
 2549|     17|                    }
 2550|  9.71k|                    else
 2551|  9.71k|                    {
 2552|  9.71k|                        AbstractNodeList::const_iterator j = prop->values.begin();
 2553|  9.71k|                        String val;
 2554|  9.71k|                        if(getString(*j, &val))
  ------------------
  |  Branch (2554:28): [True: 9.65k, False: 52]
  ------------------
 2555|  9.65k|                        {
 2556|  9.65k|                            TextureType texType = TEX_TYPE_2D;
 2557|  9.65k|                            bool isAlpha = false;
 2558|  9.65k|                            bool sRGBRead = false;
 2559|  9.65k|                            PixelFormat format = PF_UNKNOWN;
 2560|  9.65k|                            int mipmaps = TextureManager::getSingleton().getDefaultNumMipmaps(); // MIP_DEFAULT
 2561|       |
 2562|  9.65k|                            ++j;
 2563|  11.7k|                            while(j != prop->values.end())
  ------------------
  |  Branch (2563:35): [True: 2.12k, False: 9.65k]
  ------------------
 2564|  2.12k|                            {
 2565|  2.12k|                                if((*j)->type == ANT_ATOM)
  ------------------
  |  Branch (2565:36): [True: 2.11k, False: 15]
  ------------------
 2566|  2.11k|                                {
 2567|  2.11k|                                    AtomAbstractNode *atom = (AtomAbstractNode*)(*j).get();
 2568|  2.11k|                                    switch(atom->id)
 2569|  2.11k|                                    {
 2570|     92|                                    case ID_1D:
  ------------------
  |  Branch (2570:37): [True: 92, False: 2.02k]
  ------------------
 2571|     92|                                        texType = TEX_TYPE_1D;
 2572|     92|                                        break;
 2573|      1|                                    case ID_2D:
  ------------------
  |  Branch (2573:37): [True: 1, False: 2.11k]
  ------------------
 2574|      1|                                        texType = TEX_TYPE_2D;
 2575|      1|                                        break;
 2576|      7|                                    case ID_3D:
  ------------------
  |  Branch (2576:37): [True: 7, False: 2.10k]
  ------------------
 2577|      7|                                        texType = TEX_TYPE_3D;
 2578|      7|                                        break;
 2579|  1.56k|                                    case ID_CUBIC:
  ------------------
  |  Branch (2579:37): [True: 1.56k, False: 548]
  ------------------
 2580|  1.56k|                                        texType = TEX_TYPE_CUBE_MAP;
 2581|  1.56k|                                        break;
 2582|      0|                                    case ID_2DARRAY:
  ------------------
  |  Branch (2582:37): [True: 0, False: 2.11k]
  ------------------
 2583|      0|                                        texType = TEX_TYPE_2D_ARRAY;
 2584|      0|                                        break;
 2585|      0|                                    case ID_UNLIMITED:
  ------------------
  |  Branch (2585:37): [True: 0, False: 2.11k]
  ------------------
 2586|      0|                                        mipmaps = MIP_UNLIMITED;
 2587|      0|                                        break;
 2588|      0|                                    case ID_ALPHA:
  ------------------
  |  Branch (2588:37): [True: 0, False: 2.11k]
  ------------------
 2589|      0|                                        isAlpha = true;
 2590|      0|                                        break;
 2591|     20|                                    case ID_GAMMA:
  ------------------
  |  Branch (2591:37): [True: 20, False: 2.09k]
  ------------------
 2592|     20|                                        sRGBRead = true;
 2593|     20|                                        break;
 2594|    428|                                    default:
  ------------------
  |  Branch (2594:37): [True: 428, False: 1.68k]
  ------------------
 2595|    428|                                        if(!StringConverter::parse(atom->value, mipmaps))
  ------------------
  |  Branch (2595:44): [True: 290, False: 138]
  ------------------
 2596|    290|                                        {
 2597|    290|                                            format = PixelUtil::getFormatFromName(atom->value, true);
 2598|       |
 2599|    290|                                            if (format == PF_UNKNOWN)
  ------------------
  |  Branch (2599:49): [True: 258, False: 32]
  ------------------
 2600|    258|                                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS,
 2601|    258|                                                                   prop->file, prop->line, atom->value);
 2602|    290|                                        }
 2603|  2.11k|                                    }
 2604|  2.11k|                                }
 2605|     15|                                else
 2606|     15|                                {
 2607|     15|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2608|     15|                                                       (*j)->getValue() + " is not a supported argument to the texture property");
 2609|     15|                                }
 2610|  2.12k|                                ++j;
 2611|  2.12k|                            }
 2612|       |
 2613|  9.65k|                            ProcessResourceNameScriptCompilerEvent evt(ProcessResourceNameScriptCompilerEvent::TEXTURE, val);
 2614|  9.65k|                            compiler->_fireEvent(&evt, 0);
 2615|       |
 2616|  9.65k|                            if(isAlpha)
  ------------------
  |  Branch (2616:32): [True: 0, False: 9.65k]
  ------------------
 2617|      0|                            {
 2618|       |                                // format = PF_A8; should only be done, if src is luminance, which we dont know here
 2619|      0|                                compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, prop->file,
 2620|      0|                                                   prop->line, "alpha. Use PF_A8 instead");
 2621|      0|                            }
 2622|       |
 2623|  9.65k|                            if(const auto& tex = TextureManager::getSingleton().getByName(evt.mName, mUnit->getParent()->getResourceGroup()))
  ------------------
  |  Branch (2623:44): [True: 2.81k, False: 6.84k]
  ------------------
 2624|  2.81k|                            {
 2625|       |                                // the texture is shared with another texture unit, report any discrepancies
 2626|  2.81k|                                if (tex->getDesiredFormat() != format || tex->getNumMipmaps() != uint(mipmaps) ||
  ------------------
  |  Branch (2626:37): [True: 3, False: 2.81k]
  |  Branch (2626:74): [True: 17, False: 2.79k]
  ------------------
 2627|  2.79k|                                    tex->isHardwareGammaEnabled() != sRGBRead || tex->getTextureType() != texType)
  ------------------
  |  Branch (2627:37): [True: 1, False: 2.79k]
  |  Branch (2627:82): [True: 30, False: 2.76k]
  ------------------
 2628|     51|                                {
 2629|     51|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2630|     51|                                                       "overriding previous declarations of texture '" + evt.mName +
 2631|     51|                                                           "' with different parameters");
 2632|     51|                                }
 2633|  2.81k|                            }
 2634|       |
 2635|  9.65k|                            mUnit->setTextureName(evt.mName, texType);
 2636|  9.65k|                            mUnit->setDesiredFormat(format);
 2637|  9.65k|                            OGRE_IGNORE_DEPRECATED_BEGIN
 2638|  9.65k|                            mUnit->setIsAlpha(isAlpha);
 2639|  9.65k|                            OGRE_IGNORE_DEPRECATED_END
 2640|  9.65k|                            mUnit->setNumMipmaps(mipmaps);
 2641|  9.65k|                            mUnit->setHardwareGammaEnabled(sRGBRead);
 2642|  9.65k|                        }
 2643|     52|                        else
 2644|     52|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2645|     52|                                               (*j)->getValue() + " is not a valid texture name");
 2646|  9.71k|                    }
 2647|  9.83k|                    break;
 2648|  9.83k|                case ID_ANIM_TEXTURE:
  ------------------
  |  Branch (2648:17): [True: 683, False: 26.4k]
  ------------------
 2649|    683|                    if(prop->values.size() < 3)
  ------------------
  |  Branch (2649:24): [True: 69, False: 614]
  ------------------
 2650|     69|                    {
 2651|     69|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 2652|     69|                    }
 2653|    614|                    else
 2654|    614|                    {
 2655|    614|                        AbstractNodeList::const_iterator i1 = getNodeAt(prop->values, 1);
 2656|    614|                        uint32 nframes = 0;
 2657|    614|                        if(getValue(*i1, nframes))
  ------------------
  |  Branch (2657:28): [True: 533, False: 81]
  ------------------
 2658|    533|                        {
 2659|       |                            // Short form
 2660|    533|                            AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0), i2 = getNodeAt(prop->values, 2);
 2661|    533|                            String val0;
 2662|    533|                            Real val2;
 2663|    533|                            if(getValue(*i0, val0) && getValue(*i2, val2))
  ------------------
  |  Branch (2663:32): [True: 533, False: 0]
  |  Branch (2663:55): [True: 522, False: 11]
  ------------------
 2664|    522|                            {
 2665|    522|                                ProcessResourceNameScriptCompilerEvent evt(ProcessResourceNameScriptCompilerEvent::TEXTURE, val0);
 2666|    522|                                compiler->_fireEvent(&evt, 0);
 2667|       |
 2668|    522|                                mUnit->setAnimatedTextureName(evt.mName, nframes, val2);
 2669|    522|                            }
 2670|     11|                            else
 2671|     11|                            {
 2672|     11|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2673|     11|                                                   "anim_texture short form requires a texture name, number of frames, and animation duration");
 2674|     11|                            }
 2675|    533|                        }
 2676|     81|                        else
 2677|     81|                        {
 2678|       |                            // Long form has n number of frames
 2679|     81|                            Real duration = 0;
 2680|     81|                            AbstractNodeList::const_iterator in = getNodeAt(prop->values, static_cast<int>(prop->values.size()) - 1);
 2681|     81|                            if(getReal(*in, &duration))
  ------------------
  |  Branch (2681:32): [True: 49, False: 32]
  ------------------
 2682|     49|                            {
 2683|     49|                                std::vector<String> names;
 2684|       |
 2685|     49|                                AbstractNodeList::iterator j = prop->values.begin();
 2686|    287|                                while(j != in)
  ------------------
  |  Branch (2686:39): [True: 238, False: 49]
  ------------------
 2687|    238|                                {
 2688|    238|                                    if((*j)->type == ANT_ATOM)
  ------------------
  |  Branch (2688:40): [True: 238, False: 0]
  ------------------
 2689|    238|                                    {
 2690|    238|                                        String name = ((AtomAbstractNode*)(*j).get())->value;
 2691|       |                                        // Run the name through the listener
 2692|    238|                                        if(compiler->getListener())
  ------------------
  |  Branch (2692:44): [True: 238, False: 0]
  ------------------
 2693|    238|                                        {
 2694|    238|                                            ProcessResourceNameScriptCompilerEvent evt(ProcessResourceNameScriptCompilerEvent::TEXTURE, name);
 2695|    238|                                            compiler->_fireEvent(&evt, 0);
 2696|    238|                                            names.push_back(evt.mName);
 2697|    238|                                        }
 2698|      0|                                        else
 2699|      0|                                        {
 2700|      0|                                            names.push_back(name);
 2701|      0|                                        }
 2702|    238|                                    }
 2703|      0|                                    else
 2704|      0|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2705|      0|                                                           (*j)->getValue() + " is not supported as a texture name");
 2706|    238|                                    ++j;
 2707|    238|                                }
 2708|       |
 2709|     49|                                mUnit->setAnimatedTextureName(names, duration);
 2710|     49|                            }
 2711|     32|                            else
 2712|     32|                            {
 2713|     32|                                compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 2714|     32|                                                   (*in)->getValue() + " is not supported for the duration argument");
 2715|     32|                            }
 2716|     81|                        }
 2717|    614|                    }
 2718|    683|                    break;
 2719|     10|                case ID_CUBIC_TEXTURE:
  ------------------
  |  Branch (2719:17): [True: 10, False: 27.1k]
  ------------------
 2720|     10|                    if(prop->values.empty())
  ------------------
  |  Branch (2720:24): [True: 0, False: 10]
  ------------------
 2721|      0|                    {
 2722|      0|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 2723|      0|                    }
 2724|     10|                    else if(prop->values.size() == 2)
  ------------------
  |  Branch (2724:29): [True: 7, False: 3]
  ------------------
 2725|      7|                    {
 2726|      7|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0),
 2727|      7|                            i1 = getNodeAt(prop->values, 1);
 2728|      7|                        if((*i0)->type == ANT_ATOM && (*i1)->type == ANT_ATOM)
  ------------------
  |  Branch (2728:28): [True: 7, False: 0]
  |  Branch (2728:55): [True: 7, False: 0]
  ------------------
 2729|      7|                        {
 2730|      7|                            AtomAbstractNode *atom0 = (AtomAbstractNode*)(*i0).get();
 2731|       |
 2732|      7|                            ProcessResourceNameScriptCompilerEvent evt(ProcessResourceNameScriptCompilerEvent::TEXTURE, atom0->value);
 2733|      7|                            compiler->_fireEvent(&evt, 0);
 2734|       |
 2735|      7|                            mUnit->setTextureName(evt.mName, TEX_TYPE_CUBE_MAP);
 2736|       |
 2737|      7|                            compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, prop->file, prop->line,
 2738|      7|                                                   "'cubic_texture ..'. Use 'texture .. cubic' instead.");
 2739|      7|                        }
 2740|      0|                        else
 2741|      0|                        {
 2742|      0|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 2743|      0|                        }
 2744|      7|                    }
 2745|      3|                    else if(prop->values.size() == 7)
  ------------------
  |  Branch (2745:29): [True: 0, False: 3]
  ------------------
 2746|      0|                    {
 2747|      0|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0),
 2748|      0|                            i1 = getNodeAt(prop->values, 1),
 2749|      0|                            i2 = getNodeAt(prop->values, 2),
 2750|      0|                            i3 = getNodeAt(prop->values, 3),
 2751|      0|                            i4 = getNodeAt(prop->values, 4),
 2752|      0|                            i5 = getNodeAt(prop->values, 5),
 2753|      0|                            i6 = getNodeAt(prop->values, 6);
 2754|      0|                        if((*i0)->type == ANT_ATOM && (*i1)->type == ANT_ATOM && (*i2)->type == ANT_ATOM && (*i3)->type == ANT_ATOM &&
  ------------------
  |  Branch (2754:28): [True: 0, False: 0]
  |  Branch (2754:55): [True: 0, False: 0]
  |  Branch (2754:82): [True: 0, False: 0]
  |  Branch (2754:109): [True: 0, False: 0]
  ------------------
 2755|      0|                           (*i4)->type == ANT_ATOM && (*i5)->type == ANT_ATOM && (*i6)->type == ANT_ATOM)
  ------------------
  |  Branch (2755:28): [True: 0, False: 0]
  |  Branch (2755:55): [True: 0, False: 0]
  |  Branch (2755:82): [True: 0, False: 0]
  ------------------
 2756|      0|                        {
 2757|      0|                            AtomAbstractNode *atom0 = (AtomAbstractNode*)(*i0).get(), *atom1 = (AtomAbstractNode*)(*i1).get(),
 2758|      0|                                *atom2 = (AtomAbstractNode*)(*i2).get(), *atom3 = (AtomAbstractNode*)(*i3).get(),
 2759|      0|                                *atom4 = (AtomAbstractNode*)(*i4).get(), *atom5 = (AtomAbstractNode*)(*i5).get(),
 2760|      0|                                *atom6 = (AtomAbstractNode*)(*i6).get();
 2761|      0|                            std::vector<String> names(6);
 2762|       |                            // backward compatible order
 2763|      0|                            names[4] = atom0->value;
 2764|      0|                            names[5] = atom1->value;
 2765|      0|                            names[1] = atom2->value;
 2766|      0|                            names[0] = atom3->value;
 2767|      0|                            names[2] = atom4->value;
 2768|      0|                            names[3] = atom5->value;
 2769|       |
 2770|      0|                            if(compiler->getListener())
  ------------------
  |  Branch (2770:32): [True: 0, False: 0]
  ------------------
 2771|      0|                            {
 2772|       |                                // Run each name through the listener
 2773|      0|                                for(int j = 0; j < 6; ++j)
  ------------------
  |  Branch (2773:48): [True: 0, False: 0]
  ------------------
 2774|      0|                                {
 2775|      0|                                    ProcessResourceNameScriptCompilerEvent evt(ProcessResourceNameScriptCompilerEvent::TEXTURE, names[j]);
 2776|      0|                                    compiler->_fireEvent(&evt, 0);
 2777|      0|                                    names[j] = evt.mName;
 2778|      0|                                }
 2779|      0|                            }
 2780|       |
 2781|      0|                            if(atom6->id != ID_COMBINED_UVW)
  ------------------
  |  Branch (2781:32): [True: 0, False: 0]
  ------------------
 2782|      0|                            {
 2783|      0|                                compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, prop->file, prop->line,
 2784|      0|                                                   "separateUV is no longer supported.");
 2785|      0|                            }
 2786|      0|                            mUnit->setLayerArrayNames(TEX_TYPE_CUBE_MAP, names);
 2787|      0|                        }
 2788|       |
 2789|      0|                    }
 2790|      3|                    else
 2791|      3|                    {
 2792|      3|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 2793|      3|                                           "cubic_texture must have at most 7 arguments");
 2794|      3|                    }
 2795|     10|                    break;
 2796|    206|                case ID_TEX_COORD_SET:
  ------------------
  |  Branch (2796:17): [True: 206, False: 26.9k]
  ------------------
 2797|    206|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (2797:24): [True: 194, False: 12]
  ------------------
 2798|    194|                        mUnit->setTextureCoordSet(uival);
 2799|    206|                    break;
 2800|       |
 2801|     72|                case ID_COLOUR_OP:
  ------------------
  |  Branch (2801:17): [True: 72, False: 27.1k]
  ------------------
 2802|     72|                    LayerBlendOperation cop;
 2803|     72|                    if(getValue(prop, compiler, cop))
  ------------------
  |  Branch (2803:24): [True: 41, False: 31]
  ------------------
 2804|     41|                        mUnit->setColourOperation(cop);
 2805|     72|                    break;
 2806|    632|                case ID_COLOUR_OP_EX:
  ------------------
  |  Branch (2806:17): [True: 632, False: 26.5k]
  ------------------
 2807|    632|                    if(prop->values.size() < 3)
  ------------------
  |  Branch (2807:24): [True: 8, False: 624]
  ------------------
 2808|      8|                    {
 2809|      8|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line,
 2810|      8|                                           "colour_op_ex must have at least 3 arguments");
 2811|      8|                    }
 2812|    624|                    else if(prop->values.size() > 10)
  ------------------
  |  Branch (2812:29): [True: 1, False: 623]
  ------------------
 2813|      1|                    {
 2814|      1|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 2815|      1|                                           "colour_op_ex must have at most 10 arguments");
 2816|      1|                    }
 2817|    623|                    else
 2818|    623|                    {
 2819|    623|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0),
 2820|    623|                            i1 = getNodeAt(prop->values, 1),
 2821|    623|                            i2 = getNodeAt(prop->values, 2);
 2822|    623|                        LayerBlendOperationEx op;
 2823|    623|                        LayerBlendSource source1, source2;
 2824|    623|                        if (getValue(*i0, op) && getValue(*i1, source1) && getValue(*i2, source2))
  ------------------
  |  Branch (2824:29): [True: 613, False: 10]
  |  Branch (2824:50): [True: 600, False: 13]
  |  Branch (2824:76): [True: 562, False: 38]
  ------------------
 2825|    562|                        {
 2826|    562|                            ColourValue arg1 = ColourValue::White, arg2 = ColourValue::White;
 2827|    562|                            Real manualBlend = 0.0f;
 2828|       |
 2829|    562|                            if(op == LBX_BLEND_MANUAL)
  ------------------
  |  Branch (2829:32): [True: 0, False: 562]
  ------------------
 2830|      0|                            {
 2831|      0|                                AbstractNodeList::const_iterator i3 = getNodeAt(prop->values, 3);
 2832|      0|                                if(i3 != prop->values.end())
  ------------------
  |  Branch (2832:36): [True: 0, False: 0]
  ------------------
 2833|      0|                                {
 2834|      0|                                    if(!getReal(*i3, &manualBlend))
  ------------------
  |  Branch (2834:40): [True: 0, False: 0]
  ------------------
 2835|      0|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2836|      0|                                                           (*i3)->getValue() + " is not a valid number argument");
 2837|      0|                                }
 2838|      0|                                else
 2839|      0|                                {
 2840|      0|                                    compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 2841|      0|                                                       "fourth argument expected when blend_manual is used");
 2842|      0|                                }
 2843|      0|                            }
 2844|       |
 2845|    562|                            AbstractNodeList::const_iterator j = getNodeAt(prop->values, 3);
 2846|    562|                            if(op == LBX_BLEND_MANUAL)
  ------------------
  |  Branch (2846:32): [True: 0, False: 562]
  ------------------
 2847|      0|                                ++j;
 2848|    562|                            if(source1 == LBS_MANUAL)
  ------------------
  |  Branch (2848:32): [True: 53, False: 509]
  ------------------
 2849|     53|                            {
 2850|     53|                                if(j != prop->values.end())
  ------------------
  |  Branch (2850:36): [True: 53, False: 0]
  ------------------
 2851|     53|                                {
 2852|     53|                                    if(!getColour(j, prop->values.end(), &arg1, 3))
  ------------------
  |  Branch (2852:40): [True: 4, False: 49]
  ------------------
 2853|      4|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2854|      4|                                                           "valid colour expected when src_manual is used");
 2855|     53|                                }
 2856|      0|                                else
 2857|      0|                                {
 2858|      0|                                    compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 2859|      0|                                                       "valid colour expected when src_manual is used");
 2860|      0|                                }
 2861|     53|                            }
 2862|    562|                            if(source2 == LBS_MANUAL)
  ------------------
  |  Branch (2862:32): [True: 152, False: 410]
  ------------------
 2863|    152|                            {
 2864|    152|                                if(j != prop->values.end())
  ------------------
  |  Branch (2864:36): [True: 151, False: 1]
  ------------------
 2865|    151|                                {
 2866|    151|                                    if(!getColour(j, prop->values.end(), &arg2, 3))
  ------------------
  |  Branch (2866:40): [True: 8, False: 143]
  ------------------
 2867|      8|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2868|      8|                                                           "valid colour expected when src_manual is used");
 2869|    151|                                }
 2870|      1|                                else
 2871|      1|                                {
 2872|      1|                                    compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 2873|      1|                                                       "valid colour expected when src_manual is used");
 2874|      1|                                }
 2875|    152|                            }
 2876|       |
 2877|    562|                            mUnit->setColourOperationEx(op, source1, source2, arg1, arg2, manualBlend);
 2878|    562|                        }
 2879|     61|                        else
 2880|     61|                        {
 2881|     61|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 2882|     61|                        }
 2883|    623|                    }
 2884|    632|                    break;
 2885|    404|                case ID_COLOUR_OP_MULTIPASS_FALLBACK:
  ------------------
  |  Branch (2885:17): [True: 404, False: 26.7k]
  ------------------
 2886|    404|                    if(prop->values.empty())
  ------------------
  |  Branch (2886:24): [True: 1, False: 403]
  ------------------
 2887|      1|                    {
 2888|      1|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 2889|      1|                    }
 2890|    403|                    else if(prop->values.size() > 2)
  ------------------
  |  Branch (2890:29): [True: 26, False: 377]
  ------------------
 2891|     26|                    {
 2892|     26|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 2893|     26|                                           "colour_op_multiplass_fallback must have at most 2 arguments");
 2894|     26|                    }
 2895|    377|                    else if(prop->values.size() == 1)
  ------------------
  |  Branch (2895:29): [True: 13, False: 364]
  ------------------
 2896|     13|                    {
 2897|     13|                        if(prop->values.front()->type == ANT_ATOM)
  ------------------
  |  Branch (2897:28): [True: 11, False: 2]
  ------------------
 2898|     11|                        {
 2899|     11|                            AtomAbstractNode *atom = (AtomAbstractNode*)prop->values.front().get();
 2900|     11|                            switch(atom->id)
 2901|     11|                            {
 2902|      0|                            case ID_ADD:
  ------------------
  |  Branch (2902:29): [True: 0, False: 11]
  ------------------
 2903|      0|                                mUnit->setColourOpMultipassFallback(SBF_ONE, SBF_ONE);
 2904|      0|                                break;
 2905|      0|                            case ID_MODULATE:
  ------------------
  |  Branch (2905:29): [True: 0, False: 11]
  ------------------
 2906|      0|                                mUnit->setColourOpMultipassFallback(SBF_DEST_COLOUR, SBF_ZERO);
 2907|      0|                                break;
 2908|      0|                            case ID_COLOUR_BLEND:
  ------------------
  |  Branch (2908:29): [True: 0, False: 11]
  ------------------
 2909|      0|                                mUnit->setColourOpMultipassFallback(SBF_SOURCE_COLOUR, SBF_ONE_MINUS_SOURCE_COLOUR);
 2910|      0|                                break;
 2911|      0|                            case ID_ALPHA_BLEND:
  ------------------
  |  Branch (2911:29): [True: 0, False: 11]
  ------------------
 2912|      0|                                mUnit->setColourOpMultipassFallback(SBF_SOURCE_ALPHA, SBF_ONE_MINUS_SOURCE_ALPHA);
 2913|      0|                                break;
 2914|      0|                            case ID_REPLACE:
  ------------------
  |  Branch (2914:29): [True: 0, False: 11]
  ------------------
 2915|      0|                                mUnit->setColourOpMultipassFallback(SBF_ONE, SBF_ZERO);
 2916|      0|                                break;
 2917|     11|                            default:
  ------------------
  |  Branch (2917:29): [True: 11, False: 0]
  ------------------
 2918|     11|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2919|     11|                                                   "argument must be a valid scene blend type (add, modulate, colour_blend, alpha_blend, or replace)");
 2920|     11|                            }
 2921|     11|                        }
 2922|      2|                        else
 2923|      2|                        {
 2924|      2|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2925|      2|                                               "argument must be a valid scene blend type (add, modulate, colour_blend, alpha_blend, or replace)");
 2926|      2|                        }
 2927|     13|                    }
 2928|    364|                    else
 2929|    364|                    {
 2930|    364|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0), i1 = getNodeAt(prop->values, 1);
 2931|    364|                        SceneBlendFactor sbf0, sbf1;
 2932|    364|                        if(getSceneBlendFactor(*i0, &sbf0) && getSceneBlendFactor(*i1, &sbf1))
  ------------------
  |  Branch (2932:28): [True: 339, False: 25]
  |  Branch (2932:63): [True: 331, False: 8]
  ------------------
 2933|    331|                            mUnit->setColourOpMultipassFallback(sbf0, sbf1);
 2934|     33|                        else
 2935|     33|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2936|     33|                                               "arguments must be valid scene blend factors");
 2937|    364|                    }
 2938|    404|                    break;
 2939|    404|                case ID_ALPHA_OP_EX:
  ------------------
  |  Branch (2939:17): [True: 101, False: 27.0k]
  ------------------
 2940|    101|                    if(prop->values.size() < 3)
  ------------------
  |  Branch (2940:24): [True: 18, False: 83]
  ------------------
 2941|     18|                    {
 2942|     18|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line,
 2943|     18|                                           "alpha_op_ex must have at least 3 arguments");
 2944|     18|                    }
 2945|     83|                    else if(prop->values.size() > 6)
  ------------------
  |  Branch (2945:29): [True: 5, False: 78]
  ------------------
 2946|      5|                    {
 2947|      5|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 2948|      5|                                           "alpha_op_ex must have at most 6 arguments");
 2949|      5|                    }
 2950|     78|                    else
 2951|     78|                    {
 2952|     78|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0),
 2953|     78|                            i1 = getNodeAt(prop->values, 1),
 2954|     78|                            i2 = getNodeAt(prop->values, 2);
 2955|     78|                        LayerBlendOperationEx op;
 2956|     78|                        LayerBlendSource source1, source2;
 2957|     78|                        if (getValue(*i0, op) && getValue(*i1, source1) && getValue(*i2, source2))
  ------------------
  |  Branch (2957:29): [True: 52, False: 26]
  |  Branch (2957:50): [True: 47, False: 5]
  |  Branch (2957:76): [True: 45, False: 2]
  ------------------
 2958|     45|                        {
 2959|     45|                            Real arg1 = 0.0f, arg2 = 0.0f;
 2960|     45|                            Real manualBlend = 0.0f;
 2961|       |
 2962|     45|                            if(op == LBX_BLEND_MANUAL)
  ------------------
  |  Branch (2962:32): [True: 0, False: 45]
  ------------------
 2963|      0|                            {
 2964|      0|                                AbstractNodeList::const_iterator i3 = getNodeAt(prop->values, 3);
 2965|      0|                                if(i3 != prop->values.end())
  ------------------
  |  Branch (2965:36): [True: 0, False: 0]
  ------------------
 2966|      0|                                {
 2967|      0|                                    if(!getReal(*i3, &manualBlend))
  ------------------
  |  Branch (2967:40): [True: 0, False: 0]
  ------------------
 2968|      0|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2969|      0|                                                           "valid number expected when blend_manual is used");
 2970|      0|                                }
 2971|      0|                                else
 2972|      0|                                {
 2973|      0|                                    compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 2974|      0|                                                       "valid number expected when blend_manual is used");
 2975|      0|                                }
 2976|      0|                            }
 2977|       |
 2978|     45|                            AbstractNodeList::const_iterator j = getNodeAt(prop->values, 3);
 2979|     45|                            if(op == LBX_BLEND_MANUAL)
  ------------------
  |  Branch (2979:32): [True: 0, False: 45]
  ------------------
 2980|      0|                                ++j;
 2981|     45|                            if(source1 == LBS_MANUAL)
  ------------------
  |  Branch (2981:32): [True: 45, False: 0]
  ------------------
 2982|     45|                            {
 2983|     45|                                if(j != prop->values.end())
  ------------------
  |  Branch (2983:36): [True: 44, False: 1]
  ------------------
 2984|     44|                                {
 2985|     44|                                    if(!getReal(*j, &arg1))
  ------------------
  |  Branch (2985:40): [True: 7, False: 37]
  ------------------
 2986|      7|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 2987|      7|                                                           "valid colour expected when src_manual is used");
 2988|     37|                                    else
 2989|     37|                                        ++j;
 2990|     44|                                }
 2991|      1|                                else
 2992|      1|                                {
 2993|      1|                                    compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 2994|      1|                                                       "valid colour expected when src_manual is used");
 2995|      1|                                }
 2996|     45|                            }
 2997|     45|                            if(source2 == LBS_MANUAL)
  ------------------
  |  Branch (2997:32): [True: 0, False: 45]
  ------------------
 2998|      0|                            {
 2999|      0|                                if(j != prop->values.end())
  ------------------
  |  Branch (2999:36): [True: 0, False: 0]
  ------------------
 3000|      0|                                {
 3001|      0|                                    if(!getReal(*j, &arg2))
  ------------------
  |  Branch (3001:40): [True: 0, False: 0]
  ------------------
 3002|      0|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3003|      0|                                                           "valid colour expected when src_manual is used");
 3004|      0|                                }
 3005|      0|                                else
 3006|      0|                                {
 3007|      0|                                    compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 3008|      0|                                                       "valid colour expected when src_manual is used");
 3009|      0|                                }
 3010|      0|                            }
 3011|       |
 3012|     45|                            mUnit->setAlphaOperation(op, source1, source2, arg1, arg2, manualBlend);
 3013|     45|                        }
 3014|     33|                        else
 3015|     33|                        {
 3016|     33|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 3017|     33|                        }
 3018|     78|                    }
 3019|    101|                    break;
 3020|  1.16k|                case ID_ENV_MAP:
  ------------------
  |  Branch (3020:17): [True: 1.16k, False: 26.0k]
  ------------------
 3021|  1.16k|                    if(prop->values.empty())
  ------------------
  |  Branch (3021:24): [True: 12, False: 1.15k]
  ------------------
 3022|     12|                    {
 3023|     12|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 3024|     12|                    }
 3025|  1.15k|                    else if(prop->values.size() > 1)
  ------------------
  |  Branch (3025:29): [True: 21, False: 1.13k]
  ------------------
 3026|     21|                    {
 3027|     21|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 3028|     21|                                           "env_map must have at most 1 argument");
 3029|     21|                    }
 3030|  1.13k|                    else
 3031|  1.13k|                    {
 3032|  1.13k|                        if(prop->values.front()->type == ANT_ATOM)
  ------------------
  |  Branch (3032:28): [True: 1.13k, False: 3]
  ------------------
 3033|  1.13k|                        {
 3034|  1.13k|                            AtomAbstractNode *atom = (AtomAbstractNode*)prop->values.front().get();
 3035|  1.13k|                            switch(atom->id)
 3036|  1.13k|                            {
 3037|      1|                            case ScriptCompiler::ID_OFF:
  ------------------
  |  Branch (3037:29): [True: 1, False: 1.12k]
  ------------------
 3038|      1|                                mUnit->setEnvironmentMap(false);
 3039|      1|                                break;
 3040|    674|                            case ID_SPHERICAL:
  ------------------
  |  Branch (3040:29): [True: 674, False: 456]
  ------------------
 3041|    674|                                mUnit->setEnvironmentMap(true, TextureUnitState::ENV_CURVED);
 3042|    674|                                break;
 3043|      0|                            case ID_PLANAR:
  ------------------
  |  Branch (3043:29): [True: 0, False: 1.13k]
  ------------------
 3044|      0|                                mUnit->setEnvironmentMap(true, TextureUnitState::ENV_PLANAR);
 3045|      0|                                break;
 3046|    413|                            case ID_CUBIC_REFLECTION:
  ------------------
  |  Branch (3046:29): [True: 413, False: 717]
  ------------------
 3047|    413|                                mUnit->setEnvironmentMap(true, TextureUnitState::ENV_REFLECTION);
 3048|    413|                                break;
 3049|      0|                            case ID_CUBIC_NORMAL:
  ------------------
  |  Branch (3049:29): [True: 0, False: 1.13k]
  ------------------
 3050|      0|                                mUnit->setEnvironmentMap(true, TextureUnitState::ENV_NORMAL);
 3051|      0|                                break;
 3052|     42|                            default:
  ------------------
  |  Branch (3052:29): [True: 42, False: 1.08k]
  ------------------
 3053|     42|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3054|     42|                                                   prop->values.front()->getValue() + " is not a valid argument (must be \"off\", \"spherical\", \"planar\", \"cubic_reflection\", or \"cubic_normal\")");
 3055|  1.13k|                            }
 3056|  1.13k|                        }
 3057|      3|                        else
 3058|      3|                        {
 3059|      3|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3060|      3|                                               prop->values.front()->getValue() + " is not a valid argument (must be \"off\", \"spherical\", \"planar\", \"cubic_reflection\", or \"cubic_normal\")");
 3061|      3|                        }
 3062|  1.13k|                    }
 3063|  1.16k|                    break;
 3064|  1.16k|                case ID_SCROLL:
  ------------------
  |  Branch (3064:17): [True: 239, False: 26.9k]
  ------------------
 3065|    239|                    {
 3066|    239|                        std::vector<float> v;
 3067|    239|                        if(prop->values.size() == 2 && getVector(prop->values.begin(), prop->values.end(), v, 2))
  ------------------
  |  Branch (3067:28): [True: 209, False: 30]
  |  Branch (3067:28): [True: 196, False: 43]
  |  Branch (3067:56): [True: 196, False: 13]
  ------------------
 3068|    196|                            mUnit->setTextureScroll(v[0], v[1]);
 3069|     43|                        else
 3070|     43|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3071|     43|                                               "scroll requires exactly 2 numeric arguments");
 3072|    239|                    }
 3073|    239|                    break;
 3074|  1.25k|                case ID_SCROLL_ANIM:
  ------------------
  |  Branch (3074:17): [True: 1.25k, False: 25.9k]
  ------------------
 3075|  1.25k|                    {
 3076|  1.25k|                        std::vector<float> v;
 3077|  1.25k|                        if(prop->values.size() == 2 && getVector(prop->values.begin(), prop->values.end(), v, 2))
  ------------------
  |  Branch (3077:28): [True: 1.21k, False: 33]
  |  Branch (3077:28): [True: 1.20k, False: 52]
  |  Branch (3077:56): [True: 1.20k, False: 19]
  ------------------
 3078|  1.20k|                            mUnit->setScrollAnimation(v[0], v[1]);
 3079|     52|                        else
 3080|     52|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3081|     52|                                               "scroll_anim requires exactly 2 numeric arguments");
 3082|  1.25k|                    }
 3083|  1.25k|                    break;
 3084|     13|                case ID_ROTATE:
  ------------------
  |  Branch (3084:17): [True: 13, False: 27.1k]
  ------------------
 3085|     13|                    if(getValue(prop, compiler, fval))
  ------------------
  |  Branch (3085:24): [True: 0, False: 13]
  ------------------
 3086|      0|                        mUnit->setTextureRotate(Degree(fval));
 3087|     13|                    break;
 3088|    369|                case ID_ROTATE_ANIM:
  ------------------
  |  Branch (3088:17): [True: 369, False: 26.8k]
  ------------------
 3089|    369|                    if(getValue(prop, compiler, fval))
  ------------------
  |  Branch (3089:24): [True: 339, False: 30]
  ------------------
 3090|    339|                        mUnit->setRotateAnimation(fval);
 3091|    369|                    break;
 3092|    382|                case ID_SCALE:
  ------------------
  |  Branch (3092:17): [True: 382, False: 26.7k]
  ------------------
 3093|    382|                    {
 3094|    382|                        std::vector<float> v;
 3095|    382|                        if(prop->values.size() == 2 && getVector(prop->values.begin(), prop->values.end(), v, 2))
  ------------------
  |  Branch (3095:28): [True: 369, False: 13]
  |  Branch (3095:28): [True: 361, False: 21]
  |  Branch (3095:56): [True: 361, False: 8]
  ------------------
 3096|    361|                            mUnit->setTextureScale(v[0], v[1]);
 3097|     21|                        else
 3098|     21|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3099|     21|                                               "scale requires exactly 2 numeric arguments");
 3100|    382|                    }
 3101|    382|                    break;
 3102|    699|                case ID_WAVE_XFORM:
  ------------------
  |  Branch (3102:17): [True: 699, False: 26.4k]
  ------------------
 3103|    699|                    if(prop->values.size() != 6)
  ------------------
  |  Branch (3103:24): [True: 21, False: 678]
  ------------------
 3104|     21|                    {
 3105|     21|                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3106|     21|                                           "wave_xform requires exactly 6 arguments");
 3107|     21|                    }
 3108|    678|                    else
 3109|    678|                    {
 3110|    678|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0), i1 = getNodeAt(prop->values, 1),
 3111|    678|                            i2 = getNodeAt(prop->values, 2), i3 = getNodeAt(prop->values, 3),
 3112|    678|                            i4 = getNodeAt(prop->values, 4), i5 = getNodeAt(prop->values, 5);
 3113|    678|                        if((*i0)->type == ANT_ATOM && (*i1)->type == ANT_ATOM && (*i2)->type == ANT_ATOM &&
  ------------------
  |  Branch (3113:28): [True: 678, False: 0]
  |  Branch (3113:55): [True: 678, False: 0]
  |  Branch (3113:82): [True: 678, False: 0]
  ------------------
 3114|    678|                           (*i3)->type == ANT_ATOM && (*i4)->type == ANT_ATOM && (*i5)->type == ANT_ATOM)
  ------------------
  |  Branch (3114:28): [True: 678, False: 0]
  |  Branch (3114:55): [True: 678, False: 0]
  |  Branch (3114:82): [True: 677, False: 1]
  ------------------
 3115|    677|                        {
 3116|    677|                            AtomAbstractNode *atom0 = (AtomAbstractNode*)(*i0).get(), *atom1 = (AtomAbstractNode*)(*i1).get();
 3117|    677|                            TextureUnitState::TextureTransformType type = TextureUnitState::TT_ROTATE;
 3118|    677|                            WaveformType wave = WFT_SINE;
 3119|    677|                            Real base = 0.0f, freq = 0.0f, phase = 0.0f, amp = 0.0f;
 3120|       |
 3121|    677|                            switch(atom0->id)
 3122|    677|                            {
 3123|      0|                            case ID_SCROLL_X:
  ------------------
  |  Branch (3123:29): [True: 0, False: 677]
  ------------------
 3124|      0|                                type = TextureUnitState::TT_TRANSLATE_U;
 3125|      0|                                break;
 3126|    254|                            case ID_SCROLL_Y:
  ------------------
  |  Branch (3126:29): [True: 254, False: 423]
  ------------------
 3127|    254|                                type = TextureUnitState::TT_TRANSLATE_V;
 3128|    254|                                break;
 3129|    195|                            case ID_SCALE_X:
  ------------------
  |  Branch (3129:29): [True: 195, False: 482]
  ------------------
 3130|    195|                                type = TextureUnitState::TT_SCALE_U;
 3131|    195|                                break;
 3132|    218|                            case ID_SCALE_Y:
  ------------------
  |  Branch (3132:29): [True: 218, False: 459]
  ------------------
 3133|    218|                                type = TextureUnitState::TT_SCALE_V;
 3134|    218|                                break;
 3135|      0|                            case ID_ROTATE:
  ------------------
  |  Branch (3135:29): [True: 0, False: 677]
  ------------------
 3136|      0|                                type = TextureUnitState::TT_ROTATE;
 3137|      0|                                break;
 3138|     10|                            default:
  ------------------
  |  Branch (3138:29): [True: 10, False: 667]
  ------------------
 3139|     10|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3140|     10|                                                   atom0->value + " is not a valid transform type (must be \"scroll_x\", \"scroll_y\", \"scale_x\", \"scale_y\", or \"rotate\")");
 3141|    677|                            }
 3142|       |
 3143|    677|                            switch(atom1->id)
 3144|    677|                            {
 3145|    629|                            case ID_SINE:
  ------------------
  |  Branch (3145:29): [True: 629, False: 48]
  ------------------
 3146|    629|                                wave = WFT_SINE;
 3147|    629|                                break;
 3148|      0|                            case ID_TRIANGLE:
  ------------------
  |  Branch (3148:29): [True: 0, False: 677]
  ------------------
 3149|      0|                                wave = WFT_TRIANGLE;
 3150|      0|                                break;
 3151|      0|                            case ID_SQUARE:
  ------------------
  |  Branch (3151:29): [True: 0, False: 677]
  ------------------
 3152|      0|                                wave = WFT_SQUARE;
 3153|      0|                                break;
 3154|      0|                            case ID_SAWTOOTH:
  ------------------
  |  Branch (3154:29): [True: 0, False: 677]
  ------------------
 3155|      0|                                wave = WFT_SAWTOOTH;
 3156|      0|                                break;
 3157|      0|                            case ID_INVERSE_SAWTOOTH:
  ------------------
  |  Branch (3157:29): [True: 0, False: 677]
  ------------------
 3158|      0|                                wave = WFT_INVERSE_SAWTOOTH;
 3159|      0|                                break;
 3160|     48|                            default:
  ------------------
  |  Branch (3160:29): [True: 48, False: 629]
  ------------------
 3161|     48|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3162|     48|                                                   atom1->value + " is not a valid waveform type (must be \"sine\", \"triangle\", \"square\", \"sawtooth\", or \"inverse_sawtooth\")");
 3163|    677|                            }
 3164|       |
 3165|    677|                            if(!getReal(*i2, &base) || !getReal(*i3, &freq) || !getReal(*i4, &phase) || !getReal(*i5, &amp))
  ------------------
  |  Branch (3165:32): [True: 4, False: 673]
  |  Branch (3165:56): [True: 10, False: 663]
  |  Branch (3165:80): [True: 12, False: 651]
  |  Branch (3165:105): [True: 6, False: 645]
  ------------------
 3166|     32|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3167|     32|                                                   "arguments 3, 4, 5, and 6 must be valid numbers; received " + (*i2)->getValue() + ", " + (*i3)->getValue() + ", " + (*i4)->getValue() + ", " + (*i5)->getValue());
 3168|       |
 3169|    677|                            mUnit->setTransformAnimation(type, wave, base, freq, phase, amp);
 3170|    677|                        }
 3171|      1|                        else
 3172|      1|                        {
 3173|      1|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 3174|      1|                        }
 3175|    678|                    }
 3176|    699|                    break;
 3177|    699|                case ID_TRANSFORM:
  ------------------
  |  Branch (3177:17): [True: 11, False: 27.1k]
  ------------------
 3178|     11|                    {
 3179|     11|                        Matrix4 m;
 3180|     11|                        if(getMatrix4(prop->values.begin(), prop->values.end(), &m))
  ------------------
  |  Branch (3180:28): [True: 0, False: 11]
  ------------------
 3181|      0|                            mUnit->setTextureTransform(m);
 3182|     11|                        else
 3183|     11|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 3184|     11|                    }
 3185|     11|                    break;
 3186|  2.89k|                case ID_CONTENT_TYPE:
  ------------------
  |  Branch (3186:17): [True: 2.89k, False: 24.2k]
  ------------------
 3187|  2.89k|                    if(prop->values.empty())
  ------------------
  |  Branch (3187:24): [True: 0, False: 2.89k]
  ------------------
 3188|      0|                    {
 3189|      0|                        compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line);
 3190|      0|                    }
 3191|  2.89k|                    else if(prop->values.size() > 4)
  ------------------
  |  Branch (3191:29): [True: 18, False: 2.87k]
  ------------------
 3192|     18|                    {
 3193|     18|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
 3194|     18|                                           "content_type must have at most 4 arguments");
 3195|     18|                    }
 3196|  2.87k|                    else
 3197|  2.87k|                    {
 3198|  2.87k|                        if(prop->values.front()->type == ANT_ATOM)
  ------------------
  |  Branch (3198:28): [True: 2.87k, False: 7]
  ------------------
 3199|  2.87k|                        {
 3200|  2.87k|                            AtomAbstractNode *atom = (AtomAbstractNode*)prop->values.front().get();
 3201|  2.87k|                            switch(atom->id)
 3202|  2.87k|                            {
 3203|      0|                            case ID_NAMED:
  ------------------
  |  Branch (3203:29): [True: 0, False: 2.87k]
  ------------------
 3204|      0|                                mUnit->setContentType(TextureUnitState::CONTENT_NAMED);
 3205|      0|                                break;
 3206|  1.89k|                            case ID_SHADOW:
  ------------------
  |  Branch (3206:29): [True: 1.89k, False: 972]
  ------------------
 3207|  1.89k|                                mUnit->setContentType(TextureUnitState::CONTENT_SHADOW);
 3208|  1.89k|                                break;
 3209|    927|                            case ID_COMPOSITOR:
  ------------------
  |  Branch (3209:29): [True: 927, False: 1.94k]
  ------------------
 3210|    927|                                mUnit->setContentType(TextureUnitState::CONTENT_COMPOSITOR);
 3211|    927|                                if (prop->values.size() >= 3)
  ------------------
  |  Branch (3211:37): [True: 870, False: 57]
  ------------------
 3212|    870|                                {
 3213|    870|                                    String compositorName;
 3214|    870|                                    getString(*getNodeAt(prop->values, 1), &compositorName);
 3215|    870|                                    String textureName;
 3216|    870|                                    getString(*getNodeAt(prop->values, 2), &textureName);
 3217|       |
 3218|    870|                                    if (prop->values.size() == 4)
  ------------------
  |  Branch (3218:41): [True: 588, False: 282]
  ------------------
 3219|    588|                                    {
 3220|    588|                                        uint32 mrtIndex;
 3221|    588|                                        getUInt(*getNodeAt(prop->values, 3), (uint32*)&mrtIndex);
 3222|    588|                                        mUnit->setCompositorReference(compositorName, textureName, mrtIndex);
 3223|    588|                                    }
 3224|    282|                                    else
 3225|    282|                                    {
 3226|    282|                                        mUnit->setCompositorReference(compositorName, textureName);
 3227|    282|                                    }
 3228|    870|                                }
 3229|     57|                                else
 3230|     57|                                {
 3231|     57|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3232|     57|                                                       "content_type compositor must have an additional 2 or 3 parameters");
 3233|     57|                                }
 3234|       |
 3235|    927|                                break;
 3236|     45|                            default:
  ------------------
  |  Branch (3236:29): [True: 45, False: 2.82k]
  ------------------
 3237|     45|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3238|     45|                                                   atom->value + " is not a valid content type (must be \"named\" or \"shadow\" or \"compositor\")");
 3239|  2.87k|                            }
 3240|  2.87k|                        }
 3241|      7|                        else
 3242|      7|                        {
 3243|      7|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 3244|      7|                                               prop->values.front()->getValue() + " is not a valid content type");
 3245|      7|                        }
 3246|  2.87k|                    }
 3247|  2.89k|                    break;
 3248|  2.89k|                default:
  ------------------
  |  Branch (3248:17): [True: 1.40k, False: 25.7k]
  ------------------
 3249|  1.40k|                    compiler->addError(ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line,
 3250|  1.40k|                                       "token \"" + prop->name + "\" is not recognized");
 3251|  27.1k|                }
 3252|  27.1k|            }
 3253|  2.38k|            else if(i->type == ANT_OBJECT)
  ------------------
  |  Branch (3253:21): [True: 1.37k, False: 1.00k]
  ------------------
 3254|  1.37k|            {
 3255|  1.37k|                processNode(compiler, i);
 3256|  1.37k|            }
 3257|  29.5k|        }
 3258|  12.6k|    }
_ZN4Ogre23TextureSourceTranslatorC2Ev:
 3264|      1|    {
 3265|      1|    }
_ZN4Ogre23TextureSourceTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 3268|      8|    {
 3269|      8|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 3270|       |
 3271|       |        // It has to have one value identifying the texture source name
 3272|      8|        if(obj->values.empty())
  ------------------
  |  Branch (3272:12): [True: 1, False: 7]
  ------------------
 3273|      1|        {
 3274|      1|            compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, node->file, node->line,
 3275|      1|                               "texture_source requires a type value");
 3276|      1|            return;
 3277|      1|        }
 3278|       |
 3279|       |        // Set the value of the source
 3280|      7|        ExternalTextureSourceManager::getSingleton().setCurrentPlugIn(obj->values.front()->getValue());
 3281|       |
 3282|      7|        if (!ExternalTextureSourceManager::getSingleton().getCurrentPlugIn())
  ------------------
  |  Branch (3282:13): [True: 7, False: 0]
  ------------------
 3283|      7|        {
 3284|      7|            compiler->addError(ScriptCompiler::CE_REFERENCETOANONEXISTINGOBJECT, node->file, node->line,
 3285|      7|                               obj->values.front()->getValue());
 3286|      7|            return;
 3287|      7|        }
 3288|       |
 3289|       |        // Set up the technique, pass, and texunit levels
 3290|      0|        TextureUnitState *texunit = any_cast<TextureUnitState*>(obj->parent->context);
 3291|      0|        Pass *pass = texunit->getParent();
 3292|      0|        Technique *technique = pass->getParent();
 3293|      0|        Material *material = technique->getParent();
 3294|       |
 3295|      0|        unsigned short techniqueIndex = 0, passIndex = 0, texUnitIndex = 0;
 3296|      0|        for(unsigned short i = 0; i < material->getNumTechniques(); i++)
  ------------------
  |  Branch (3296:35): [True: 0, False: 0]
  ------------------
 3297|      0|        {
 3298|      0|            if(material->getTechnique(i) == technique)
  ------------------
  |  Branch (3298:16): [True: 0, False: 0]
  ------------------
 3299|      0|            {
 3300|      0|                techniqueIndex = i;
 3301|      0|                break;
 3302|      0|            }
 3303|      0|        }
 3304|      0|        for(unsigned short i = 0; i < technique->getNumPasses(); i++)
  ------------------
  |  Branch (3304:35): [True: 0, False: 0]
  ------------------
 3305|      0|        {
 3306|      0|            if(technique->getPass(i) == pass)
  ------------------
  |  Branch (3306:16): [True: 0, False: 0]
  ------------------
 3307|      0|            {
 3308|      0|                passIndex = i;
 3309|      0|                break;
 3310|      0|            }
 3311|      0|        }
 3312|      0|        for(unsigned short i = 0; i < pass->getNumTextureUnitStates(); i++)
  ------------------
  |  Branch (3312:35): [True: 0, False: 0]
  ------------------
 3313|      0|        {
 3314|      0|            if(pass->getTextureUnitState(i) == texunit)
  ------------------
  |  Branch (3314:16): [True: 0, False: 0]
  ------------------
 3315|      0|            {
 3316|      0|                texUnitIndex = i;
 3317|      0|                break;
 3318|      0|            }
 3319|      0|        }
 3320|       |
 3321|      0|        String tps;
 3322|      0|        tps = StringConverter::toString(techniqueIndex) + " "
 3323|      0|            + StringConverter::toString(passIndex) + " "
 3324|      0|            + StringConverter::toString(texUnitIndex);
 3325|       |
 3326|      0|        ExternalTextureSourceManager::getSingleton().getCurrentPlugIn()->setParameter( "set_T_P_S", tps );
 3327|       |
 3328|      0|        for(auto & i : obj->children)
  ------------------
  |  Branch (3328:22): [True: 0, False: 0]
  ------------------
 3329|      0|        {
 3330|      0|            if(i->type == ANT_PROPERTY)
  ------------------
  |  Branch (3330:16): [True: 0, False: 0]
  ------------------
 3331|      0|            {
 3332|      0|                auto prop = i->getProperty();
 3333|       |                // Glob the property values all together
 3334|      0|                String str = StringConverter::toString(prop.values);
 3335|      0|                ExternalTextureSourceManager::getSingleton().getCurrentPlugIn()->setParameter(prop.name, str);
 3336|      0|            }
 3337|      0|            else if(i->type == ANT_OBJECT)
  ------------------
  |  Branch (3337:21): [True: 0, False: 0]
  ------------------
 3338|      0|            {
 3339|      0|                processNode(compiler, i);
 3340|      0|            }
 3341|      0|        }
 3342|       |
 3343|      0|        ExternalTextureSourceManager::getSingleton().getCurrentPlugIn()->createDefinedTexture(material->getName(), material->getGroup());
 3344|      0|    }
_ZN4Ogre20GpuProgramTranslatorC2Ev:
 3350|      1|    {
 3351|      1|    }
_ZN4Ogre20GpuProgramTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 3354|  5.14k|    {
 3355|  5.14k|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 3356|       |
 3357|       |        // Must have a name
 3358|  5.14k|        if(obj->name.empty())
  ------------------
  |  Branch (3358:12): [True: 12, False: 5.13k]
  ------------------
 3359|     12|        {
 3360|     12|            compiler->addError(ScriptCompiler::CE_OBJECTNAMEEXPECTED, obj->file, obj->line,
 3361|     12|                               "gpu program object must have names");
 3362|     12|            return;
 3363|     12|        }
 3364|       |
 3365|       |        // Must have a language type
 3366|  5.13k|        if(obj->values.empty())
  ------------------
  |  Branch (3366:12): [True: 584, False: 4.55k]
  ------------------
 3367|    584|        {
 3368|    584|            compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, obj->file, obj->line,
 3369|    584|                               "gpu program object require language declarations");
 3370|    584|            return;
 3371|    584|        }
 3372|       |
 3373|       |        // Get the language
 3374|  4.55k|        String language;
 3375|  4.55k|        for(const auto& lnode : obj->values)
  ------------------
  |  Branch (3375:31): [True: 6.84k, False: 3.70k]
  ------------------
 3376|  6.84k|        {
 3377|  6.84k|            if(!getString(lnode, &language))
  ------------------
  |  Branch (3377:16): [True: 0, False: 6.84k]
  ------------------
 3378|      0|            {
 3379|      0|                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, obj->file, obj->line);
 3380|      0|                return;
 3381|      0|            }
 3382|       |
 3383|  6.84k|            if (language == "asm")
  ------------------
  |  Branch (3383:17): [True: 0, False: 6.84k]
  ------------------
 3384|      0|            {
 3385|      0|                compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, obj->file, obj->line, "asm. Use syntax code.");
 3386|      0|                break; // always supported
 3387|      0|            }
 3388|  6.84k|            if (GpuProgramManager::getSingleton().isLanguageSupported(language))
  ------------------
  |  Branch (3388:17): [True: 845, False: 6.00k]
  ------------------
 3389|    845|                break;
 3390|  6.84k|        }
 3391|       |
 3392|  4.55k|        translateGpuProgram(compiler, obj, language);
 3393|  4.55k|    }
_ZN4Ogre20GpuProgramTranslator19translateGpuProgramEPNS_14ScriptCompilerEPNS_18ObjectAbstractNodeENSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
 3396|  4.55k|    {
 3397|  4.55k|        String syntax;
 3398|  4.55k|        std::vector<String> delegates;
 3399|  4.55k|        std::vector<std::pair<PropertyAbstractNode*, String> > customParameters;
 3400|  4.55k|        String source, profiles, target;
 3401|  4.55k|        AbstractNodePtr params;
 3402|  4.55k|        for(auto & i : obj->children)
  ------------------
  |  Branch (3402:22): [True: 18.1k, False: 4.46k]
  ------------------
 3403|  18.1k|        {
 3404|  18.1k|            if(i->type == ANT_PROPERTY)
  ------------------
  |  Branch (3404:16): [True: 14.5k, False: 3.58k]
  ------------------
 3405|  14.5k|            {
 3406|  14.5k|                PropertyAbstractNode *prop = (PropertyAbstractNode*)i.get();
 3407|  14.5k|                if(prop->id == ID_SOURCE)
  ------------------
  |  Branch (3407:20): [True: 3.78k, False: 10.8k]
  ------------------
 3408|  3.78k|                {
 3409|  3.78k|                    if(!getValue(prop, compiler, source))
  ------------------
  |  Branch (3409:24): [True: 50, False: 3.73k]
  ------------------
 3410|     50|                        return;
 3411|  3.78k|                }
 3412|  10.8k|                else if(prop->name == "delegate")
  ------------------
  |  Branch (3412:25): [True: 3.55k, False: 7.26k]
  ------------------
 3413|  3.55k|                {
 3414|  3.55k|                    String value;
 3415|  3.55k|                    if(!getValue(prop, compiler, value))
  ------------------
  |  Branch (3415:24): [True: 36, False: 3.51k]
  ------------------
 3416|     36|                        return;
 3417|       |
 3418|  3.51k|                    ProcessResourceNameScriptCompilerEvent evt(ProcessResourceNameScriptCompilerEvent::GPU_PROGRAM, value);
 3419|  3.51k|                    compiler->_fireEvent(&evt, 0);
 3420|       |
 3421|  3.51k|                    if (evt.mName == obj->name)
  ------------------
  |  Branch (3421:25): [True: 100, False: 3.41k]
  ------------------
 3422|    100|                    {
 3423|    100|                        compiler->addError(*prop, "cannot be a delegate of itself",
 3424|    100|                                           ScriptCompiler::CE_INVALIDPARAMETERS);
 3425|    100|                        continue;
 3426|    100|                    }
 3427|       |
 3428|  3.41k|                    delegates.push_back(evt.mName);
 3429|  3.41k|                }
 3430|  7.26k|                else
 3431|  7.26k|                {
 3432|  7.26k|                    StringVector values;
 3433|  7.26k|                    _getVector(prop->values.begin(), prop->values.end(), values, prop->values.size());
 3434|       |
 3435|  7.26k|                    if(prop->name == "attach")
  ------------------
  |  Branch (3435:24): [True: 33, False: 7.23k]
  ------------------
 3436|     33|                    {
 3437|     33|                        compiler->addError(*prop, "attach. Use the #include directive instead",
 3438|     33|                                           ScriptCompiler::CE_DEPRECATEDSYMBOL);
 3439|       |
 3440|     33|                        for (auto& value : values)
  ------------------
  |  Branch (3440:42): [True: 157, False: 33]
  ------------------
 3441|    157|                        {
 3442|    157|                            ProcessResourceNameScriptCompilerEvent evt(ProcessResourceNameScriptCompilerEvent::GPU_PROGRAM, value);
 3443|    157|                            compiler->_fireEvent(&evt, 0);
 3444|    157|                            value = evt.mName;
 3445|    157|                        }
 3446|     33|                    }
 3447|       |
 3448|  7.26k|                    String value = StringConverter::toString(values);
 3449|       |
 3450|  7.26k|                    if(prop->name == "profiles")
  ------------------
  |  Branch (3450:24): [True: 675, False: 6.59k]
  ------------------
 3451|    675|                        profiles = value;
 3452|  6.59k|                    else if(prop->name == "target")
  ------------------
  |  Branch (3452:29): [True: 1.40k, False: 5.18k]
  ------------------
 3453|  1.40k|                        target = value;
 3454|  5.18k|                    else if(prop->id == ID_SYNTAX && language == "asm")
  ------------------
  |  Branch (3454:29): [True: 245, False: 4.94k]
  |  Branch (3454:54): [True: 0, False: 245]
  ------------------
 3455|      0|                        syntax = value;
 3456|  5.18k|                    else
 3457|  5.18k|                        customParameters.push_back(std::make_pair(prop, value));
 3458|  7.26k|                }
 3459|  14.5k|            }
 3460|  3.58k|            else if(i->type == ANT_OBJECT)
  ------------------
  |  Branch (3460:21): [True: 2.58k, False: 1.00k]
  ------------------
 3461|  2.58k|            {
 3462|  2.58k|                if(((ObjectAbstractNode*)i.get())->id == ID_DEFAULT_PARAMS)
  ------------------
  |  Branch (3462:20): [True: 1.51k, False: 1.07k]
  ------------------
 3463|  1.51k|                    params = i;
 3464|  1.07k|                else
 3465|  1.07k|                    processNode(compiler, i);
 3466|  2.58k|            }
 3467|  18.1k|        }
 3468|       |
 3469|       |        // Allocate the program
 3470|  4.46k|        GpuProgramType gpt = getProgramType(obj->id);
 3471|  4.46k|        GpuProgram *prog = 0;
 3472|       |
 3473|  4.46k|        if(language == "asm")
  ------------------
  |  Branch (3473:12): [True: 0, False: 4.46k]
  ------------------
 3474|      0|            language = syntax;
 3475|  4.46k|        CreateGpuProgramScriptCompilerEvent evt(obj->file, obj->name, compiler->getResourceGroup(), source,
 3476|  4.46k|                                                language, gpt);
 3477|  4.46k|        bool processed = compiler->_fireEvent(&evt, &prog);
 3478|       |
 3479|  4.46k|        if(!processed)
  ------------------
  |  Branch (3479:12): [True: 4.43k, False: 35]
  ------------------
 3480|  4.43k|        {
 3481|  4.43k|            prog = GpuProgramManager::getSingleton().create(obj->name, compiler->getResourceGroup(), gpt, language).get();
 3482|       |
 3483|  4.43k|            if (source.empty() && language != "unified")
  ------------------
  |  Branch (3483:17): [True: 1.18k, False: 3.24k]
  |  Branch (3483:35): [True: 417, False: 770]
  ------------------
 3484|    417|            {
 3485|    417|                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, obj->file, obj->line,
 3486|    417|                                   "No 'source' provided for GPU program");
 3487|    417|                return;
 3488|    417|            }
 3489|       |
 3490|  4.01k|            if(prog && !source.empty()) // prog=0 if duplicate definition resolved by "use previous"
  ------------------
  |  Branch (3490:16): [True: 3.89k, False: 118]
  |  Branch (3490:24): [True: 3.12k, False: 770]
  ------------------
 3491|  3.12k|                prog->setSourceFile(source);
 3492|  4.01k|        }
 3493|       |
 3494|  4.04k|        if(!prog)
  ------------------
  |  Branch (3494:12): [True: 0, False: 4.04k]
  ------------------
 3495|      0|        {
 3496|      0|            compiler->addError(ScriptCompiler::CE_OBJECTALLOCATIONERROR, obj->file, obj->line, obj->name);
 3497|      0|            return;
 3498|      0|        }
 3499|       |
 3500|  4.04k|        obj->context = prog;
 3501|       |
 3502|  4.04k|        prog->setMorphAnimationIncluded(false);
 3503|  4.04k|        prog->setPoseAnimationIncluded(0);
 3504|  4.04k|        prog->setSkeletalAnimationIncluded(false);
 3505|  4.04k|        prog->setVertexTextureFetchRequired(false);
 3506|  4.04k|        prog->_notifyOrigin(obj->file);
 3507|       |
 3508|       |        // special case for Cg
 3509|  4.04k|        if(!profiles.empty())
  ------------------
  |  Branch (3509:12): [True: 461, False: 3.58k]
  ------------------
 3510|    461|            prog->setParameter("profiles", profiles);
 3511|       |
 3512|       |        // special case for HLSL
 3513|  4.04k|        if(!target.empty())
  ------------------
  |  Branch (3513:12): [True: 1.31k, False: 2.73k]
  ------------------
 3514|  1.31k|            prog->setParameter("target", target);
 3515|       |
 3516|       |        // special case for unified
 3517|  4.04k|        for(const auto& d : delegates)
  ------------------
  |  Branch (3517:27): [True: 3.19k, False: 4.04k]
  ------------------
 3518|  3.19k|            prog->setParameter("delegate", d);
 3519|       |
 3520|       |        // Set the custom parameters
 3521|  4.04k|        for(const auto& p : customParameters)
  ------------------
  |  Branch (3521:27): [True: 3.94k, False: 4.04k]
  ------------------
 3522|  3.94k|        {
 3523|  3.94k|            if(prog->isSupported() && !prog->setParameter(p.first->name, p.second))
  ------------------
  |  Branch (3523:16): [True: 0, False: 3.94k]
  |  Branch (3523:39): [True: 0, False: 0]
  ------------------
 3524|      0|            {
 3525|      0|                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, p.first->file, p.first->line, p.first->name);
 3526|      0|            }
 3527|  3.94k|        }
 3528|       |
 3529|       |        // Set up default parameters
 3530|  4.04k|        if(prog->isSupported() && params)
  ------------------
  |  Branch (3530:12): [True: 0, False: 4.04k]
  |  Branch (3530:35): [True: 0, False: 0]
  ------------------
 3531|      0|        {
 3532|      0|            GpuProgramParametersSharedPtr ptr = prog->getDefaultParameters();
 3533|       |
 3534|      0|            if(prog->hasCompileError())
  ------------------
  |  Branch (3534:16): [True: 0, False: 0]
  ------------------
 3535|      0|                return;
 3536|       |
 3537|      0|            GpuProgramTranslator::translateProgramParameters(compiler, ptr, static_cast<ObjectAbstractNode*>(params.get()));
 3538|      0|        }
 3539|  4.04k|    }
_ZN4Ogre22SharedParamsTranslatorC2Ev:
 4042|      1|    {
 4043|      1|    }
_ZN4Ogre22SharedParamsTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 4047|     90|    {
 4048|     90|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 4049|       |
 4050|       |        // Must have a name
 4051|     90|        if (obj->name.empty())
  ------------------
  |  Branch (4051:13): [True: 6, False: 84]
  ------------------
 4052|      6|        {
 4053|      6|            compiler->addError(ScriptCompiler::CE_OBJECTNAMEEXPECTED, obj->file, obj->line);
 4054|      6|            return;
 4055|      6|        }
 4056|       |
 4057|     84|        GpuSharedParameters* sharedParams = 0;
 4058|     84|        CreateGpuSharedParametersScriptCompilerEvent evt(obj->file, obj->name, compiler->getResourceGroup());
 4059|     84|        bool processed = compiler->_fireEvent(&evt, (void*)&sharedParams);
 4060|       |
 4061|     84|        if (!processed)
  ------------------
  |  Branch (4061:13): [True: 84, False: 0]
  ------------------
 4062|     84|        {
 4063|     84|            sharedParams = GpuProgramManager::getSingleton().createSharedParameters(obj->name).get();
 4064|     84|        }
 4065|       |
 4066|     84|        if (!sharedParams)
  ------------------
  |  Branch (4066:13): [True: 0, False: 84]
  ------------------
 4067|      0|        {
 4068|      0|            compiler->addError(ScriptCompiler::CE_OBJECTALLOCATIONERROR, obj->file, obj->line, obj->name);
 4069|      0|            return;
 4070|      0|        }
 4071|       |
 4072|     84|        for (auto & i : obj->children)
  ------------------
  |  Branch (4072:23): [True: 95, False: 84]
  ------------------
 4073|     95|        {
 4074|     95|            if (i->type != ANT_PROPERTY)
  ------------------
  |  Branch (4074:17): [True: 16, False: 79]
  ------------------
 4075|     16|                continue;
 4076|       |
 4077|     79|            PropertyAbstractNode *prop = static_cast<PropertyAbstractNode*>(i.get());
 4078|     79|            if (prop->id != ID_SHARED_PARAM_NAMED && prop->id != ID_PARAM_NAMED)
  ------------------
  |  Branch (4078:17): [True: 79, False: 0]
  |  Branch (4078:54): [True: 20, False: 59]
  ------------------
 4079|     20|            {
 4080|     20|                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 4081|     20|                                   prop->name);
 4082|     20|                continue;
 4083|     20|            }
 4084|       |
 4085|     59|            if(prop->id == ID_SHARED_PARAM_NAMED)
  ------------------
  |  Branch (4085:16): [True: 0, False: 59]
  ------------------
 4086|      0|            {
 4087|      0|                compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, prop->file, prop->line,
 4088|      0|                                   "shared_param_named is deprecated. Use param_named instead");
 4089|      0|            }
 4090|       |
 4091|     59|            if (prop->values.size() < 2)
  ------------------
  |  Branch (4091:17): [True: 3, False: 56]
  ------------------
 4092|      3|            {
 4093|      3|                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 4094|      3|                                   prop->name + " - expected 2 or more arguments");
 4095|      3|                continue;
 4096|      3|            }
 4097|       |
 4098|     56|            AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0), i1 = getNodeAt(prop->values, 1);
 4099|       |
 4100|     56|            String pName;
 4101|     56|            GpuConstantType constType;
 4102|       |
 4103|     56|            if (!getValue(*i0, pName) || !getConstantType(i1, &constType))
  ------------------
  |  Branch (4103:17): [True: 0, False: 56]
  |  Branch (4103:42): [True: 30, False: 26]
  ------------------
 4104|     30|            {
 4105|     30|                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 4106|     30|                                   "name and parameter type expected");
 4107|     30|                continue;
 4108|     30|            }
 4109|       |
 4110|     26|            AbstractNodeList::const_iterator arrayStart = getNodeAt(prop->values, 2), arrayEnd = prop->values.end();
 4111|     26|            uint32 arraySz = 1;
 4112|       |
 4113|     26|            if (arrayStart != arrayEnd)
  ------------------
  |  Branch (4113:17): [True: 25, False: 1]
  ------------------
 4114|     25|            {
 4115|     25|                String value;
 4116|     25|                getValue(*arrayStart, value);
 4117|       |
 4118|     25|                if (value.front() == '[' && value.back() == ']')
  ------------------
  |  Branch (4118:21): [True: 5, False: 20]
  |  Branch (4118:45): [True: 5, False: 0]
  ------------------
 4119|      5|                {
 4120|      5|                    arraySz = StringConverter::parseInt(value.substr(1, value.size() - 2), 0);
 4121|      5|                    if(!arraySz)
  ------------------
  |  Branch (4121:24): [True: 0, False: 5]
  ------------------
 4122|      0|                    {
 4123|      0|                        compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line,
 4124|      0|                                           "invalid array size");
 4125|      0|                        continue;
 4126|      0|                    }
 4127|      5|                    arrayStart++;
 4128|      5|                }
 4129|     25|            }
 4130|       |
 4131|       |            // Look up the auto constant - if the next token is a known auto constant name,
 4132|       |            // the parameter is driven automatically instead of by literal values
 4133|     26|            const GpuProgramParameters::AutoConstantDefinition* autoDef = NULL;
 4134|     26|            if (arrayStart != arrayEnd && (*arrayStart)->type == ANT_ATOM)
  ------------------
  |  Branch (4134:17): [True: 25, False: 1]
  |  Branch (4134:43): [True: 25, False: 0]
  ------------------
 4135|     25|            {
 4136|     25|                String acName = static_cast<AtomAbstractNode*>(arrayStart->get())->value;
 4137|     25|                StringUtil::toLowerCase(acName);
 4138|     25|                autoDef = GpuProgramParameters::getAutoConstantDefinition(acName);
 4139|     25|            }
 4140|       |
 4141|       |            // define constant entry
 4142|     26|            try
 4143|     26|            {
 4144|     26|                sharedParams->addConstantDefinition(pName, constType, arraySz);
 4145|       |
 4146|     26|                if(autoDef)
  ------------------
  |  Branch (4146:20): [True: 2, False: 24]
  ------------------
 4147|      2|                {
 4148|      2|                    sharedParams->setAutoConstant(pName, autoDef->acType);
 4149|      2|                    arrayStart++;
 4150|      2|                }
 4151|     26|            }
 4152|     26|            catch(Exception& e)
 4153|     26|            {
 4154|      0|                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 4155|      0|                                   e.getDescription());
 4156|      0|                continue;
 4157|      0|            }
 4158|       |
 4159|     26|            if (autoDef && arrayStart != arrayEnd)
  ------------------
  |  Branch (4159:17): [True: 2, False: 24]
  |  Branch (4159:28): [True: 0, False: 2]
  ------------------
 4160|      0|            {
 4161|      0|                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 4162|      0|                                   "unexpected extra parameters after auto constant name");
 4163|      0|            }
 4164|       |
 4165|       |            // amount of individual numbers to read
 4166|     26|            arraySz *= GpuConstantDefinition::getElementSize(constType, false);
 4167|       |
 4168|     26|            switch (GpuConstantDefinition::getBaseType(constType))
 4169|     26|            {
 4170|      6|            case BCT_FLOAT:
  ------------------
  |  Branch (4170:13): [True: 6, False: 20]
  ------------------
 4171|      6|            {
 4172|      6|                std::vector<float> values;
 4173|      6|                if(_getVector(arrayStart, arrayEnd, values, arraySz))
  ------------------
  |  Branch (4173:20): [True: 5, False: 1]
  ------------------
 4174|      5|                    sharedParams->setNamedConstant(pName, &values[0], arraySz);
 4175|      1|                else
 4176|      1|                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4177|      6|                break;
 4178|      0|            }
 4179|      4|            case BCT_INT:
  ------------------
  |  Branch (4179:13): [True: 4, False: 22]
  ------------------
 4180|      4|            {
 4181|      4|                std::vector<int> values;
 4182|      4|                if(_getVector(arrayStart, arrayEnd, values, arraySz))
  ------------------
  |  Branch (4182:20): [True: 4, False: 0]
  ------------------
 4183|      4|                    sharedParams->setNamedConstant(pName, &values[0], arraySz);
 4184|      0|                else
 4185|      0|                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4186|      4|                break;
 4187|      0|            }
 4188|      0|            case BCT_DOUBLE:
  ------------------
  |  Branch (4188:13): [True: 0, False: 26]
  ------------------
 4189|      0|            {
 4190|      0|                std::vector<double> values;
 4191|      0|                if(_getVector(arrayStart, arrayEnd, values, arraySz))
  ------------------
  |  Branch (4191:20): [True: 0, False: 0]
  ------------------
 4192|      0|                    sharedParams->setNamedConstant(pName, &values[0], arraySz);
 4193|      0|                else
 4194|      0|                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4195|      0|                break;
 4196|      0|            }
 4197|     16|            case BCT_UINT:
  ------------------
  |  Branch (4197:13): [True: 16, False: 10]
  ------------------
 4198|     16|            {
 4199|     16|                std::vector<uint> values;
 4200|     16|                if(_getVector(arrayStart, arrayEnd, values, arraySz))
  ------------------
  |  Branch (4200:20): [True: 9, False: 7]
  ------------------
 4201|      9|                {
 4202|      9|                    sharedParams->setNamedConstant(pName, &values[0], arraySz);
 4203|      9|                }
 4204|      7|                else
 4205|      7|                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4206|     16|                break;
 4207|      0|            }
 4208|      0|            case BCT_BOOL:
  ------------------
  |  Branch (4208:13): [True: 0, False: 26]
  ------------------
 4209|      0|            {
 4210|      0|                compiler->addError(ScriptCompiler::CE_DEPRECATEDSYMBOL, prop->file, prop->line,
 4211|      0|                                   "bool. Use uint instead");
 4212|      0|                std::vector<bool> tmp;
 4213|      0|                if(_getVector(arrayStart, arrayEnd, tmp, arraySz))
  ------------------
  |  Branch (4213:20): [True: 0, False: 0]
  ------------------
 4214|      0|                {
 4215|      0|                    std::vector<uint> values(tmp.begin(), tmp.end());
 4216|      0|                    sharedParams->setNamedConstant(pName, &values[0], arraySz);
 4217|      0|                }
 4218|      0|                else
 4219|      0|                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4220|      0|                break;
 4221|      0|            }
 4222|      0|            default:
  ------------------
  |  Branch (4222:13): [True: 0, False: 26]
  ------------------
 4223|      0|                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 4224|      0|                                   "invalid parameter type");
 4225|      0|                break;
 4226|     26|            }
 4227|     26|        }
 4228|     84|    }
_ZN4Ogre24ParticleSystemTranslatorC2Ev:
 4234|      1|        :mSystem(0)
 4235|      1|    {
 4236|      1|    }
_ZN4Ogre24ParticleSystemTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 4239|     19|    {
 4240|     19|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 4241|       |        // Find the name
 4242|     19|        if(obj->name.empty())
  ------------------
  |  Branch (4242:12): [True: 3, False: 16]
  ------------------
 4243|      3|        {
 4244|      3|            compiler->addError(ScriptCompiler::CE_OBJECTNAMEEXPECTED, obj->file, obj->line);
 4245|      3|            return;
 4246|      3|        }
 4247|       |
 4248|       |        // Allocate the particle system
 4249|     16|        CreateParticleSystemScriptCompilerEvent evt(obj->file, obj->name, compiler->getResourceGroup());
 4250|     16|        bool processed = compiler->_fireEvent(&evt, (void*)&mSystem);
 4251|       |
 4252|     16|        if(!processed)
  ------------------
  |  Branch (4252:12): [True: 16, False: 0]
  ------------------
 4253|     16|        {
 4254|     16|            mSystem = ParticleSystemManager::getSingleton().createTemplate(obj->name, compiler->getResourceGroup());
 4255|     16|        }
 4256|       |
 4257|     16|        if(!mSystem)
  ------------------
  |  Branch (4257:12): [True: 0, False: 16]
  ------------------
 4258|      0|        {
 4259|      0|            compiler->addError(ScriptCompiler::CE_OBJECTALLOCATIONERROR, obj->file, obj->line, obj->name);
 4260|      0|            return;
 4261|      0|        }
 4262|       |
 4263|     16|        mSystem->_notifyOrigin(obj->file);
 4264|       |
 4265|     16|        mSystem->removeAllEmitters();
 4266|     16|        mSystem->removeAllAffectors();
 4267|       |
 4268|     16|        obj->context = mSystem;
 4269|       |
 4270|     16|        for(auto & i : obj->children)
  ------------------
  |  Branch (4270:22): [True: 0, False: 16]
  ------------------
 4271|      0|        {
 4272|      0|            if(i->type == ANT_PROPERTY)
  ------------------
  |  Branch (4272:16): [True: 0, False: 0]
  ------------------
 4273|      0|            {
 4274|      0|                PropertyAbstractNode *prop = static_cast<PropertyAbstractNode*>(i.get());
 4275|      0|                if(prop->values.empty())
  ------------------
  |  Branch (4275:20): [True: 0, False: 0]
  ------------------
 4276|      0|                {
 4277|      0|                    compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 4278|      0|                    return;
 4279|      0|                }
 4280|       |
 4281|      0|                String value;
 4282|      0|                if(prop->id == ID_MATERIAL)
  ------------------
  |  Branch (4282:20): [True: 0, False: 0]
  ------------------
 4283|      0|                {
 4284|      0|                    if(prop->values.front()->type == ANT_ATOM)
  ------------------
  |  Branch (4284:24): [True: 0, False: 0]
  ------------------
 4285|      0|                    {
 4286|      0|                        value = ((AtomAbstractNode*)prop->values.front().get())->value;
 4287|       |
 4288|      0|                        ProcessResourceNameScriptCompilerEvent locEvt(ProcessResourceNameScriptCompilerEvent::MATERIAL, value);
 4289|      0|                        compiler->_fireEvent(&locEvt, 0);
 4290|      0|                        value = locEvt.mName;
 4291|      0|                    }
 4292|      0|                }
 4293|      0|                else
 4294|      0|                {
 4295|       |                    // Glob the values together
 4296|      0|                    for(auto& v : prop->values)
  ------------------
  |  Branch (4296:33): [True: 0, False: 0]
  ------------------
 4297|      0|                    {
 4298|      0|                        if(v->type == ANT_ATOM)
  ------------------
  |  Branch (4298:28): [True: 0, False: 0]
  ------------------
 4299|      0|                        {
 4300|      0|                            if(value.empty())
  ------------------
  |  Branch (4300:32): [True: 0, False: 0]
  ------------------
 4301|      0|                                value = ((AtomAbstractNode*)v.get())->value;
 4302|      0|                            else
 4303|      0|                                value = value + " " + ((AtomAbstractNode*)v.get())->value;
 4304|      0|                        }
 4305|      0|                        else
 4306|      0|                        {
 4307|      0|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4308|      0|                            return;
 4309|      0|                        }
 4310|      0|                    }
 4311|      0|                }
 4312|       |
 4313|      0|                if(!mSystem->setParameter(prop->name, value))
  ------------------
  |  Branch (4313:20): [True: 0, False: 0]
  ------------------
 4314|      0|                {
 4315|      0|                    if(auto renderer = mSystem->getRenderer())
  ------------------
  |  Branch (4315:29): [True: 0, False: 0]
  ------------------
 4316|      0|                    {
 4317|      0|                        if(!renderer->setParameter(prop->name, value))
  ------------------
  |  Branch (4317:28): [True: 0, False: 0]
  ------------------
 4318|      0|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4319|      0|                    }
 4320|      0|                }
 4321|      0|            }
 4322|      0|            else
 4323|      0|            {
 4324|      0|                processNode(compiler, i);
 4325|      0|            }
 4326|      0|        }
 4327|     16|    }
_ZN4Ogre25ParticleEmitterTranslatorC2Ev:
 4333|      1|        :mEmitter(0)
 4334|      1|    {
 4335|      1|    }
_ZN4Ogre26ParticleAffectorTranslatorC2Ev:
 4400|      1|        :mAffector(0)
 4401|      1|    {
 4402|      1|    }
_ZN4Ogre20CompositorTranslatorC2Ev:
 4466|      1|        :mCompositor(0)
 4467|      1|    {
 4468|      1|    }
_ZN4Ogre20CompositorTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 4471|  2.01k|    {
 4472|  2.01k|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 4473|  2.01k|        if(obj->name.empty())
  ------------------
  |  Branch (4473:12): [True: 13, False: 1.99k]
  ------------------
 4474|     13|        {
 4475|     13|            compiler->addError(ScriptCompiler::CE_OBJECTNAMEEXPECTED, obj->file, obj->line);
 4476|     13|            return;
 4477|     13|        }
 4478|       |
 4479|       |        // Create the compositor
 4480|  1.99k|        CreateCompositorScriptCompilerEvent evt(obj->file, obj->name, compiler->getResourceGroup());
 4481|  1.99k|        bool processed = compiler->_fireEvent(&evt, (void*)&mCompositor);
 4482|       |
 4483|  1.99k|        if(!processed)
  ------------------
  |  Branch (4483:12): [True: 1.99k, False: 0]
  ------------------
 4484|  1.99k|        {
 4485|  1.99k|            mCompositor = CompositorManager::getSingleton().create(obj->name, compiler->getResourceGroup()).get();
 4486|  1.99k|        }
 4487|       |
 4488|  1.99k|        if(!mCompositor)
  ------------------
  |  Branch (4488:12): [True: 0, False: 1.99k]
  ------------------
 4489|      0|        {
 4490|      0|            compiler->addError(ScriptCompiler::CE_OBJECTALLOCATIONERROR, obj->file, obj->line, obj->name);
 4491|      0|            return;
 4492|      0|        }
 4493|       |
 4494|       |        // Prepare the compositor
 4495|  1.99k|        mCompositor->removeAllTechniques();
 4496|  1.99k|        mCompositor->_notifyOrigin(obj->file);
 4497|  1.99k|        obj->context = mCompositor;
 4498|       |
 4499|  1.99k|        for(auto & i : obj->children)
  ------------------
  |  Branch (4499:22): [True: 3.04k, False: 1.99k]
  ------------------
 4500|  3.04k|        {
 4501|  3.04k|            if(i->type == ANT_OBJECT)
  ------------------
  |  Branch (4501:16): [True: 2.61k, False: 424]
  ------------------
 4502|  2.61k|            {
 4503|  2.61k|                processNode(compiler, i);
 4504|  2.61k|            }
 4505|    424|            else
 4506|    424|            {
 4507|    424|                compiler->addError(ScriptCompiler::CE_UNEXPECTEDTOKEN, i->file, i->line,
 4508|    424|                                   "token not recognized");
 4509|    424|            }
 4510|  3.04k|        }
 4511|  1.99k|    }
_ZN4Ogre30CompositionTechniqueTranslatorC2Ev:
 4517|      1|        :mTechnique(0)
 4518|      1|    {
 4519|      1|    }
_ZN4Ogre30CompositionTechniqueTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 4522|  1.84k|    {
 4523|  1.84k|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 4524|       |
 4525|  1.84k|        Compositor *compositor = any_cast<Compositor*>(obj->parent->context);
 4526|  1.84k|        mTechnique = compositor->createTechnique();
 4527|  1.84k|        obj->context = mTechnique;
 4528|       |
 4529|  1.84k|        String sval;
 4530|  1.84k|        uint32 uival;
 4531|       |
 4532|  1.84k|        for(auto & i : obj->children)
  ------------------
  |  Branch (4532:22): [True: 8.71k, False: 1.62k]
  ------------------
 4533|  8.71k|        {
 4534|  8.71k|            if(i->type == ANT_OBJECT)
  ------------------
  |  Branch (4534:16): [True: 4.03k, False: 4.67k]
  ------------------
 4535|  4.03k|            {
 4536|  4.03k|                processNode(compiler, i);
 4537|  4.03k|            }
 4538|  4.67k|            else if(i->type == ANT_PROPERTY)
  ------------------
  |  Branch (4538:21): [True: 4.00k, False: 669]
  ------------------
 4539|  4.00k|            {
 4540|  4.00k|                PropertyAbstractNode *prop = static_cast<PropertyAbstractNode*>(i.get());
 4541|  4.00k|                switch(prop->id)
 4542|  4.00k|                {
 4543|  2.79k|                case ID_TEXTURE:
  ------------------
  |  Branch (4543:17): [True: 2.79k, False: 1.21k]
  ------------------
 4544|  2.79k|                    {
 4545|  2.79k|                        size_t atomIndex = 1;
 4546|       |
 4547|  2.79k|                        AbstractNodeList::const_iterator it = getNodeAt(prop->values, 0);
 4548|       |
 4549|  2.79k|                        if((*it)->type != ANT_ATOM)
  ------------------
  |  Branch (4549:28): [True: 2, False: 2.79k]
  ------------------
 4550|      2|                        {
 4551|      2|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4552|      2|                            return;
 4553|      2|                        }
 4554|       |                        // Save the first atom, should be name
 4555|  2.79k|                        AtomAbstractNode *atom0 = (AtomAbstractNode*)(*it).get();
 4556|       |
 4557|  2.79k|                        uint32 width = 0, height = 0;
 4558|  2.79k|                        uint32 depth = 1;
 4559|  2.79k|                        float widthFactor = 1.0f, heightFactor = 1.0f;
 4560|  2.79k|                        bool widthSet = false, heightSet = false, formatSet = false;
 4561|  2.79k|                        bool pooled = false;
 4562|  2.79k|                        bool hwGammaWrite = false;
 4563|  2.79k|                        uint32 fsaa = 1;
 4564|  2.79k|                        auto type = TEX_TYPE_2D;
 4565|  2.79k|                        uint16 depthBufferId = RBP_DEFAULT;
 4566|  2.79k|                        CompositionTechnique::TextureScope scope = CompositionTechnique::TS_LOCAL;
 4567|  2.79k|                        Ogre::PixelFormatList formats;
 4568|       |
 4569|  12.1k|                        while (atomIndex < prop->values.size())
  ------------------
  |  Branch (4569:32): [True: 9.52k, False: 2.62k]
  ------------------
 4570|  9.52k|                        {
 4571|  9.52k|                            it = getNodeAt(prop->values, static_cast<int>(atomIndex++));
 4572|  9.52k|                            if((*it)->type != ANT_ATOM)
  ------------------
  |  Branch (4572:32): [True: 1, False: 9.52k]
  ------------------
 4573|      1|                            {
 4574|      1|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4575|      1|                                return;
 4576|      1|                            }
 4577|  9.52k|                            AtomAbstractNode *atom = (AtomAbstractNode*)(*it).get();
 4578|       |
 4579|  9.52k|                            switch(atom->id)
 4580|  9.52k|                            {
 4581|  1.82k|                            case ID_TARGET_WIDTH:
  ------------------
  |  Branch (4581:29): [True: 1.82k, False: 7.69k]
  ------------------
 4582|  1.82k|                                width = 0;
 4583|  1.82k|                                widthSet = true;
 4584|  1.82k|                                break;
 4585|  1.71k|                            case ID_TARGET_HEIGHT:
  ------------------
  |  Branch (4585:29): [True: 1.71k, False: 7.80k]
  ------------------
 4586|  1.71k|                                height = 0;
 4587|  1.71k|                                heightSet = true;
 4588|  1.71k|                                break;
 4589|    315|                            case ID_TARGET_WIDTH_SCALED:
  ------------------
  |  Branch (4589:29): [True: 315, False: 9.20k]
  ------------------
 4590|    618|                            case ID_TARGET_HEIGHT_SCALED:
  ------------------
  |  Branch (4590:29): [True: 303, False: 9.21k]
  ------------------
 4591|    618|                                {
 4592|    618|                                    bool *pSetFlag;
 4593|    618|                                    uint32 *pSize;
 4594|    618|                                    float *pFactor;
 4595|       |
 4596|    618|                                    if (atom->id == ID_TARGET_WIDTH_SCALED)
  ------------------
  |  Branch (4596:41): [True: 315, False: 303]
  ------------------
 4597|    315|                                    {
 4598|    315|                                        pSetFlag = &widthSet;
 4599|    315|                                        pSize = &width;
 4600|    315|                                        pFactor = &widthFactor;
 4601|    315|                                    }
 4602|    303|                                    else
 4603|    303|                                    {
 4604|    303|                                        pSetFlag = &heightSet;
 4605|    303|                                        pSize = &height;
 4606|    303|                                        pFactor = &heightFactor;
 4607|    303|                                    }
 4608|       |                                    // advance to next to get scaling
 4609|    618|                                    it = getNodeAt(prop->values, static_cast<int>(atomIndex++));
 4610|    618|                                    if(prop->values.end() == it || !getValue(*it, *pFactor))
  ------------------
  |  Branch (4610:40): [True: 1, False: 617]
  |  Branch (4610:40): [True: 5, False: 613]
  |  Branch (4610:68): [True: 4, False: 613]
  ------------------
 4611|      5|                                    {
 4612|      5|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4613|      5|                                        return;
 4614|      5|                                    }
 4615|       |
 4616|    613|                                    *pSize = 0;
 4617|    613|                                    *pSetFlag = true;
 4618|    613|                                }
 4619|      0|                                break;
 4620|      0|                            case ID_POOLED:
  ------------------
  |  Branch (4620:29): [True: 0, False: 9.52k]
  ------------------
 4621|      0|                                pooled = true;
 4622|      0|                                break;
 4623|     59|                            case ID_CUBIC:
  ------------------
  |  Branch (4623:29): [True: 59, False: 9.46k]
  ------------------
 4624|     59|                                type = TEX_TYPE_CUBE_MAP;
 4625|     59|                                break;
 4626|      0|                            case ID_2DARRAY:
  ------------------
  |  Branch (4626:29): [True: 0, False: 9.52k]
  ------------------
 4627|      0|                                type = TEX_TYPE_2D_ARRAY;
 4628|      0|                                break;
 4629|      0|                            case ID_2DMS:
  ------------------
  |  Branch (4629:29): [True: 0, False: 9.52k]
  ------------------
 4630|      0|                                type = TEX_TYPE_2D_MULTISAMPLE;
 4631|      0|                                break;
 4632|      0|                            case ID_SCOPE_LOCAL:
  ------------------
  |  Branch (4632:29): [True: 0, False: 9.52k]
  ------------------
 4633|      0|                                scope = CompositionTechnique::TS_LOCAL;
 4634|      0|                                break;
 4635|    229|                            case ID_SCOPE_CHAIN:
  ------------------
  |  Branch (4635:29): [True: 229, False: 9.29k]
  ------------------
 4636|    229|                                scope = CompositionTechnique::TS_CHAIN;
 4637|    229|                                break;
 4638|      0|                            case ID_SCOPE_GLOBAL:
  ------------------
  |  Branch (4638:29): [True: 0, False: 9.52k]
  ------------------
 4639|      0|                                scope = CompositionTechnique::TS_GLOBAL;
 4640|      0|                                break;
 4641|      0|                            case ID_GAMMA:
  ------------------
  |  Branch (4641:29): [True: 0, False: 9.52k]
  ------------------
 4642|      0|                                hwGammaWrite = true;
 4643|      0|                                break;
 4644|     78|                            case ID_NO_FSAA:
  ------------------
  |  Branch (4644:29): [True: 78, False: 9.44k]
  ------------------
 4645|     78|                                fsaa = 0;
 4646|     78|                                break;
 4647|      0|                            case ID_FSAA:
  ------------------
  |  Branch (4647:29): [True: 0, False: 9.52k]
  ------------------
 4648|       |                                // advance to next to get the value
 4649|      0|                                it = getNodeAt(prop->values, atomIndex++);
 4650|      0|                                if(prop->values.end() == it || !getValue(*it, fsaa))
  ------------------
  |  Branch (4650:36): [True: 0, False: 0]
  |  Branch (4650:36): [True: 0, False: 0]
  |  Branch (4650:64): [True: 0, False: 0]
  ------------------
 4651|      0|                                {
 4652|      0|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4653|      0|                                    return;
 4654|      0|                                }
 4655|      0|                                break;
 4656|     78|                            case ID_DEPTH_POOL:
  ------------------
  |  Branch (4656:29): [True: 78, False: 9.44k]
  ------------------
 4657|     78|                                {
 4658|       |                                    // advance to next to get the ID
 4659|     78|                                    it = getNodeAt(prop->values, static_cast<int>(atomIndex++));
 4660|     78|                                    if(prop->values.end() == it || !getValue(*it, uival))
  ------------------
  |  Branch (4660:40): [True: 1, False: 77]
  |  Branch (4660:40): [True: 5, False: 73]
  |  Branch (4660:68): [True: 4, False: 73]
  ------------------
 4661|      5|                                    {
 4662|      5|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4663|      5|                                        return;
 4664|      5|                                    }
 4665|     73|                                    depthBufferId = Math::uint16Cast(uival);
 4666|     73|                                }
 4667|      0|                                break;
 4668|  4.92k|                            default:
  ------------------
  |  Branch (4668:29): [True: 4.92k, False: 4.60k]
  ------------------
 4669|  4.92k|                                if (StringConverter::parse(atom->value, uival))
  ------------------
  |  Branch (4669:37): [True: 1.38k, False: 3.53k]
  ------------------
 4670|  1.38k|                                {
 4671|  1.38k|                                    if (atomIndex == 2)
  ------------------
  |  Branch (4671:41): [True: 699, False: 688]
  ------------------
 4672|    699|                                    {
 4673|    699|                                        width = uival;
 4674|    699|                                        widthSet = true;
 4675|    699|                                    }
 4676|    688|                                    else if (atomIndex == 3)
  ------------------
  |  Branch (4676:46): [True: 682, False: 6]
  ------------------
 4677|    682|                                    {
 4678|    682|                                        height = uival;
 4679|    682|                                        heightSet = true;
 4680|    682|                                    }
 4681|      6|                                    else if (atomIndex == 4)
  ------------------
  |  Branch (4681:46): [True: 4, False: 2]
  ------------------
 4682|      4|                                    {
 4683|      4|                                        depth = uival;
 4684|      4|                                    }
 4685|      2|                                    else
 4686|      2|                                    {
 4687|      2|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 4688|      2|                                        return;
 4689|      2|                                    }
 4690|  1.38k|                                }
 4691|  3.53k|                                else
 4692|  3.53k|                                {
 4693|       |                                    // pixel format?
 4694|  3.53k|                                    PixelFormat format = PixelUtil::getFormatFromName(atom->value, true);
 4695|  3.53k|                                    if (format == PF_UNKNOWN)
  ------------------
  |  Branch (4695:41): [True: 155, False: 3.37k]
  ------------------
 4696|    155|                                    {
 4697|    155|                                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line, atom->value);
 4698|    155|                                        return;
 4699|    155|                                    }
 4700|  3.37k|                                    formats.push_back(format);
 4701|  3.37k|                                    formatSet = true;
 4702|  3.37k|                                }
 4703|       |
 4704|  9.52k|                            }
 4705|  9.52k|                        }
 4706|  2.62k|                        if (!widthSet || !heightSet || !formatSet)
  ------------------
  |  Branch (4706:29): [True: 12, False: 2.61k]
  |  Branch (4706:42): [True: 19, False: 2.59k]
  |  Branch (4706:56): [True: 7, False: 2.58k]
  ------------------
 4707|     38|                        {
 4708|     38|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 4709|     38|                                               "texture definition must specify width, height, and format");
 4710|     38|                            return;
 4711|     38|                        }
 4712|       |
 4713|  2.58k|                        if(depth != 1 && type != TEX_TYPE_2D_ARRAY)
  ------------------
  |  Branch (4713:28): [True: 1, False: 2.58k]
  |  Branch (4713:42): [True: 1, False: 0]
  ------------------
 4714|      1|                        {
 4715|      1|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 4716|      1|                                               "depth only supported for 2d_array textures");
 4717|      1|                            return;
 4718|      1|                        }
 4719|       |
 4720|       |                        // No errors, create
 4721|  2.58k|                        try {
 4722|  2.58k|                            CompositionTechnique::TextureDefinition *def = mTechnique->createTextureDefinition(atom0->value);
 4723|  2.58k|                            def->width = width;
 4724|  2.58k|                            def->height = height;
 4725|  2.58k|                            def->depth = depth;
 4726|  2.58k|                            def->type = type;
 4727|  2.58k|                            def->widthFactor = widthFactor;
 4728|  2.58k|                            def->heightFactor = heightFactor;
 4729|  2.58k|                            def->formatList = formats;
 4730|  2.58k|                            def->fsaa = fsaa;
 4731|  2.58k|                            def->hwGammaWrite = hwGammaWrite;
 4732|  2.58k|                            def->depthBufferId = depthBufferId;
 4733|  2.58k|                            def->pooled = pooled;
 4734|  2.58k|                            def->scope = scope;
 4735|  2.58k|                        }
 4736|  2.58k|                        catch (Exception &e)
 4737|  2.58k|                        {
 4738|    190|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line, e.getDescription());
 4739|    190|                        }
 4740|  2.58k|                    }
 4741|  2.58k|                    break;
 4742|    303|                case ID_TEXTURE_REF:
  ------------------
  |  Branch (4742:17): [True: 303, False: 3.70k]
  ------------------
 4743|    303|                    if(prop->values.empty())
  ------------------
  |  Branch (4743:24): [True: 0, False: 303]
  ------------------
 4744|      0|                    {
 4745|      0|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 4746|      0|                    }
 4747|    303|                    else if(prop->values.size() != 3)
  ------------------
  |  Branch (4747:29): [True: 18, False: 285]
  ------------------
 4748|     18|                    {
 4749|     18|                        compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 4750|     18|                                           "texture_ref only supports 3 argument");
 4751|     18|                    }
 4752|    285|                    else
 4753|    285|                    {
 4754|    285|                        String texName, refCompName, refTexName;
 4755|       |
 4756|    285|                        AbstractNodeList::const_iterator it = getNodeAt(prop->values, 0);
 4757|    285|                        if(!getString(*it, &texName))
  ------------------
  |  Branch (4757:28): [True: 0, False: 285]
  ------------------
 4758|      0|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 4759|      0|                                               "texture_ref must have 3 string arguments");
 4760|       |
 4761|    285|                        it = getNodeAt(prop->values, 1);
 4762|    285|                        if(!getString(*it, &refCompName))
  ------------------
  |  Branch (4762:28): [True: 0, False: 285]
  ------------------
 4763|      0|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 4764|      0|                                               "texture_ref must have 3 string arguments");
 4765|       |
 4766|    285|                        it = getNodeAt(prop->values, 2);
 4767|    285|                        if(!getString(*it, &refTexName))
  ------------------
  |  Branch (4767:28): [True: 1, False: 284]
  ------------------
 4768|      1|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 4769|      1|                                               "texture_ref must have 3 string arguments");
 4770|       |
 4771|    285|                        CompositionTechnique::TextureDefinition* refTexDef =
 4772|    285|                            mTechnique->createTextureDefinition(texName);
 4773|       |
 4774|    285|                        refTexDef->refCompName = refCompName;
 4775|    285|                        refTexDef->refTexName = refTexName;
 4776|    285|                    }
 4777|    303|                    break;
 4778|      5|                case ID_SCHEME:
  ------------------
  |  Branch (4778:17): [True: 5, False: 4.00k]
  ------------------
 4779|      5|                    if(getValue(prop, compiler, sval))
  ------------------
  |  Branch (4779:24): [True: 2, False: 3]
  ------------------
 4780|      2|                        mTechnique->setSchemeName(sval);
 4781|      5|                    break;
 4782|    246|                case ID_COMPOSITOR_LOGIC:
  ------------------
  |  Branch (4782:17): [True: 246, False: 3.76k]
  ------------------
 4783|    246|                    if(getValue(prop, compiler, sval))
  ------------------
  |  Branch (4783:24): [True: 242, False: 4]
  ------------------
 4784|    242|                        mTechnique->setCompositorLogicName(sval);
 4785|    246|                    break;
 4786|    659|                default:
  ------------------
  |  Branch (4786:17): [True: 659, False: 3.34k]
  ------------------
 4787|    659|                    compiler->addError(ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line,
 4788|    659|                                       "token \"" + prop->name + "\" is not recognized");
 4789|  4.00k|                }
 4790|  4.00k|            }
 4791|  8.71k|        }
 4792|  1.84k|    }
_ZN4Ogre31CompositionTargetPassTranslatorC2Ev:
 4798|      1|        :mTarget(0)
 4799|      1|    {
 4800|      1|    }
_ZN4Ogre31CompositionTargetPassTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 4803|  3.66k|    {
 4804|  3.66k|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 4805|       |
 4806|  3.66k|        CompositionTechnique *technique = any_cast<CompositionTechnique*>(obj->parent->context);
 4807|  3.66k|        if(obj->id == ID_TARGET)
  ------------------
  |  Branch (4807:12): [True: 2.48k, False: 1.18k]
  ------------------
 4808|  2.48k|        {
 4809|  2.48k|            mTarget = technique->createTargetPass();
 4810|  2.48k|            if(obj->name.empty())
  ------------------
  |  Branch (4810:16): [True: 5, False: 2.47k]
  ------------------
 4811|      5|            {
 4812|      5|                compiler->addError(ScriptCompiler::CE_OBJECTNAMEEXPECTED, obj->file, obj->line);
 4813|      5|                return;
 4814|      5|            }
 4815|  2.47k|            mTarget->setOutputName(obj->name);
 4816|       |
 4817|  2.47k|            if(!obj->values.empty())
  ------------------
  |  Branch (4817:16): [True: 310, False: 2.16k]
  ------------------
 4818|    310|            {
 4819|    310|                int val;
 4820|    310|                if(getInt(obj->values.front(), &val))
  ------------------
  |  Branch (4820:20): [True: 303, False: 7]
  ------------------
 4821|    303|                    mTarget->setOutputSlice(val);
 4822|    310|            }
 4823|  2.47k|        }
 4824|  1.18k|        else if(obj->id == ID_TARGET_OUTPUT)
  ------------------
  |  Branch (4824:17): [True: 1.17k, False: 10]
  ------------------
 4825|  1.17k|        {
 4826|  1.17k|            mTarget = technique->getOutputTargetPass();
 4827|  1.17k|            if (!mTarget->getPasses().empty() || mTarget->getInputMode() != CompositionTargetPass::IM_NONE)
  ------------------
  |  Branch (4827:17): [True: 39, False: 1.13k]
  |  Branch (4827:50): [True: 11, False: 1.12k]
  ------------------
 4828|     50|            {
 4829|     50|                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, obj->file, obj->line,
 4830|     50|                                   "target_output can only be used once per technique");
 4831|     50|            }
 4832|  1.17k|        }
 4833|  3.65k|        obj->context = mTarget;
 4834|       |
 4835|  3.65k|        bool bval;
 4836|  3.65k|        Real fval;
 4837|  3.65k|        uint32 uival;
 4838|  3.65k|        String sval;
 4839|       |
 4840|  3.65k|        for(auto & i : obj->children)
  ------------------
  |  Branch (4840:22): [True: 8.81k, False: 3.65k]
  ------------------
 4841|  8.81k|        {
 4842|  8.81k|            if(i->type == ANT_OBJECT)
  ------------------
  |  Branch (4842:16): [True: 3.18k, False: 5.62k]
  ------------------
 4843|  3.18k|            {
 4844|  3.18k|                processNode(compiler, i);
 4845|  3.18k|            }
 4846|  5.62k|            else if(i->type == ANT_PROPERTY)
  ------------------
  |  Branch (4846:21): [True: 5.30k, False: 324]
  ------------------
 4847|  5.30k|            {
 4848|  5.30k|                PropertyAbstractNode *prop = static_cast<PropertyAbstractNode*>(i.get());
 4849|  5.30k|                switch(prop->id)
 4850|  5.30k|                {
 4851|  4.01k|                case ID_INPUT:
  ------------------
  |  Branch (4851:17): [True: 4.01k, False: 1.28k]
  ------------------
 4852|  4.01k|                    CompositionTargetPass::InputMode im;
 4853|  4.01k|                    if(getValue(prop, compiler, im))
  ------------------
  |  Branch (4853:24): [True: 3.91k, False: 105]
  ------------------
 4854|  3.91k|                        mTarget->setInputMode(im);
 4855|  4.01k|                    break;
 4856|      1|                case ID_ONLY_INITIAL:
  ------------------
  |  Branch (4856:17): [True: 1, False: 5.30k]
  ------------------
 4857|      1|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (4857:24): [True: 0, False: 1]
  ------------------
 4858|      0|                        mTarget->setOnlyInitial(bval);
 4859|      1|                    break;
 4860|    220|                case ID_VISIBILITY_MASK:
  ------------------
  |  Branch (4860:17): [True: 220, False: 5.08k]
  ------------------
 4861|    220|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (4861:24): [True: 207, False: 13]
  ------------------
 4862|    207|                        mTarget->setVisibilityMask(uival);
 4863|    220|                    break;
 4864|      3|                case ID_LOD_BIAS:
  ------------------
  |  Branch (4864:17): [True: 3, False: 5.30k]
  ------------------
 4865|      3|                    if(getValue(prop, compiler, fval))
  ------------------
  |  Branch (4865:24): [True: 0, False: 3]
  ------------------
 4866|      0|                        mTarget->setLodBias(fval);
 4867|      3|                    break;
 4868|    165|                case ID_MATERIAL_SCHEME:
  ------------------
  |  Branch (4868:17): [True: 165, False: 5.13k]
  ------------------
 4869|    165|                    if(getValue(prop, compiler, sval))
  ------------------
  |  Branch (4869:24): [True: 153, False: 12]
  ------------------
 4870|    153|                        mTarget->setMaterialScheme(sval);
 4871|    165|                    break;
 4872|     58|                case ID_SHADOWS_ENABLED:
  ------------------
  |  Branch (4872:17): [True: 58, False: 5.24k]
  ------------------
 4873|     58|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (4873:24): [True: 53, False: 5]
  ------------------
 4874|     53|                        mTarget->setShadowsEnabled(bval);
 4875|     58|                    break;
 4876|    841|                default:
  ------------------
  |  Branch (4876:17): [True: 841, False: 4.46k]
  ------------------
 4877|    841|                    compiler->addError(ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line,
 4878|    841|                                       "token \"" + prop->name + "\" is not recognized");
 4879|  5.30k|                }
 4880|  5.30k|            }
 4881|  8.81k|        }
 4882|  3.65k|    }
_ZN4Ogre25CompositionPassTranslatorC2Ev:
 4888|      1|        :mPass(0)
 4889|      1|    {
 4890|      1|    }
_ZN4Ogre25CompositionPassTranslator9translateEPNS_14ScriptCompilerERKNS_9SharedPtrINS_12AbstractNodeEEE:
 4893|  2.72k|    {
 4894|  2.72k|        ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 4895|       |
 4896|       |        // The name is the type of the pass
 4897|  2.72k|        if(obj->values.empty() || obj->values.front()->type != ANT_ATOM)
  ------------------
  |  Branch (4897:12): [True: 83, False: 2.63k]
  |  Branch (4897:35): [True: 0, False: 2.63k]
  ------------------
 4898|     83|        {
 4899|     83|            compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, obj->file, obj->line, "pass type missing");
 4900|     83|            return;
 4901|     83|        }
 4902|       |
 4903|  2.63k|        AtomAbstractNode* atom = static_cast<AtomAbstractNode*>(obj->values.front().get());
 4904|       |
 4905|  2.63k|        CompositionPass::PassType ptype;
 4906|  2.63k|        switch(atom->id)
 4907|  2.63k|        {
 4908|    540|            case ID_CLEAR:
  ------------------
  |  Branch (4908:13): [True: 540, False: 2.09k]
  ------------------
 4909|    540|                ptype = CompositionPass::PT_CLEAR;
 4910|    540|                break;
 4911|      1|            case ID_STENCIL:
  ------------------
  |  Branch (4911:13): [True: 1, False: 2.63k]
  ------------------
 4912|      1|                ptype = CompositionPass::PT_STENCIL;
 4913|      1|                break;
 4914|  1.68k|            case ID_RENDER_QUAD:
  ------------------
  |  Branch (4914:13): [True: 1.68k, False: 955]
  ------------------
 4915|  1.68k|                ptype = CompositionPass::PT_RENDERQUAD;
 4916|  1.68k|                break;
 4917|    326|            case ID_RENDER_SCENE:
  ------------------
  |  Branch (4917:13): [True: 326, False: 2.31k]
  ------------------
 4918|    326|                ptype = CompositionPass::PT_RENDERSCENE;
 4919|    326|                break;
 4920|     42|            case ID_COMPUTE:
  ------------------
  |  Branch (4920:13): [True: 42, False: 2.59k]
  ------------------
 4921|     42|                ptype = CompositionPass::PT_COMPUTE;
 4922|     42|                break;
 4923|     12|            case ID_RENDER_CUSTOM:
  ------------------
  |  Branch (4923:13): [True: 12, False: 2.62k]
  ------------------
 4924|     12|                ptype = CompositionPass::PT_RENDERCUSTOM;
 4925|     12|                break;
 4926|     34|            default:
  ------------------
  |  Branch (4926:13): [True: 34, False: 2.60k]
  ------------------
 4927|     34|                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, obj->file, obj->line, atom->value);
 4928|     34|                return;
 4929|  2.63k|        }
 4930|       |
 4931|  2.60k|        CompositionTargetPass *target = any_cast<CompositionTargetPass*>(obj->parent->context);
 4932|  2.60k|        mPass = target->createPass(ptype);
 4933|  2.60k|        obj->context = mPass;
 4934|       |
 4935|  2.60k|        if(mPass->getType() == CompositionPass::PT_RENDERCUSTOM)
  ------------------
  |  Branch (4935:12): [True: 12, False: 2.59k]
  ------------------
 4936|     12|        {
 4937|     12|            String customType;
 4938|       |            //This is the ugly one liner for safe access to the second parameter.
 4939|     12|            if (obj->values.size() < 2 || !getString(*(++(obj->values.begin())), &customType))
  ------------------
  |  Branch (4939:17): [True: 1, False: 11]
  |  Branch (4939:17): [True: 1, False: 11]
  |  Branch (4939:43): [True: 0, False: 11]
  ------------------
 4940|      1|            {
 4941|      1|                compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, obj->file, obj->line);
 4942|      1|                return;
 4943|      1|            }
 4944|     11|            mPass->setCustomType(customType);
 4945|     11|        }
 4946|       |
 4947|  2.60k|        Real fval;
 4948|  2.60k|        bool bval;
 4949|  2.60k|        uint32 uival;
 4950|  2.60k|        String sval;
 4951|  2.60k|        StencilOperation sop;
 4952|       |
 4953|  2.60k|        for(auto & i : obj->children)
  ------------------
  |  Branch (4953:22): [True: 5.35k, False: 2.52k]
  ------------------
 4954|  5.35k|        {
 4955|  5.35k|            if(i->type == ANT_OBJECT)
  ------------------
  |  Branch (4955:16): [True: 139, False: 5.21k]
  ------------------
 4956|    139|            {
 4957|    139|                processNode(compiler, i);
 4958|    139|            }
 4959|  5.21k|            else if(i->type == ANT_PROPERTY)
  ------------------
  |  Branch (4959:21): [True: 4.99k, False: 225]
  ------------------
 4960|  4.99k|            {
 4961|  4.99k|                PropertyAbstractNode *prop = static_cast<PropertyAbstractNode*>(i.get());
 4962|  4.99k|                switch(prop->id)
 4963|  4.99k|                {
 4964|      0|                case ID_CHECK:
  ------------------
  |  Branch (4964:17): [True: 0, False: 4.99k]
  ------------------
 4965|      0|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (4965:24): [True: 0, False: 0]
  ------------------
 4966|      0|                        mPass->setStencilCheck(bval);
 4967|      0|                    break;
 4968|      1|                case ID_COMP_FUNC:
  ------------------
  |  Branch (4968:17): [True: 1, False: 4.99k]
  ------------------
 4969|      1|                    CompareFunction func;
 4970|      1|                    if(getValue(prop, compiler, func))
  ------------------
  |  Branch (4970:24): [True: 0, False: 1]
  ------------------
 4971|      0|                        mPass->setStencilFunc(func);
 4972|      1|                    break;
 4973|      1|                case ID_REF_VALUE:
  ------------------
  |  Branch (4973:17): [True: 1, False: 4.99k]
  ------------------
 4974|      1|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (4974:24): [True: 0, False: 1]
  ------------------
 4975|      0|                        mPass->setStencilRefValue(uival);
 4976|      1|                    break;
 4977|      1|                case ID_MASK:
  ------------------
  |  Branch (4977:17): [True: 1, False: 4.99k]
  ------------------
 4978|      1|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (4978:24): [True: 0, False: 1]
  ------------------
 4979|      0|                        mPass->setStencilMask(uival);
 4980|      1|                    break;
 4981|      1|                case ID_FAIL_OP:
  ------------------
  |  Branch (4981:17): [True: 1, False: 4.99k]
  ------------------
 4982|      1|                    if(getValue(prop, compiler, sop))
  ------------------
  |  Branch (4982:24): [True: 0, False: 1]
  ------------------
 4983|      0|                        mPass->setStencilFailOp(sop);
 4984|      1|                    break;
 4985|      3|                case ID_DEPTH_FAIL_OP:
  ------------------
  |  Branch (4985:17): [True: 3, False: 4.99k]
  ------------------
 4986|      3|                    if(getValue(prop, compiler, sop))
  ------------------
  |  Branch (4986:24): [True: 0, False: 3]
  ------------------
 4987|      0|                        mPass->setStencilDepthFailOp(sop);
 4988|      3|                    break;
 4989|     13|                case ID_PASS_OP:
  ------------------
  |  Branch (4989:17): [True: 13, False: 4.98k]
  ------------------
 4990|     13|                    if(getValue(prop, compiler, sop))
  ------------------
  |  Branch (4990:24): [True: 0, False: 13]
  ------------------
 4991|      0|                        mPass->setStencilPassOp(sop);
 4992|     13|                    break;
 4993|      9|                case ID_TWO_SIDED:
  ------------------
  |  Branch (4993:17): [True: 9, False: 4.98k]
  ------------------
 4994|      9|                    if(getValue(prop, compiler, bval))
  ------------------
  |  Branch (4994:24): [True: 0, False: 9]
  ------------------
 4995|      0|                        mPass->setStencilTwoSidedOperation(bval);
 4996|      9|                    break;
 4997|     64|                case ID_BUFFERS:
  ------------------
  |  Branch (4997:17): [True: 64, False: 4.93k]
  ------------------
 4998|     64|                    {
 4999|     64|                        uint32 buffers = 0;
 5000|     64|                        for(const auto& v : prop->values)
  ------------------
  |  Branch (5000:43): [True: 136, False: 64]
  ------------------
 5001|    136|                        {
 5002|    136|                            if(v->type == ANT_ATOM)
  ------------------
  |  Branch (5002:32): [True: 130, False: 6]
  ------------------
 5003|    130|                            {
 5004|    130|                                switch(((AtomAbstractNode*)v.get())->id)
 5005|    130|                                {
 5006|     61|                                case ID_COLOUR:
  ------------------
  |  Branch (5006:33): [True: 61, False: 69]
  ------------------
 5007|     61|                                    buffers |= FBT_COLOUR;
 5008|     61|                                    break;
 5009|     24|                                case ID_DEPTH:
  ------------------
  |  Branch (5009:33): [True: 24, False: 106]
  ------------------
 5010|     24|                                    buffers |= FBT_DEPTH;
 5011|     24|                                    break;
 5012|     20|                                case ID_STENCIL:
  ------------------
  |  Branch (5012:33): [True: 20, False: 110]
  ------------------
 5013|     20|                                    buffers |= FBT_STENCIL;
 5014|     20|                                    break;
 5015|     25|                                default:
  ------------------
  |  Branch (5015:33): [True: 25, False: 105]
  ------------------
 5016|     25|                                    compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 5017|    130|                                }
 5018|    130|                            }
 5019|      6|                            else
 5020|      6|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 5021|    136|                        }
 5022|     64|                        mPass->setClearBuffers(buffers);
 5023|     64|                    }
 5024|      0|                    break;
 5025|     20|                case ID_COLOUR_VALUE:
  ------------------
  |  Branch (5025:17): [True: 20, False: 4.97k]
  ------------------
 5026|     20|                    {
 5027|     20|                        if(prop->values.empty())
  ------------------
  |  Branch (5027:28): [True: 1, False: 19]
  ------------------
 5028|      1|                        {
 5029|      1|                            compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line);
 5030|      1|                            return;
 5031|      1|                        }
 5032|     19|                        ColourValue val;
 5033|     19|                        if (prop->values.front()->type == ANT_ATOM &&
  ------------------
  |  Branch (5033:29): [True: 18, False: 1]
  ------------------
 5034|     18|                            ((AtomAbstractNode*)prop->values.front().get())->id == ID_AUTO)
  ------------------
  |  Branch (5034:29): [True: 0, False: 18]
  ------------------
 5035|      0|                            mPass->setAutomaticColour(true);
 5036|     19|                        else if(getColour(prop->values.begin(), prop->values.end(), &val))
  ------------------
  |  Branch (5036:33): [True: 12, False: 7]
  ------------------
 5037|     12|                            mPass->setClearColour(val);
 5038|      7|                        else
 5039|      7|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 5040|     19|                    }
 5041|      0|                    break;
 5042|     23|                case ID_DEPTH_VALUE:
  ------------------
  |  Branch (5042:17): [True: 23, False: 4.97k]
  ------------------
 5043|     23|                    if(getValue(prop, compiler, fval))
  ------------------
  |  Branch (5043:24): [True: 19, False: 4]
  ------------------
 5044|     19|                        mPass->setClearDepth(fval);
 5045|     23|                    break;
 5046|      4|                case ID_STENCIL_VALUE:
  ------------------
  |  Branch (5046:17): [True: 4, False: 4.99k]
  ------------------
 5047|      4|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (5047:24): [True: 0, False: 4]
  ------------------
 5048|      0|                        mPass->setClearStencil(uival);
 5049|      4|                    break;
 5050|  1.79k|                case ID_MATERIAL:
  ------------------
  |  Branch (5050:17): [True: 1.79k, False: 3.20k]
  ------------------
 5051|  1.79k|                    if(getValue(prop, compiler, sval))
  ------------------
  |  Branch (5051:24): [True: 1.77k, False: 17]
  ------------------
 5052|  1.77k|                    {
 5053|  1.77k|                        ProcessResourceNameScriptCompilerEvent evt(ProcessResourceNameScriptCompilerEvent::MATERIAL, sval);
 5054|  1.77k|                        compiler->_fireEvent(&evt, 0);
 5055|  1.77k|                        auto mat = MaterialManager::getSingleton().getByName(evt.mName, compiler->getResourceGroup());
 5056|  1.77k|                        if (mat)
  ------------------
  |  Branch (5056:29): [True: 95, False: 1.67k]
  ------------------
 5057|     95|                            mPass->setMaterial(mat);
 5058|  1.67k|                        else
 5059|  1.67k|                            compiler->addError(ScriptCompiler::CE_REFERENCETOANONEXISTINGOBJECT, prop->file,
 5060|  1.67k|                                               prop->line, evt.mName);
 5061|  1.77k|                    }
 5062|  1.79k|                    break;
 5063|  1.81k|                case ID_INPUT:
  ------------------
  |  Branch (5063:17): [True: 1.81k, False: 3.17k]
  ------------------
 5064|  1.81k|                    if(prop->values.size() < 2)
  ------------------
  |  Branch (5064:24): [True: 11, False: 1.80k]
  ------------------
 5065|     11|                    {
 5066|     11|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 5067|     11|                        return;
 5068|     11|                    }
 5069|  1.80k|                    else if (prop->values.size() > 3)
  ------------------
  |  Branch (5069:30): [True: 18, False: 1.78k]
  ------------------
 5070|     18|                    {
 5071|     18|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line);
 5072|     18|                        return;
 5073|     18|                    }
 5074|  1.78k|                    else
 5075|  1.78k|                    {
 5076|  1.78k|                        AbstractNodeList::const_iterator i0 = getNodeAt(prop->values, 0), i1 = getNodeAt(prop->values, 1), i2 = getNodeAt(prop->values, 2);
 5077|  1.78k|                        uint32 id;
 5078|  1.78k|                        String name;
 5079|  1.78k|                        if(getUInt(*i0, &id) && getString(*i1, &name))
  ------------------
  |  Branch (5079:28): [True: 1.76k, False: 26]
  |  Branch (5079:49): [True: 1.76k, False: 1]
  ------------------
 5080|  1.76k|                        {
 5081|  1.76k|                            uint32 index = 0;
 5082|  1.76k|                            if(i2 != prop->values.end())
  ------------------
  |  Branch (5082:32): [True: 381, False: 1.38k]
  ------------------
 5083|    381|                            {
 5084|    381|                                if(!getUInt(*i2, &index))
  ------------------
  |  Branch (5084:36): [True: 10, False: 371]
  ------------------
 5085|     10|                                {
 5086|     10|                                    compiler->addError(ScriptCompiler::CE_NUMBEREXPECTED, prop->file, prop->line);
 5087|     10|                                    return;
 5088|     10|                                }
 5089|    381|                            }
 5090|       |
 5091|  1.75k|                            if(id >= OGRE_MAX_TEXTURE_LAYERS)
  ------------------
  |  Branch (5091:32): [True: 16, False: 1.73k]
  ------------------
 5092|     16|                            {
 5093|     16|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
 5094|     16|                                                   "input id must be less than " +
 5095|     16|                                                       std::to_string(OGRE_MAX_TEXTURE_LAYERS));
 5096|     16|                                return;
 5097|     16|                            }
 5098|       |
 5099|  1.73k|                            mPass->setInput(id, name, index);
 5100|  1.73k|                        }
 5101|     27|                        else
 5102|     27|                        {
 5103|     27|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 5104|     27|                        }
 5105|  1.78k|                    }
 5106|  1.76k|                    break;
 5107|  1.76k|                case ID_IDENTIFIER:
  ------------------
  |  Branch (5107:17): [True: 477, False: 4.51k]
  ------------------
 5108|    477|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (5108:24): [True: 468, False: 9]
  ------------------
 5109|    468|                        mPass->setIdentifier(uival);
 5110|    477|                    break;
 5111|     36|                case ID_FIRST_RENDER_QUEUE:
  ------------------
  |  Branch (5111:17): [True: 36, False: 4.95k]
  ------------------
 5112|     36|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (5112:24): [True: 33, False: 3]
  ------------------
 5113|     33|                        mPass->setFirstRenderQueue(static_cast<uint8>(uival));
 5114|     36|                    break;
 5115|     56|                case ID_LAST_RENDER_QUEUE:
  ------------------
  |  Branch (5115:17): [True: 56, False: 4.93k]
  ------------------
 5116|     56|                    if(getValue(prop, compiler, uival))
  ------------------
  |  Branch (5116:24): [True: 53, False: 3]
  ------------------
 5117|     53|                        mPass->setLastRenderQueue(static_cast<uint8>(uival));
 5118|     56|                    break;
 5119|     22|                case ID_MATERIAL_SCHEME:
  ------------------
  |  Branch (5119:17): [True: 22, False: 4.97k]
  ------------------
 5120|     22|                    if(getValue(prop, compiler, sval))
  ------------------
  |  Branch (5120:24): [True: 17, False: 5]
  ------------------
 5121|     17|                        mPass->setMaterialScheme(sval);
 5122|     22|                    break;
 5123|     42|                case ID_THREAD_GROUPS:
  ------------------
  |  Branch (5123:17): [True: 42, False: 4.95k]
  ------------------
 5124|     42|                {
 5125|     42|                    std::vector<int> g;
 5126|     42|                    if(_getVector(prop->values.begin(), prop->values.end(), g, 3))
  ------------------
  |  Branch (5126:24): [True: 41, False: 1]
  ------------------
 5127|     41|                        mPass->setThreadGroups({g[0], g[1], g[2]});
 5128|     42|                    break;
 5129|  1.81k|                }
 5130|    196|                case ID_QUAD_NORMALS:
  ------------------
  |  Branch (5130:17): [True: 196, False: 4.79k]
  ------------------
 5131|    196|                    if(prop->values.empty())
  ------------------
  |  Branch (5131:24): [True: 2, False: 194]
  ------------------
 5132|      2|                    {
 5133|      2|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 5134|      2|                        return;
 5135|      2|                    }
 5136|    194|                    else if (prop->values.size() > 1)
  ------------------
  |  Branch (5136:30): [True: 5, False: 189]
  ------------------
 5137|      5|                    {
 5138|      5|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line);
 5139|      5|                        return;
 5140|      5|                    }
 5141|    189|                    else
 5142|    189|                    {
 5143|    189|                        if(prop->values.front()->type == ANT_ATOM)
  ------------------
  |  Branch (5143:28): [True: 188, False: 1]
  ------------------
 5144|    188|                        {
 5145|    188|                            atom = static_cast<AtomAbstractNode*>(prop->values.front().get());
 5146|    188|                            if(atom->id == ID_CAMERA_FAR_CORNERS_VIEW_SPACE)
  ------------------
  |  Branch (5146:32): [True: 172, False: 16]
  ------------------
 5147|    172|                                mPass->setQuadFarCorners(true, true);
 5148|     16|                            else if(atom->id == ID_CAMERA_FAR_CORNERS_WORLD_SPACE)
  ------------------
  |  Branch (5148:37): [True: 0, False: 16]
  ------------------
 5149|      0|                                mPass->setQuadFarCorners(true, false);
 5150|     16|                            else
 5151|     16|                                compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 5152|    188|                        }
 5153|      1|                        else
 5154|      1|                        {
 5155|      1|                            compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line);
 5156|      1|                        }
 5157|    189|                    }
 5158|    189|                    break;
 5159|    189|                case ID_CAMERA:
  ------------------
  |  Branch (5159:17): [True: 134, False: 4.86k]
  ------------------
 5160|    134|                    if(prop->values.empty())
  ------------------
  |  Branch (5160:24): [True: 0, False: 134]
  ------------------
 5161|      0|                    {
 5162|      0|                        compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
 5163|      0|                        return;
 5164|      0|                    }
 5165|    134|                    else if (prop->values.size() > 2)
  ------------------
  |  Branch (5165:30): [True: 16, False: 118]
  ------------------
 5166|     16|                    {
 5167|     16|                        compiler->addError(ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line);
 5168|     16|                        return;
 5169|     16|                    }
 5170|    118|                    else
 5171|    118|                    {
 5172|    118|                        if (!getValue(prop->values.front(), sval))
  ------------------
  |  Branch (5172:29): [True: 0, False: 118]
  ------------------
 5173|      0|                            return;
 5174|    118|                        mPass->setCameraName(sval);
 5175|    118|                        if (prop->values.back()->type == ANT_ATOM &&
  ------------------
  |  Branch (5175:29): [True: 107, False: 11]
  ------------------
 5176|    107|                            static_cast<AtomAbstractNode*>(prop->values.back().get())->id ==
  ------------------
  |  Branch (5176:29): [True: 74, False: 33]
  ------------------
 5177|    107|                                ID_ALIGN_TO_FACE)
 5178|     74|                        {
 5179|     74|                            mPass->setAlignCameraToFace(true);
 5180|     74|                        }
 5181|    118|                    }
 5182|    118|                    break;
 5183|    282|                default:
  ------------------
  |  Branch (5183:17): [True: 282, False: 4.71k]
  ------------------
 5184|    282|                    compiler->addError(ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line,
 5185|    282|                                       "token \"" + prop->name + "\" is not recognized");
 5186|  4.99k|                }
 5187|  4.99k|            }
 5188|  5.35k|        }
 5189|  2.60k|    }
_ZN4Ogre30BuiltinScriptTranslatorManagerC2Ev:
 5195|      1|    {
 5196|      1|    }
_ZN4Ogre30BuiltinScriptTranslatorManager13getTranslatorERKNS_9SharedPtrINS_12AbstractNodeEEE:
 5199|  98.1k|    {
 5200|  98.1k|        ScriptTranslator *translator = 0;
 5201|       |
 5202|  98.1k|        if(node->type == ANT_OBJECT)
  ------------------
  |  Branch (5202:12): [True: 80.9k, False: 17.2k]
  ------------------
 5203|  80.9k|        {
 5204|  80.9k|            ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get());
 5205|  80.9k|            ObjectAbstractNode *parent = obj->parent && obj->parent->type == ANT_OBJECT ? static_cast<ObjectAbstractNode*>(obj->parent) : 0;
  ------------------
  |  Branch (5205:42): [True: 57.4k, False: 23.4k]
  |  Branch (5205:57): [True: 57.4k, False: 0]
  ------------------
 5206|  80.9k|            if(obj->id == ID_MATERIAL)
  ------------------
  |  Branch (5206:16): [True: 13.1k, False: 67.7k]
  ------------------
 5207|  13.1k|                translator = &mMaterialTranslator;
 5208|  67.7k|            else if(obj->id == ID_TECHNIQUE && parent && parent->id == ID_MATERIAL)
  ------------------
  |  Branch (5208:21): [True: 14.5k, False: 53.2k]
  |  Branch (5208:48): [True: 14.3k, False: 200]
  |  Branch (5208:58): [True: 12.3k, False: 2.06k]
  ------------------
 5209|  12.3k|                translator = &mTechniqueTranslator;
 5210|  55.4k|            else if(obj->id == ID_PASS && parent && parent->id == ID_TECHNIQUE)
  ------------------
  |  Branch (5210:21): [True: 15.5k, False: 39.9k]
  |  Branch (5210:43): [True: 15.2k, False: 323]
  |  Branch (5210:53): [True: 12.1k, False: 3.05k]
  ------------------
 5211|  12.1k|                translator = &mPassTranslator;
 5212|  43.2k|            else if(obj->id == ID_TEXTURE_UNIT && parent && parent->id == ID_PASS)
  ------------------
  |  Branch (5212:21): [True: 13.6k, False: 29.6k]
  |  Branch (5212:51): [True: 13.5k, False: 164]
  |  Branch (5212:61): [True: 12.6k, False: 888]
  ------------------
 5213|  12.6k|                translator = &mTextureUnitTranslator;
 5214|  30.6k|            else if(obj->id == ID_TEXTURE_SOURCE && parent && parent->id == ID_TEXTURE_UNIT)
  ------------------
  |  Branch (5214:21): [True: 27, False: 30.6k]
  |  Branch (5214:53): [True: 25, False: 2]
  |  Branch (5214:63): [True: 8, False: 17]
  ------------------
 5215|      8|                translator = &mTextureSourceTranslator;
 5216|  30.6k|            else if(obj->id == ID_FRAGMENT_PROGRAM ||
  ------------------
  |  Branch (5216:21): [True: 2.79k, False: 27.8k]
  ------------------
 5217|  27.8k|                    obj->id == ID_VERTEX_PROGRAM ||
  ------------------
  |  Branch (5217:21): [True: 1.30k, False: 26.5k]
  ------------------
 5218|  26.5k|                    obj->id == ID_GEOMETRY_PROGRAM ||
  ------------------
  |  Branch (5218:21): [True: 749, False: 25.8k]
  ------------------
 5219|  25.8k|                    obj->id == ID_TESSELLATION_HULL_PROGRAM ||
  ------------------
  |  Branch (5219:21): [True: 96, False: 25.7k]
  ------------------
 5220|  25.7k|                    obj->id == ID_TESSELLATION_DOMAIN_PROGRAM ||
  ------------------
  |  Branch (5220:21): [True: 113, False: 25.6k]
  ------------------
 5221|  25.6k|                    obj->id == ID_COMPUTE_PROGRAM ||
  ------------------
  |  Branch (5221:21): [True: 74, False: 25.5k]
  ------------------
 5222|  25.5k|                    obj->id == ID_MESH_PROGRAM ||
  ------------------
  |  Branch (5222:21): [True: 11, False: 25.5k]
  ------------------
 5223|  25.5k|                    obj->id == ID_TASK_PROGRAM)
  ------------------
  |  Branch (5223:21): [True: 0, False: 25.5k]
  ------------------
 5224|  5.14k|                translator = &mGpuProgramTranslator;
 5225|  25.5k|            else if(obj->id == ID_SHARED_PARAMS)
  ------------------
  |  Branch (5225:21): [True: 90, False: 25.4k]
  ------------------
 5226|     90|                translator = &mSharedParamsTranslator;
 5227|  25.4k|            else if(obj->id == ID_PARTICLE_SYSTEM)
  ------------------
  |  Branch (5227:21): [True: 19, False: 25.4k]
  ------------------
 5228|     19|                translator = &mParticleSystemTranslator;
 5229|  25.4k|            else if(obj->id == ID_EMITTER && parent && parent->id == ID_PARTICLE_SYSTEM)
  ------------------
  |  Branch (5229:21): [True: 25, False: 25.3k]
  |  Branch (5229:46): [True: 10, False: 15]
  |  Branch (5229:56): [True: 0, False: 10]
  ------------------
 5230|      0|                translator = &mParticleEmitterTranslator;
 5231|  25.4k|            else if(obj->id == ID_AFFECTOR && parent && parent->id == ID_PARTICLE_SYSTEM)
  ------------------
  |  Branch (5231:21): [True: 76, False: 25.3k]
  |  Branch (5231:47): [True: 39, False: 37]
  |  Branch (5231:57): [True: 0, False: 39]
  ------------------
 5232|      0|                translator = &mParticleAffectorTranslator;
 5233|  25.4k|            else if(obj->id == ID_COMPOSITOR)
  ------------------
  |  Branch (5233:21): [True: 2.01k, False: 23.4k]
  ------------------
 5234|  2.01k|                translator = &mCompositorTranslator;
 5235|  23.4k|            else if(obj->id == ID_TECHNIQUE && parent && parent->id == ID_COMPOSITOR)
  ------------------
  |  Branch (5235:21): [True: 2.26k, False: 21.1k]
  |  Branch (5235:48): [True: 2.06k, False: 200]
  |  Branch (5235:58): [True: 1.84k, False: 227]
  ------------------
 5236|  1.84k|                translator = &mCompositionTechniqueTranslator;
 5237|  21.5k|            else if((obj->id == ID_TARGET || obj->id == ID_TARGET_OUTPUT) && parent && parent->id == ID_TECHNIQUE)
  ------------------
  |  Branch (5237:22): [True: 2.81k, False: 18.7k]
  |  Branch (5237:46): [True: 1.37k, False: 17.3k]
  |  Branch (5237:78): [True: 4.12k, False: 68]
  |  Branch (5237:88): [True: 3.66k, False: 464]
  ------------------
 5238|  3.66k|                translator = &mCompositionTargetPassTranslator;
 5239|  17.8k|            else if(obj->id == ID_PASS && parent && (parent->id == ID_TARGET || parent->id == ID_TARGET_OUTPUT))
  ------------------
  |  Branch (5239:21): [True: 3.37k, False: 14.5k]
  |  Branch (5239:43): [True: 3.05k, False: 323]
  |  Branch (5239:54): [True: 1.66k, False: 1.39k]
  |  Branch (5239:81): [True: 1.06k, False: 333]
  ------------------
 5240|  2.72k|                translator = &mCompositionPassTranslator;
 5241|  15.1k|            else if(obj->id == ID_SAMPLER)
  ------------------
  |  Branch (5241:21): [True: 185, False: 14.9k]
  ------------------
 5242|    185|                translator = &mSamplerTranslator;
 5243|  80.9k|        }
 5244|       |
 5245|  98.1k|        return translator;
 5246|  98.1k|    }
OgreScriptTranslator.cpp:_ZN4OgreL19applyTextureAliasesEPNS_14ScriptCompilerEPKNS_8MaterialERKNSt3__13mapINS5_12basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEESC_NS5_4lessISC_EENSA_INS5_4pairIKSC_SC_EEEEEE:
   49|  12.1k|    {
   50|  12.1k|        for (auto t : mat->getTechniques())
  ------------------
  |  Branch (50:21): [True: 11.8k, False: 12.1k]
  ------------------
   51|  11.8k|        {
   52|  11.8k|            for (auto p : t->getPasses())
  ------------------
  |  Branch (52:25): [True: 11.7k, False: 11.8k]
  ------------------
   53|  11.7k|            {
   54|  11.7k|                for (auto tus : p->getTextureUnitStates())
  ------------------
  |  Branch (54:31): [True: 12.3k, False: 11.7k]
  ------------------
   55|  12.3k|                {
   56|  12.3k|                    auto aliasIt = aliasList.find(tus->getName());
   57|  12.3k|                    if (aliasIt == aliasList.end())
  ------------------
  |  Branch (57:25): [True: 12.3k, False: 0]
  ------------------
   58|  12.3k|                        continue;
   59|       |
   60|      0|                    ProcessResourceNameScriptCompilerEvent evt(ProcessResourceNameScriptCompilerEvent::TEXTURE, aliasIt->second);
   61|      0|                    compiler->_fireEvent(&evt, 0);
   62|       |
   63|      0|                    if (tus->getNumFrames() > 1)
  ------------------
  |  Branch (63:25): [True: 0, False: 0]
  ------------------
   64|      0|                        tus->setAnimatedTextureName(evt.mName, tus->getNumFrames(),
   65|      0|                                                    tus->getAnimationDuration());
   66|      0|                    else
   67|      0|                        tus->setTextureName(evt.mName, tus->getTextureType());
   68|      0|                }
   69|  11.7k|            }
   70|  11.8k|        }
   71|  12.1k|    }
OgreScriptTranslator.cpp:_ZN4OgreL14getProgramTypeEi:
  493|  9.42k|    {
  494|  9.42k|        switch(id)
  495|  9.42k|        {
  496|      0|        default:
  ------------------
  |  Branch (496:9): [True: 0, False: 9.42k]
  ------------------
  497|      0|            assert(false);
  498|      0|            OGRE_FALLTHROUGH;
  499|  1.43k|        case ID_VERTEX_PROGRAM:
  ------------------
  |  Branch (499:9): [True: 1.43k, False: 7.98k]
  ------------------
  500|  2.22k|        case ID_VERTEX_PROGRAM_REF:
  ------------------
  |  Branch (500:9): [True: 785, False: 8.63k]
  ------------------
  501|  2.22k|            return GPT_VERTEX_PROGRAM;
  502|  2.87k|        case ID_FRAGMENT_PROGRAM:
  ------------------
  |  Branch (502:9): [True: 2.87k, False: 6.54k]
  ------------------
  503|  3.75k|        case ID_FRAGMENT_PROGRAM_REF:
  ------------------
  |  Branch (503:9): [True: 885, False: 8.53k]
  ------------------
  504|  3.75k|            return GPT_FRAGMENT_PROGRAM;
  505|    257|        case ID_GEOMETRY_PROGRAM:
  ------------------
  |  Branch (505:9): [True: 257, False: 9.16k]
  ------------------
  506|    332|        case ID_GEOMETRY_PROGRAM_REF:
  ------------------
  |  Branch (506:9): [True: 75, False: 9.34k]
  ------------------
  507|    332|            return GPT_GEOMETRY_PROGRAM;
  508|    151|        case ID_TESSELLATION_DOMAIN_PROGRAM:
  ------------------
  |  Branch (508:9): [True: 151, False: 9.27k]
  ------------------
  509|  1.12k|        case ID_TESSELLATION_DOMAIN_PROGRAM_REF:
  ------------------
  |  Branch (509:9): [True: 977, False: 8.44k]
  ------------------
  510|  1.12k|            return GPT_DOMAIN_PROGRAM;
  511|    124|        case ID_TESSELLATION_HULL_PROGRAM:
  ------------------
  |  Branch (511:9): [True: 124, False: 9.29k]
  ------------------
  512|  1.87k|        case ID_TESSELLATION_HULL_PROGRAM_REF:
  ------------------
  |  Branch (512:9): [True: 1.75k, False: 7.66k]
  ------------------
  513|  1.87k|            return GPT_HULL_PROGRAM;
  514|     72|        case ID_COMPUTE_PROGRAM:
  ------------------
  |  Branch (514:9): [True: 72, False: 9.35k]
  ------------------
  515|     90|        case ID_COMPUTE_PROGRAM_REF:
  ------------------
  |  Branch (515:9): [True: 18, False: 9.40k]
  ------------------
  516|     90|            return GPT_COMPUTE_PROGRAM;
  517|     12|        case ID_MESH_PROGRAM:
  ------------------
  |  Branch (517:9): [True: 12, False: 9.41k]
  ------------------
  518|     12|        case ID_MESH_PROGRAM_REF:
  ------------------
  |  Branch (518:9): [True: 0, False: 9.42k]
  ------------------
  519|     12|            return GPT_MESH_PROGRAM;
  520|      0|        case ID_TASK_PROGRAM:
  ------------------
  |  Branch (520:9): [True: 0, False: 9.42k]
  ------------------
  521|      0|        case ID_TASK_PROGRAM_REF:
  ------------------
  |  Branch (521:9): [True: 0, False: 9.42k]
  ------------------
  522|      0|            return GPT_TASK_PROGRAM;
  523|  9.42k|        }
  524|  9.42k|    }
OgreScriptTranslator.cpp:_ZN4OgreL10getProgramEPNS_14ScriptCompilerEPNS_18ObjectAbstractNodeE:
 2197|  4.51k|    {
 2198|  4.51k|        if(node->name.empty())
  ------------------
  |  Branch (2198:12): [True: 19, False: 4.49k]
  ------------------
 2199|     19|        {
 2200|     19|            compiler->addError(ScriptCompiler::CE_OBJECTNAMEEXPECTED, node->file, node->line);
 2201|     19|            return nullptr;
 2202|     19|        }
 2203|       |
 2204|  4.49k|        ProcessResourceNameScriptCompilerEvent evt(ProcessResourceNameScriptCompilerEvent::GPU_PROGRAM, node->name);
 2205|  4.49k|        compiler->_fireEvent(&evt, 0);
 2206|       |
 2207|  4.49k|        auto& mgr = GpuProgramManager::getSingleton();
 2208|  4.49k|        if (auto ret = mgr.getByName(evt.mName, compiler->getResourceGroup()))
  ------------------
  |  Branch (2208:18): [True: 2.78k, False: 1.71k]
  ------------------
 2209|  2.78k|            return ret;
 2210|       |
 2211|       |        // recheck with auto resource group
 2212|  1.71k|        if (auto ret = mgr.getByName(evt.mName, RGN_AUTODETECT))
  ------------------
  |  Branch (2212:18): [True: 0, False: 1.71k]
  ------------------
 2213|      0|            return ret;
 2214|       |
 2215|  1.71k|        compiler->addError(ScriptCompiler::CE_REFERENCETOANONEXISTINGOBJECT, node->file, node->line,
 2216|  1.71k|                           evt.mName);
 2217|  1.71k|        return nullptr;
 2218|  1.71k|    }
OgreScriptTranslator.cpp:_ZN4OgreL10_getVectorIiEEbNSt3__121__list_const_iteratorINS_9SharedPtrINS_12AbstractNodeEEEPvEES7_RNS1_6vectorIT_NS1_9allocatorIS9_EEEEm:
  473|     46|    {
  474|     46|        vals.reserve(count);
  475|     46|        size_t n = 0;
  476|    174|        while (n < count)
  ------------------
  |  Branch (476:16): [True: 129, False: 45]
  ------------------
  477|    129|        {
  478|    129|            if (i != end)
  ------------------
  |  Branch (478:17): [True: 124, False: 5]
  ------------------
  479|    124|            {
  480|    124|                T v;
  481|    124|                if (!getValue(*i++, v))
  ------------------
  |  Branch (481:21): [True: 1, False: 123]
  ------------------
  482|      1|                    return false;
  483|    123|                vals.push_back(v);
  484|    123|            }
  485|    128|            ++n;
  486|    128|        }
  487|       |
  488|     45|        vals.resize(count);
  489|     45|        return true;
  490|     46|    }
OgreScriptTranslator.cpp:_ZN4OgreL10_getVectorIfEEbNSt3__121__list_const_iteratorINS_9SharedPtrINS_12AbstractNodeEEEPvEES7_RNS1_6vectorIT_NS1_9allocatorIS9_EEEEm:
  473|  1.80k|    {
  474|  1.80k|        vals.reserve(count);
  475|  1.80k|        size_t n = 0;
  476|  5.41k|        while (n < count)
  ------------------
  |  Branch (476:16): [True: 3.65k, False: 1.76k]
  ------------------
  477|  3.65k|        {
  478|  3.65k|            if (i != end)
  ------------------
  |  Branch (478:17): [True: 3.65k, False: 0]
  ------------------
  479|  3.65k|            {
  480|  3.65k|                T v;
  481|  3.65k|                if (!getValue(*i++, v))
  ------------------
  |  Branch (481:21): [True: 42, False: 3.61k]
  ------------------
  482|     42|                    return false;
  483|  3.61k|                vals.push_back(v);
  484|  3.61k|            }
  485|  3.61k|            ++n;
  486|  3.61k|        }
  487|       |
  488|  1.76k|        vals.resize(count);
  489|  1.76k|        return true;
  490|  1.80k|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|  10.3k|    {
  455|  10.3k|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 154, False: 10.1k]
  ------------------
  456|    154|        {
  457|    154|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|    154|        }
  459|  10.1k|        else
  460|  10.1k|        {
  461|  10.1k|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 10.1k, False: 12]
  ------------------
  462|  10.1k|                return true;
  463|     12|            else
  464|     12|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|  10.1k|        }
  466|       |
  467|    166|        return false;
  468|  10.3k|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueIbEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|  10.3k|    {
  455|  10.3k|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 110, False: 10.2k]
  ------------------
  456|    110|        {
  457|    110|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|    110|        }
  459|  10.2k|        else
  460|  10.2k|        {
  461|  10.2k|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 9.73k, False: 502]
  ------------------
  462|  9.73k|                return true;
  463|    502|            else
  464|    502|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|  10.2k|        }
  466|       |
  467|    612|        return false;
  468|  10.3k|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueIjEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|  1.20k|    {
  455|  1.20k|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 55, False: 1.15k]
  ------------------
  456|     55|        {
  457|     55|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|     55|        }
  459|  1.15k|        else
  460|  1.15k|        {
  461|  1.15k|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 1.11k, False: 32]
  ------------------
  462|  1.11k|                return true;
  463|     32|            else
  464|     32|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|  1.15k|        }
  466|       |
  467|     87|        return false;
  468|  1.20k|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueINS_19SceneBlendOperationEEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|      6|    {
  455|      6|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 3, False: 3]
  ------------------
  456|      3|        {
  457|      3|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|      3|        }
  459|      3|        else
  460|      3|        {
  461|      3|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 0, False: 3]
  ------------------
  462|      0|                return true;
  463|      3|            else
  464|      3|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|      3|        }
  466|       |
  467|      6|        return false;
  468|      6|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueINS_15CompareFunctionEEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|    152|    {
  455|    152|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 44, False: 108]
  ------------------
  456|     44|        {
  457|     44|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|     44|        }
  459|    108|        else
  460|    108|        {
  461|    108|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 75, False: 33]
  ------------------
  462|     75|                return true;
  463|     33|            else
  464|     33|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|    108|        }
  466|       |
  467|     77|        return false;
  468|    152|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueIfEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|    548|    {
  455|    548|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 62, False: 486]
  ------------------
  456|     62|        {
  457|     62|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|     62|        }
  459|    486|        else
  460|    486|        {
  461|    486|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 453, False: 33]
  ------------------
  462|    453|                return true;
  463|     33|            else
  464|     33|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|    486|        }
  466|       |
  467|     95|        return false;
  468|    548|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueINS_17IlluminationStageEEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|     28|    {
  455|     28|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 13, False: 15]
  ------------------
  456|     13|        {
  457|     13|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|     13|        }
  459|     15|        else
  460|     15|        {
  461|     15|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 4, False: 11]
  ------------------
  462|      4|                return true;
  463|     11|            else
  464|     11|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|     15|        }
  466|       |
  467|     24|        return false;
  468|     28|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueINS_11CullingModeEEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|  2.20k|    {
  455|  2.20k|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 37, False: 2.16k]
  ------------------
  456|     37|        {
  457|     37|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|     37|        }
  459|  2.16k|        else
  460|  2.16k|        {
  461|  2.16k|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 2.10k, False: 60]
  ------------------
  462|  2.10k|                return true;
  463|     60|            else
  464|     60|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|  2.16k|        }
  466|       |
  467|     97|        return false;
  468|  2.20k|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueINS_17ManualCullingModeEEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|     61|    {
  455|     61|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 6, False: 55]
  ------------------
  456|      6|        {
  457|      6|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|      6|        }
  459|     55|        else
  460|     55|        {
  461|     55|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 38, False: 17]
  ------------------
  462|     38|                return true;
  463|     17|            else
  464|     17|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|     55|        }
  466|       |
  467|     23|        return false;
  468|     61|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueINS_12ShadeOptionsEEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|     40|    {
  455|     40|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 37, False: 3]
  ------------------
  456|     37|        {
  457|     37|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|     37|        }
  459|      3|        else
  460|      3|        {
  461|      3|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 0, False: 3]
  ------------------
  462|      0|                return true;
  463|      3|            else
  464|      3|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|      3|        }
  466|       |
  467|     40|        return false;
  468|     40|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueINS_11PolygonModeEEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|     30|    {
  455|     30|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 7, False: 23]
  ------------------
  456|      7|        {
  457|      7|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|      7|        }
  459|     23|        else
  460|     23|        {
  461|     23|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 7, False: 16]
  ------------------
  462|      7|                return true;
  463|     16|            else
  464|     16|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|     23|        }
  466|       |
  467|     23|        return false;
  468|     30|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueINS_19LayerBlendOperationEEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|     72|    {
  455|     72|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 7, False: 65]
  ------------------
  456|      7|        {
  457|      7|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|      7|        }
  459|     65|        else
  460|     65|        {
  461|     65|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 41, False: 24]
  ------------------
  462|     41|                return true;
  463|     24|            else
  464|     24|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|     65|        }
  466|       |
  467|     31|        return false;
  468|     72|    }
OgreScriptTranslator.cpp:_ZN4OgreL10_getVectorINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEEbNS1_21__list_const_iteratorINS_9SharedPtrINS_12AbstractNodeEEEPvEESD_RNS1_6vectorIT_NS5_ISF_EEEEm:
  473|  7.26k|    {
  474|  7.26k|        vals.reserve(count);
  475|  7.26k|        size_t n = 0;
  476|  17.9k|        while (n < count)
  ------------------
  |  Branch (476:16): [True: 10.6k, False: 7.23k]
  ------------------
  477|  10.6k|        {
  478|  10.6k|            if (i != end)
  ------------------
  |  Branch (478:17): [True: 10.6k, False: 0]
  ------------------
  479|  10.6k|            {
  480|  10.6k|                T v;
  481|  10.6k|                if (!getValue(*i++, v))
  ------------------
  |  Branch (481:21): [True: 28, False: 10.6k]
  ------------------
  482|     28|                    return false;
  483|  10.6k|                vals.push_back(v);
  484|  10.6k|            }
  485|  10.6k|            ++n;
  486|  10.6k|        }
  487|       |
  488|  7.23k|        vals.resize(count);
  489|  7.23k|        return true;
  490|  7.26k|    }
OgreScriptTranslator.cpp:_ZN4OgreL10_getVectorIjEEbNSt3__121__list_const_iteratorINS_9SharedPtrINS_12AbstractNodeEEEPvEES7_RNS1_6vectorIT_NS1_9allocatorIS9_EEEEm:
  473|     16|    {
  474|     16|        vals.reserve(count);
  475|     16|        size_t n = 0;
  476|  8.21k|        while (n < count)
  ------------------
  |  Branch (476:16): [True: 8.20k, False: 9]
  ------------------
  477|  8.20k|        {
  478|  8.20k|            if (i != end)
  ------------------
  |  Branch (478:17): [True: 13, False: 8.19k]
  ------------------
  479|     13|            {
  480|     13|                T v;
  481|     13|                if (!getValue(*i++, v))
  ------------------
  |  Branch (481:21): [True: 7, False: 6]
  ------------------
  482|      7|                    return false;
  483|      6|                vals.push_back(v);
  484|      6|            }
  485|  8.19k|            ++n;
  486|  8.19k|        }
  487|       |
  488|      9|        vals.resize(count);
  489|      9|        return true;
  490|     16|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueINS_21CompositionTargetPass9InputModeEEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|  4.01k|    {
  455|  4.01k|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 68, False: 3.94k]
  ------------------
  456|     68|        {
  457|     68|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|     68|        }
  459|  3.94k|        else
  460|  3.94k|        {
  461|  3.94k|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 3.91k, False: 37]
  ------------------
  462|  3.91k|                return true;
  463|     37|            else
  464|     37|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|  3.94k|        }
  466|       |
  467|    105|        return false;
  468|  4.01k|    }
OgreScriptTranslator.cpp:_ZN4OgreL8getValueINS_16StencilOperationEEEbPNS_20PropertyAbstractNodeEPNS_14ScriptCompilerERT_:
  454|     17|    {
  455|     17|        if (prop->values.size() != 1)
  ------------------
  |  Branch (455:13): [True: 15, False: 2]
  ------------------
  456|     15|        {
  457|     15|            compiler->addError(*prop, prop->name + " must have exactly 1 argument");
  458|     15|        }
  459|      2|        else
  460|      2|        {
  461|      2|            if (getValue(prop->values.front(), val))
  ------------------
  |  Branch (461:17): [True: 0, False: 2]
  ------------------
  462|      0|                return true;
  463|      2|            else
  464|      2|                compiler->addError(*prop, prop->values.front()->getValue() + " is not a valid value for " + prop->name);
  465|      2|        }
  466|       |
  467|     17|        return false;
  468|     17|    }

_ZN4Ogre20ShadowTextureManagerC2Ev:
   64|      1|        : mCount(0)
   65|      1|    {
   66|       |
   67|      1|    }

_ZN4Ogre15SkeletonManagerC2Ev:
   45|      1|    {
   46|      1|        mLoadOrder = 300.0f;
   47|      1|        mResourceType = "Skeleton";
   48|       |
   49|      1|        ResourceGroupManager::getSingleton()._registerResourceManager(mResourceType, this);
   50|      1|    }

_ZN4Ogre16StreamSerialiser14makeIdentifierERA5_Kc:
  146|      2|    {
  147|      2|        uint32 ret = 0;
  148|     10|        for (size_t i = 0; i < 4; ++i)
  ------------------
  |  Branch (148:28): [True: 8, False: 2]
  ------------------
  149|      8|        {
  150|      8|            ret += (code[i] << (i * 8));
  151|      8|        }
  152|      2|        return ret;
  153|       |
  154|      2|    }

_ZN4Ogre10StringUtil4trimERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEbb:
   42|      2|    {
   43|       |        /*
   44|       |        size_t lspaces, rspaces, len = length(), i;
   45|       |
   46|       |        lspaces = rspaces = 0;
   47|       |
   48|       |        if( left )
   49|       |        {
   50|       |            // Find spaces / tabs on the left
   51|       |            for( i = 0;
   52|       |                i < len && ( at(i) == ' ' || at(i) == '\t' || at(i) == '\r');
   53|       |                ++lspaces, ++i );
   54|       |        }
   55|       |        
   56|       |        if( right && lspaces < len )
   57|       |        {
   58|       |            // Find spaces / tabs on the right
   59|       |            for( i = len - 1;
   60|       |                i >= 0 && ( at(i) == ' ' || at(i) == '\t' || at(i) == '\r');
   61|       |                rspaces++, i-- );
   62|       |        }
   63|       |
   64|       |        *this = substr(lspaces, len-lspaces-rspaces);
   65|       |        */
   66|      2|        static const String delims = " \t\r\n";
   67|      2|        if(right)
  ------------------
  |  Branch (67:12): [True: 2, False: 0]
  ------------------
   68|      2|            str.erase(str.find_last_not_of(delims)+1); // trim right
   69|      2|        if(left)
  ------------------
  |  Branch (69:12): [True: 2, False: 0]
  ------------------
   70|      2|            str.erase(0, str.find_first_not_of(delims)); // trim left
   71|      2|    }
_ZN4Ogre10StringUtil11toLowerCaseERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  203|     35|    {
  204|     35|        std::transform(
  205|     35|            str.begin(),
  206|     35|            str.end(),
  207|     35|            str.begin(),
  208|     35|            tolower);
  209|     35|    }
_ZN4Ogre10StringUtil11toUpperCaseERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  213|  3.82k|    {
  214|  3.82k|        std::transform(
  215|  3.82k|            str.begin(),
  216|  3.82k|            str.end(),
  217|  3.82k|            str.begin(),
  218|  3.82k|            toupper);
  219|  3.82k|    }
_ZN4Ogre10StringUtil17splitBaseFilenameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERS7_SA_:
  382|    522|    {
  383|    522|        size_t i = fullName.find_last_of('.');
  384|    522|        if (i == Ogre::String::npos)
  ------------------
  |  Branch (384:13): [True: 21, False: 501]
  ------------------
  385|     21|        {
  386|     21|            outExtention.clear();
  387|     21|            outBasename = fullName;
  388|     21|        }
  389|    501|        else
  390|    501|        {
  391|    501|            outExtention = fullName.substr(i+1);
  392|    501|            outBasename = fullName.substr(0, i);
  393|    501|        }
  394|    522|    }
_ZN4Ogre10StringUtil5matchERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_b:
  405|  1.78k|    {
  406|  1.78k|        String tmpStr = str;
  407|  1.78k|        String tmpPattern = pattern;
  408|  1.78k|        if (!caseSensitive)
  ------------------
  |  Branch (408:13): [True: 0, False: 1.78k]
  ------------------
  409|      0|        {
  410|      0|            StringUtil::toLowerCase(tmpStr);
  411|      0|            StringUtil::toLowerCase(tmpPattern);
  412|      0|        }
  413|       |
  414|  1.78k|        String::const_iterator strIt = tmpStr.begin();
  415|  1.78k|        String::const_iterator patIt = tmpPattern.begin();
  416|  1.78k|        String::const_iterator lastWildCardIt = tmpPattern.end();
  417|  35.6k|        while (strIt != tmpStr.end() && patIt != tmpPattern.end())
  ------------------
  |  Branch (417:16): [True: 34.6k, False: 999]
  |  Branch (417:16): [True: 34.6k, False: 1.00k]
  |  Branch (417:41): [True: 34.6k, False: 3]
  ------------------
  418|  34.6k|        {
  419|  34.6k|            if (*patIt == '*')
  ------------------
  |  Branch (419:17): [True: 1.66k, False: 32.9k]
  ------------------
  420|  1.66k|            {
  421|  1.66k|                lastWildCardIt = patIt;
  422|       |                // Skip over looking for next character
  423|  1.66k|                ++patIt;
  424|  1.66k|                if (patIt == tmpPattern.end())
  ------------------
  |  Branch (424:21): [True: 39, False: 1.62k]
  ------------------
  425|     39|                {
  426|       |                    // Skip right to the end since * matches the entire rest of the string
  427|     39|                    strIt = tmpStr.end();
  428|     39|                }
  429|  1.62k|                else
  430|  1.62k|                {
  431|       |                    // scan until we find next pattern character
  432|  9.78k|                    while(strIt != tmpStr.end() && *strIt != *patIt)
  ------------------
  |  Branch (432:27): [True: 9.22k, False: 556]
  |  Branch (432:27): [True: 8.15k, False: 1.62k]
  |  Branch (432:52): [True: 8.15k, False: 1.07k]
  ------------------
  433|  8.15k|                        ++strIt;
  434|  1.62k|                }
  435|  1.66k|            }
  436|  32.9k|            else
  437|  32.9k|            {
  438|  32.9k|                if (*patIt != *strIt)
  ------------------
  |  Branch (438:21): [True: 1.42k, False: 31.5k]
  ------------------
  439|  1.42k|                {
  440|  1.42k|                    if (lastWildCardIt != tmpPattern.end())
  ------------------
  |  Branch (440:25): [True: 635, False: 787]
  ------------------
  441|    635|                    {
  442|       |                        // The last wildcard can match this incorrect sequence
  443|       |                        // rewind pattern to wildcard and keep searching
  444|    635|                        patIt = lastWildCardIt;
  445|    635|                        lastWildCardIt = tmpPattern.end();
  446|    635|                    }
  447|    787|                    else
  448|    787|                    {
  449|       |                        // no wildwards left
  450|    787|                        return false;
  451|    787|                    }
  452|  1.42k|                }
  453|  31.5k|                else
  454|  31.5k|                {
  455|  31.5k|                    ++patIt;
  456|  31.5k|                    ++strIt;
  457|  31.5k|                }
  458|  32.9k|            }
  459|       |
  460|  34.6k|        }
  461|       |        // If we reached the end of both the pattern and the string, we succeeded
  462|  1.00k|        if ((patIt == tmpPattern.end() || (*patIt == '*' && patIt + 1 == tmpPattern.end())) && strIt == tmpStr.end())
  ------------------
  |  Branch (462:13): [True: 383, False: 619]
  |  Branch (462:14): [True: 379, False: 623]
  |  Branch (462:44): [True: 25, False: 598]
  |  Branch (462:61): [True: 7, False: 18]
  |  Branch (462:96): [True: 383, False: 3]
  ------------------
  463|    383|        {
  464|    383|            return true;
  465|    383|        }
  466|    619|        else
  467|    619|        {
  468|    619|            return false;
  469|    619|        }
  470|       |
  471|  1.00k|    }
_ZN4Ogre10StringUtil6formatEPKcz:
  488|   825k|    {
  489|       |        // try to use a stack buffer and fall back to heap for large strings
  490|   825k|        char sbuf[1024];
  491|   825k|        size_t bsize = sizeof(sbuf);
  492|   825k|        std::vector<char> hbuf;
  493|   825k|        char* pbuf = sbuf;
  494|       |
  495|   825k|        while (true)
  ------------------
  |  Branch (495:16): [True: 825k, Folded]
  ------------------
  496|   825k|        {
  497|   825k|            va_list va;
  498|   825k|            va_start(va, fmt);
  499|   825k|            int len = vsnprintf(pbuf, bsize, fmt, va);
  500|   825k|            va_end(va);
  501|       |
  502|   825k|            OgreAssert(len >= 0, "Check format string for errors");
  ------------------
  |  Branch (502:13): [True: 0, False: 825k]
  ------------------
  503|   825k|            if (size_t(len) >= bsize)
  ------------------
  |  Branch (503:17): [True: 0, False: 825k]
  ------------------
  504|      0|            {
  505|      0|                hbuf.resize(len + 1);
  506|      0|                pbuf = hbuf.data();
  507|      0|                bsize = hbuf.size();
  508|      0|                continue;
  509|      0|            }
  510|   825k|            pbuf[bsize - 1] = 0;
  511|   825k|            return String(pbuf, len);
  512|   825k|        }
  513|   825k|    }

_ZN4Ogre15StringConverter8toStringERKNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE:
  239|  7.26k|    {
  240|  7.26k|        StringStream stream;
  241|  7.26k|        StringVector::const_iterator i, iend, ibegin;
  242|  7.26k|        ibegin = val.begin();
  243|  7.26k|        iend = val.end();
  244|  17.9k|        for (i = ibegin; i != iend; ++i)
  ------------------
  |  Branch (244:26): [True: 10.6k, False: 7.26k]
  ------------------
  245|  10.6k|        {
  246|  10.6k|            if (i != ibegin)
  ------------------
  |  Branch (246:17): [True: 3.41k, False: 7.24k]
  ------------------
  247|  3.41k|                stream << " ";
  248|       |
  249|  10.6k|            stream << *i; 
  250|  10.6k|        }
  251|  7.26k|        return stream.str();
  252|  7.26k|    }
_ZN4Ogre15StringConverter5parseERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERf:
  263|  26.3k|    {
  264|  26.3k|        char* end;
  265|  26.3k|        auto tmp = (float)strtod_l(val.c_str(), &end, _numLocale);
  266|  26.3k|        return assignValid(val.c_str() != end, tmp, ret);
  267|  26.3k|    }
_ZN4Ogre15StringConverter5parseERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERi:
  276|    876|    {
  277|    876|        char* end;
  278|    876|        auto tmp = (int32)strtol_l(val.c_str(), &end, 0, _numLocale);
  279|    876|        return assignValid(val.c_str() != end, tmp, ret);
  280|    876|    }
_ZN4Ogre15StringConverter5parseERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERj:
  303|  9.77k|    {
  304|  9.77k|        char* end;
  305|  9.77k|        auto tmp = (uint32)strtoul_l(val.c_str(), &end, 0, _numLocale);
  306|  9.77k|        return assignValid(val.c_str() != end, tmp, ret);
  307|  9.77k|    }
OgreStringConverter.cpp:_ZN4OgreL11assignValidIfEEbbRKT_RS1_:
  256|  26.3k|    {
  257|  26.3k|        if (valid)
  ------------------
  |  Branch (257:13): [True: 25.6k, False: 663]
  ------------------
  258|  25.6k|            ret = val;
  259|  26.3k|        return valid;
  260|  26.3k|    }
OgreStringConverter.cpp:_ZN4OgreL11assignValidIiEEbbRKT_RS1_:
  256|    876|    {
  257|    876|        if (valid)
  ------------------
  |  Branch (257:13): [True: 576, False: 300]
  ------------------
  258|    576|            ret = val;
  259|    876|        return valid;
  260|    876|    }
OgreStringConverter.cpp:_ZN4OgreL11assignValidIjEEbbRKT_RS1_:
  256|  9.77k|    {
  257|  9.77k|        if (valid)
  ------------------
  |  Branch (257:13): [True: 5.84k, False: 3.92k]
  ------------------
  258|  5.84k|            ret = val;
  259|  9.77k|        return valid;
  260|  9.77k|    }

_ZN4Ogre15ParamDictionaryC2Ev:
   36|      4|    ParamDictionary::ParamDictionary() {}
_ZN4Ogre15ParamDictionaryD2Ev:
   37|      8|    ParamDictionary::~ParamDictionary() {}
_ZN4Ogre15ParamDictionary15getParamCommandERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   40|  3.13k|    {
   41|  3.13k|        ParamCommandMap::iterator i = mParamCommands.find(name);
   42|  3.13k|        if (i != mParamCommands.end())
  ------------------
  |  Branch (42:13): [True: 3.12k, False: 12]
  ------------------
   43|  3.12k|        {
   44|  3.12k|            return i->second;
   45|  3.12k|        }
   46|     12|        else
   47|     12|        {
   48|     12|            return 0;
   49|     12|        }
   50|  3.13k|    }
_ZN4Ogre15ParamDictionary12addParameterERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPNS_12ParamCommandE:
   66|     20|    {
   67|     20|        mParamDefs.push_back(name);
   68|     20|        mParamCommands[name] = paramCmd;
   69|     20|    }
_ZN4Ogre15StringInterface21createParamDictionaryERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   72|   227k|    {
   73|   227k|        OGRE_LOCK_MUTEX( msDictionaryMutex );
   74|       |
   75|   227k|        ParamDictionaryMap::iterator it = msDictionary.find(className);
   76|       |
   77|   227k|        if ( it == msDictionary.end() )
  ------------------
  |  Branch (77:14): [True: 4, False: 227k]
  ------------------
   78|      4|        {
   79|      4|            mParamDict = &msDictionary.insert( std::make_pair( className, ParamDictionary() ) ).first->second;
   80|      4|            mParamDictName = className;
   81|      4|            return true;
   82|      4|        }
   83|   227k|        else
   84|   227k|        {
   85|   227k|            mParamDict = &it->second;
   86|   227k|            mParamDictName = className;
   87|   227k|            return false;
   88|   227k|        }
   89|   227k|    }
_ZN4Ogre15StringInterface12setParameterERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  124|  4.97k|    {
  125|       |        // Get dictionary
  126|  4.97k|        ParamDictionary* dict = getParamDictionary();
  127|       |
  128|  4.97k|        if (dict)
  ------------------
  |  Branch (128:13): [True: 3.13k, False: 1.84k]
  ------------------
  129|  3.13k|        {
  130|       |            // Look up command object
  131|  3.13k|            ParamCommand* cmd = dict->getParamCommand(name);
  132|  3.13k|            if (cmd)
  ------------------
  |  Branch (132:17): [True: 3.12k, False: 12]
  ------------------
  133|  3.12k|            {
  134|  3.12k|                cmd->doSet(this, value);
  135|  3.12k|                return true;
  136|  3.12k|            }
  137|  3.13k|        }
  138|       |        // Fallback
  139|  1.85k|        return false;
  140|  4.97k|    }

_ZN4Ogre9TechniqueC2EPNS_8MaterialE:
   35|  25.4k|        : mParent(parent), mIlluminationPassesCompilationPhase(IPS_NOT_COMPILED), mIsSupported(false), mLodIndex(0), mSchemeIndex(0)
   36|  25.4k|    {
   37|       |        // See above, defaults to unsupported until examined
   38|  25.4k|    }
_ZN4Ogre9TechniqueD2Ev:
   48|  25.4k|    {
   49|  25.4k|        removeAllPasses();
   50|  25.4k|        clearIlluminationPasses();
   51|  25.4k|    }
_ZNK4Ogre9Technique11isSupportedEv:
   54|  13.1k|    {
   55|  13.1k|        return mIsSupported;
   56|  13.1k|    }
_ZN4Ogre9Technique10createPassEv:
  310|  12.1k|    {
  311|       |        Pass* newPass = OGRE_NEW Pass(this, static_cast<unsigned short>(mPasses.size()));
  312|  12.1k|        mPasses.push_back(newPass);
  313|  12.1k|        return newPass;
  314|  12.1k|    }
_ZN4Ogre9Technique15removeAllPassesEv:
  341|  38.5k|    {
  342|  38.5k|        for (auto *p : mPasses)
  ------------------
  |  Branch (342:22): [True: 25.2k, False: 38.5k]
  ------------------
  343|  25.2k|        {
  344|  25.2k|            p->queueForDeletion();
  345|  25.2k|        }
  346|  38.5k|        mPasses.clear();
  347|  38.5k|    }
_ZN4Ogre9TechniqueaSERKS0_:
  398|  13.1k|    {
  399|  13.1k|        if (this == &rhs)
  ------------------
  |  Branch (399:13): [True: 0, False: 13.1k]
  ------------------
  400|      0|            return *this;
  401|       |
  402|  13.1k|        mName = rhs.mName;
  403|  13.1k|        this->mIsSupported = rhs.mIsSupported;
  404|  13.1k|        this->mLodIndex = rhs.mLodIndex;
  405|  13.1k|        this->mSchemeIndex = rhs.mSchemeIndex;
  406|  13.1k|        this->mShadowCasterMaterial = rhs.mShadowCasterMaterial;
  407|  13.1k|        this->mShadowCasterMaterialName = rhs.mShadowCasterMaterialName;
  408|  13.1k|        this->mShadowReceiverMaterial = rhs.mShadowReceiverMaterial;
  409|  13.1k|        this->mShadowReceiverMaterialName = rhs.mShadowReceiverMaterialName;
  410|  13.1k|        this->mGPUVendorRules = rhs.mGPUVendorRules;
  411|  13.1k|        this->mGPUDeviceNameRules = rhs.mGPUDeviceNameRules;
  412|       |
  413|       |        // copy passes
  414|  13.1k|        removeAllPasses();
  415|  13.1k|        for (auto *rp : rhs.mPasses)
  ------------------
  |  Branch (415:23): [True: 13.1k, False: 13.1k]
  ------------------
  416|  13.1k|        {
  417|  13.1k|            Pass* p = OGRE_NEW Pass(this, rp->getIndex(), *(rp));
  418|  13.1k|            mPasses.push_back(p);
  419|  13.1k|        }
  420|       |        // Compile for categorised illumination on demand
  421|  13.1k|        clearIlluminationPasses();
  422|  13.1k|        mIlluminationPassesCompilationPhase = IPS_NOT_COMPILED;
  423|  13.1k|        return *this;
  424|  13.1k|    }
_ZNK4Ogre9Technique8isLoadedEv:
  576|  13.7k|    {
  577|       |        // Only supported technique will be loaded
  578|  13.7k|        return mParent->isLoaded() && mIsSupported;
  ------------------
  |  Branch (578:16): [True: 0, False: 13.7k]
  |  Branch (578:39): [True: 0, False: 0]
  ------------------
  579|  13.7k|    }
_ZN4Ogre9Technique18setLightingEnabledEb:
  631|      1|    void Technique::setLightingEnabled(bool enabled) { ALL_PASSES(setLightingEnabled(enabled)); }
  ------------------
  |  |  581|      1|    #define ALL_PASSES(fncall) for(auto p : mPasses) p->fncall
  |  |  ------------------
  |  |  |  Branch (581:43): [True: 1, False: 1]
  |  |  ------------------
  ------------------
_ZN4Ogre9Technique7setNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  673|  1.68k|    {
  674|  1.68k|        mName = name;
  675|  1.68k|    }
_ZN4Ogre9Technique21_notifyNeedsRecompileEv:
  680|  16.0k|    {
  681|       |        // Disable require to recompile when splitting illumination passes
  682|  16.0k|        if (mIlluminationPassesCompilationPhase != IPS_COMPILE_DISABLED)
  ------------------
  |  Branch (682:13): [True: 16.0k, False: 0]
  ------------------
  683|  16.0k|        {
  684|  16.0k|            mParent->_notifyNeedsRecompile();
  685|  16.0k|        }
  686|  16.0k|    }
_ZN4Ogre9Technique13setSchemeNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  695|    195|    {
  696|    195|        mSchemeIndex = MaterialManager::getSingleton()._getSchemeIndex(schemeName);
  697|    195|        _notifyNeedsRecompile();
  698|    195|    }
_ZN4Ogre9Technique23clearIlluminationPassesEv:
  958|  38.5k|    {
  959|  38.5k|        if(MaterialManager::getSingletonPtr())
  ------------------
  |  Branch (959:12): [True: 38.5k, False: 0]
  ------------------
  960|  38.5k|            MaterialManager::getSingleton()._notifyBeforeIlluminationPassesCleared(this);
  961|       |
  962|  38.5k|        for (auto *i : mIlluminationPasses)
  ------------------
  |  Branch (962:22): [True: 0, False: 38.5k]
  ------------------
  963|      0|        {
  964|      0|            if (i->destroyOnShutdown)
  ------------------
  |  Branch (964:17): [True: 0, False: 0]
  ------------------
  965|      0|            {
  966|      0|                i->pass->queueForDeletion();
  967|      0|            }
  968|       |            OGRE_DELETE i;
  969|      0|        }
  970|  38.5k|        mIlluminationPasses.clear();
  971|  38.5k|    }
_ZNK4Ogre9Technique16getResourceGroupEv:
  995|   829k|    {
  996|   829k|        return mParent->getGroup();
  997|   829k|    }
_ZN4Ogre9Technique23setShadowCasterMaterialENS_9SharedPtrINS_8MaterialEEE:
 1005|    165|    {
 1006|    165|        if (!val)
  ------------------
  |  Branch (1006:13): [True: 40, False: 125]
  ------------------
 1007|     40|        {
 1008|     40|            mShadowCasterMaterial.reset();
 1009|     40|            mShadowCasterMaterialName.clear();
 1010|     40|        }
 1011|    125|        else
 1012|    125|        {
 1013|       |            // shadow caster material should never receive shadows
 1014|    125|            val->setReceiveShadows(false); // should we warn if this is not set?
 1015|    125|            mShadowCasterMaterial = val;
 1016|    125|            mShadowCasterMaterialName = val->getName();
 1017|    125|        }
 1018|    165|    }
_ZN4Ogre9Technique23setShadowCasterMaterialERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 1021|    165|    {
 1022|    165|        setShadowCasterMaterial(MaterialManager::getSingleton().getByName(name));
 1023|       |        // remember the name, even if it is not created yet
 1024|    165|        mShadowCasterMaterialName = name;
 1025|    165|    }
_ZN4Ogre9Technique25setShadowReceiverMaterialERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 1047|     10|    {
 1048|     10|        mShadowReceiverMaterialName = name;
 1049|     10|        mShadowReceiverMaterial = MaterialManager::getSingleton().getByName(name);
 1050|     10|    }
_ZN4Ogre9Technique20addGPUDeviceNameRuleERKNS0_17GPUDeviceNameRuleE:
 1087|     75|    {
 1088|       |        // remove duplicates
 1089|     75|        removeGPUDeviceNameRule(rule.devicePattern);
 1090|     75|        mGPUDeviceNameRules.push_back(rule);
 1091|     75|    }
_ZN4Ogre9Technique23removeGPUDeviceNameRuleERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 1094|     75|    {
 1095|    138|        for (GPUDeviceNameRuleList::iterator i = mGPUDeviceNameRules.begin(); i != mGPUDeviceNameRules.end(); )
  ------------------
  |  Branch (1095:79): [True: 63, False: 75]
  ------------------
 1096|     63|        {
 1097|     63|            if (i->devicePattern == devicePattern)
  ------------------
  |  Branch (1097:17): [True: 15, False: 48]
  ------------------
 1098|     15|                i = mGPUDeviceNameRules.erase(i);
 1099|     48|            else
 1100|     48|                ++i;
 1101|     63|        }
 1102|     75|    }

_ZN4Ogre7TextureC2EPNS_15ResourceManagerERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEmSB_bPNS_20ManualResourceLoaderE:
   40|   213k|        : Resource(creator, name, handle, group, isManual, loader),
   41|       |            // init defaults; can be overridden before load()
   42|   213k|            mHeight(512),
   43|   213k|            mWidth(512),
   44|   213k|            mDepth(1),
   45|   213k|            mNumRequestedMipmaps(0),
   46|   213k|            mNumMipmaps(0),
   47|   213k|            mGamma(1.0f),
   48|   213k|            mFSAA(0),
   49|   213k|            mFormat(PF_UNKNOWN),
   50|   213k|            mUsage(TU_DEFAULT),
   51|   213k|            mSrcFormat(PF_UNKNOWN),
   52|   213k|            mSrcWidth(0),
   53|   213k|            mSrcHeight(0), 
   54|   213k|            mSrcDepth(0),
   55|   213k|            mTreatLuminanceAsAlpha(false),
   56|   213k|            mInternalResourcesCreated(false),
   57|   213k|            mMipmapsHardwareGenerated(false),
   58|   213k|            mHwGamma(false),
   59|   213k|            mTextureType(TEX_TYPE_2D),
   60|   213k|            mDesiredIntegerBitDepth(0),
   61|   213k|            mDesiredFloatBitDepth(0),
   62|   213k|            mDesiredFormat(PF_UNKNOWN)
   63|   213k|    {
   64|   213k|        if (createParamDictionary("Texture"))
  ------------------
  |  Branch (64:13): [True: 1, False: 213k]
  ------------------
   65|      1|        {
   66|       |            // Define the parameters that have to be present to load
   67|       |            // from a generic source; actually there are none, since when
   68|       |            // predeclaring, you use a texture file which includes all the
   69|       |            // information required.
   70|      1|        }
   71|       |
   72|       |        // Set some defaults for default load path
   73|   213k|        if (TextureManager::getSingletonPtr())
  ------------------
  |  Branch (73:13): [True: 213k, False: 0]
  ------------------
   74|   213k|        {
   75|   213k|            TextureManager& tmgr = TextureManager::getSingleton();
   76|   213k|            setNumMipmaps(tmgr.getDefaultNumMipmaps());
   77|   213k|            setDesiredBitDepths(tmgr.getPreferredIntegerBitDepth(), tmgr.getPreferredFloatBitDepth());
   78|   213k|        }
   79|       |
   80|       |        
   81|   213k|    }
_ZN4Ogre7Texture9setFormatENS_11PixelFormatE:
  118|  9.65k|    {
  119|  9.65k|        mFormat = pf;
  120|  9.65k|        mDesiredFormat = pf;
  121|  9.65k|    }
_ZN4Ogre7Texture19setDesiredBitDepthsEtt:
  149|   213k|    {
  150|   213k|        mDesiredIntegerBitDepth = integerBits;
  151|   213k|        mDesiredFloatBitDepth = floatBits;
  152|   213k|    }
_ZN4Ogre7Texture24setTreatLuminanceAsAlphaEb:
  155|  9.65k|    {
  156|  9.65k|        mTreatLuminanceAsAlpha = asAlpha;
  157|  9.65k|    }

_ZN4Ogre14TextureManager15getSingletonPtrEv:
   35|   226k|    {
   36|   226k|        return msSingleton;
   37|   226k|    }
_ZN4Ogre14TextureManager12getSingletonEv:
   39|  1.07M|    {  
   40|       |        assert( msSingleton );  return ( *msSingleton );  
   41|  1.07M|    }
_ZN4Ogre14TextureManagerC2Ev:
   44|      1|         : mPreferredIntegerBitDepth(0)
   45|      1|         , mPreferredFloatBitDepth(0)
   46|      1|         , mDefaultNumMipmaps(MIP_UNLIMITED)
   47|      1|    {
   48|      1|        mResourceType = "Texture";
   49|      1|        mLoadOrder = 75.0f;
   50|       |
   51|       |        // Subclasses should register (when this is fully constructed)
   52|      1|    }
_ZN4Ogre14TextureManager13createSamplerERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   60|  4.72k|    {
   61|  4.72k|        SamplerPtr ret = _createSamplerImpl();
   62|  4.72k|        if(!name.empty())
  ------------------
  |  Branch (62:12): [True: 132, False: 4.59k]
  ------------------
   63|    132|        {
   64|    132|            if (mNamedSamplers.find(name) != mNamedSamplers.end())
  ------------------
  |  Branch (64:17): [True: 65, False: 67]
  ------------------
   65|    132|                OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Sampler '" + name + "' already exists");
   66|     67|            mNamedSamplers[name] = ret;
   67|     67|        }
   68|  4.65k|        return ret;
   69|  4.72k|    }
_ZNK4Ogre14TextureManager10getSamplerERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   73|    313|    {
   74|    313|        static SamplerPtr nullPtr;
   75|    313|        auto it = mNamedSamplers.find(name);
   76|    313|        if(it == mNamedSamplers.end())
  ------------------
  |  Branch (76:12): [True: 21, False: 292]
  ------------------
   77|     21|            return nullPtr;
   78|    292|        return it->second;
   79|    313|    }
_ZNK4Ogre14TextureManager9getByNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
   82|  9.65k|    {
   83|  9.65k|        return static_pointer_cast<Texture>(getResourceByName(name, groupName));
   84|  9.65k|    }
_ZNK4Ogre14TextureManager27getPreferredIntegerBitDepthEv:
  245|   213k|    {
  246|   213k|        return mPreferredIntegerBitDepth;
  247|   213k|    }
_ZNK4Ogre14TextureManager25getPreferredFloatBitDepthEv:
  275|   213k|    {
  276|   213k|        return mPreferredFloatBitDepth;
  277|   213k|    }
_ZN4Ogre14TextureManager17getDefaultSamplerEv:
  361|  19.0k|    {
  362|  19.0k|        if(!mDefaultSampler)
  ------------------
  |  Branch (362:12): [True: 1, False: 19.0k]
  ------------------
  363|      1|            mDefaultSampler = createSampler();
  364|       |
  365|  19.0k|        return mDefaultSampler;
  366|  19.0k|    }

_ZN4Ogre7SamplerC2Ev:
   40|  4.72k|        : mBorderColour(ColourValue::Black)
   41|  4.72k|        , mMaxAniso(1)
   42|  4.72k|        , mMipmapBias(0)
   43|  4.72k|        , mMinFilter(FO_LINEAR)
   44|  4.72k|        , mMagFilter(FO_LINEAR)
   45|  4.72k|        , mMipFilter(FO_POINT)
   46|  4.72k|        , mCompareFunc(CMPF_GREATER_EQUAL)
   47|  4.72k|        , mCompareEnabled(false)
   48|  4.72k|        , mDirty(true)
   49|  4.72k|    {
   50|  4.72k|        setAddressingMode(TAM_WRAP);
   51|  4.72k|    }
_ZN4Ogre7SamplerD2Ev:
   52|  4.65k|    Sampler::~Sampler() {}
_ZN4Ogre7Sampler17setAddressingModeERKNS0_17UVWAddressingModeE:
   55|  8.48k|    {
   56|  8.48k|        mAddressMode = uvw;
   57|  8.48k|        mDirty = true;
   58|  8.48k|    }
_ZN4Ogre7Sampler12setFilteringENS_20TextureFilterOptionsE:
   62|  2.06k|    {
   63|  2.06k|        switch (filterType)
  ------------------
  |  Branch (63:17): [True: 2.06k, False: 0]
  ------------------
   64|  2.06k|        {
   65|  1.83k|        case TFO_NONE:
  ------------------
  |  Branch (65:9): [True: 1.83k, False: 222]
  ------------------
   66|  1.83k|            setFiltering(FO_POINT, FO_POINT, FO_NONE);
   67|  1.83k|            break;
   68|     19|        case TFO_BILINEAR:
  ------------------
  |  Branch (68:9): [True: 19, False: 2.04k]
  ------------------
   69|     19|            setFiltering(FO_LINEAR, FO_LINEAR, FO_POINT);
   70|     19|            break;
   71|    198|        case TFO_TRILINEAR:
  ------------------
  |  Branch (71:9): [True: 198, False: 1.86k]
  ------------------
   72|    198|            setFiltering(FO_LINEAR, FO_LINEAR, FO_LINEAR);
   73|    198|            break;
   74|      5|        case TFO_ANISOTROPIC:
  ------------------
  |  Branch (74:9): [True: 5, False: 2.05k]
  ------------------
   75|      5|            setFiltering(FO_ANISOTROPIC, FO_ANISOTROPIC, FO_LINEAR);
   76|      5|            break;
   77|  2.06k|        }
   78|  2.06k|    }
_ZN4Ogre7Sampler12setFilteringENS_13FilterOptionsES1_S1_:
   98|  2.35k|    {
   99|  2.35k|        mMinFilter = minFilter;
  100|  2.35k|        mMagFilter = magFilter;
  101|  2.35k|        mMipFilter = mipFilter;
  102|  2.35k|        mDirty = true;
  103|  2.35k|    }
_ZN4Ogre16TextureUnitStateC2EPNS_4PassE:
  121|  12.6k|        : mCurrentFrame(0)
  122|  12.6k|        , mAnimDuration(0)
  123|  12.6k|        , mUnorderedAccessMipLevel(-1)
  124|  12.6k|        , mGamma(1)
  125|  12.6k|        , mUMod(0)
  126|  12.6k|        , mVMod(0)
  127|  12.6k|        , mUScale(1)
  128|  12.6k|        , mVScale(1)
  129|  12.6k|        , mRotate(0)
  130|  12.6k|        , mTexModMatrix(Matrix4::IDENTITY)
  131|  12.6k|        , mContentType(CONTENT_NAMED)
  132|  12.6k|        , mTextureLoadFailed(false)
  133|  12.6k|        , mRecalcTexMatrix(false)
  134|  12.6k|        , mTextureCoordSetIndex(0)
  135|  12.6k|        , mFramePtrs(1)
  136|  12.6k|        , mSampler(TextureManager::getSingletonPtr() ? TextureManager::getSingleton().getDefaultSampler() : DUMMY_SAMPLER)
  ------------------
  |  Branch (136:20): [True: 12.6k, False: 0]
  ------------------
  137|  12.6k|        , mParent(parent)
  138|  12.6k|        , mAnimController(0)
  139|  12.6k|    {
  140|  12.6k|        mColourBlendMode.blendType = LBT_COLOUR;
  141|  12.6k|        mAlphaBlendMode.operation = LBX_MODULATE;
  142|  12.6k|        mAlphaBlendMode.blendType = LBT_ALPHA;
  143|  12.6k|        mAlphaBlendMode.source1 = LBS_TEXTURE;
  144|  12.6k|        mAlphaBlendMode.source2 = LBS_CURRENT;
  145|  12.6k|        setColourOperation(LBO_MODULATE);
  146|       |
  147|  12.6k|        if( Pass::getHashFunction() == Pass::getBuiltinHashFunction( Pass::MIN_TEXTURE_CHANGE ) )
  ------------------
  |  Branch (147:13): [True: 0, False: 12.6k]
  ------------------
  148|      0|        {
  149|      0|            mParent->_dirtyHash();
  150|      0|        }
  151|       |
  152|  12.6k|    }
_ZN4Ogre16TextureUnitStateD2Ev:
  171|  12.6k|    {
  172|       |        // Unload ensure all controllers destroyed
  173|  12.6k|        _unload();
  174|  12.6k|    }
_ZN4Ogre16TextureUnitState14setTextureNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_11TextureTypeE:
  232|  9.66k|    {
  233|  9.66k|        TexturePtr tex = retrieveTexture(name);
  234|       |
  235|  9.66k|        if(!tex)
  ------------------
  |  Branch (235:12): [True: 0, False: 9.66k]
  ------------------
  236|      0|            return;
  237|       |
  238|  9.66k|        tex->setTextureType(texType);
  239|  9.66k|        setTexture(tex);
  240|  9.66k|    }
_ZN4Ogre16TextureUnitState10setTextureERKNS_9SharedPtrINS_7TextureEEE:
  243|  9.66k|    {
  244|  9.66k|        if (!texPtr)
  ------------------
  |  Branch (244:13): [True: 0, False: 9.66k]
  ------------------
  245|      0|        {
  246|      0|            OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND,
  247|      0|                "Texture Pointer is empty.",
  248|      0|                "TextureUnitState::setTexture");
  249|      0|        }
  250|       |
  251|  9.66k|        setContentType(CONTENT_NAMED);
  252|  9.66k|        mTextureLoadFailed = false;
  253|       |        
  254|  9.66k|        if (texPtr->getTextureType() == TEX_TYPE_EXTERNAL_OES)
  ------------------
  |  Branch (254:13): [True: 0, False: 9.66k]
  ------------------
  255|      0|        {
  256|      0|            setTextureAddressingMode( TAM_CLAMP );
  257|      0|            setTextureFiltering(FT_MIP, FO_NONE);
  258|      0|        }
  259|       |
  260|  9.66k|        mFramePtrs.resize(1);
  261|  9.66k|        mFramePtrs[0] = texPtr;
  262|       |
  263|  9.66k|        mCurrentFrame = 0;
  264|       |
  265|       |        // Load immediately ?
  266|  9.66k|        if (isLoaded())
  ------------------
  |  Branch (266:13): [True: 0, False: 9.66k]
  ------------------
  267|      0|        {
  268|      0|            _load(); // reload
  269|      0|        }
  270|       |        // Tell parent to recalculate hash
  271|  9.66k|        if( Pass::getHashFunction() == Pass::getBuiltinHashFunction( Pass::MIN_TEXTURE_CHANGE ) )
  ------------------
  |  Branch (271:13): [True: 0, False: 9.66k]
  ------------------
  272|      0|        {
  273|      0|            mParent->_dirtyHash();
  274|      0|        }
  275|  9.66k|    }
_ZN4Ogre16TextureUnitState14setContentTypeENS0_11ContentTypeE:
  278|  13.0k|    {
  279|  13.0k|        mContentType = ct;
  280|  13.0k|    }
_ZN4Ogre16TextureUnitState22setAnimatedTextureNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEmf:
  356|    522|    {
  357|    522|        String baseName, ext;
  358|    522|        StringUtil::splitBaseFilename(name, baseName, ext);
  359|       |
  360|    522|        std::vector<String> names(numFrames);
  361|   810k|        for (uint32 i = 0; i < names.size(); ++i)
  ------------------
  |  Branch (361:28): [True: 809k, False: 522]
  ------------------
  362|   809k|        {
  363|   809k|            names[i] = StringUtil::format("%s_%u.%s", baseName.c_str(), i, ext.c_str());
  364|   809k|        }
  365|       |
  366|    522|        setAnimatedTextureName(names, duration);
  367|    522|    }
_ZN4Ogre16TextureUnitState22setAnimatedTextureNameEPKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEmf:
  370|    571|    {
  371|    571|        setContentType(CONTENT_NAMED);
  372|    571|        mTextureLoadFailed = false;
  373|       |
  374|       |        // resize pointers, but don't populate until needed
  375|    571|        mFramePtrs.resize(numFrames);
  376|    571|        mAnimDuration = duration;
  377|    571|        mCurrentFrame = 0;
  378|       |
  379|   810k|        for (unsigned int i = 0; i < mFramePtrs.size(); ++i)
  ------------------
  |  Branch (379:34): [True: 809k, False: 571]
  ------------------
  380|   809k|        {
  381|   809k|            mFramePtrs[i] = retrieveTexture(names[i]);
  382|   809k|        }
  383|       |
  384|       |        // Load immediately if Material loaded
  385|    571|        if (isLoaded())
  ------------------
  |  Branch (385:13): [True: 0, False: 571]
  ------------------
  386|      0|        {
  387|      0|            _load();
  388|      0|        }
  389|       |        // Tell parent to recalculate hash
  390|    571|        if( Pass::getHashFunction() == Pass::getBuiltinHashFunction( Pass::MIN_TEXTURE_CHANGE ) )
  ------------------
  |  Branch (390:13): [True: 0, False: 571]
  ------------------
  391|      0|        {
  392|      0|            mParent->_dirtyHash();
  393|      0|        }
  394|    571|    }
_ZN4Ogre16TextureUnitState16setDesiredFormatENS_11PixelFormatE:
  468|  9.65k|    {
  469|  9.65k|        OgreAssert(mFramePtrs[0], "frame must not be blank");
  ------------------
  |  Branch (469:9): [True: 0, False: 9.65k]
  ------------------
  470|  9.65k|        for(auto& frame : mFramePtrs)
  ------------------
  |  Branch (470:25): [True: 9.65k, False: 9.65k]
  ------------------
  471|  9.65k|            frame->setFormat(desiredFormat);
  472|  9.65k|    }
_ZN4Ogre16TextureUnitState13setNumMipmapsEi:
  480|  9.65k|    {
  481|  9.65k|        OgreAssert(mFramePtrs[0], "frame must not be blank");
  ------------------
  |  Branch (481:9): [True: 0, False: 9.65k]
  ------------------
  482|  9.65k|        for (auto& frame : mFramePtrs)
  ------------------
  |  Branch (482:26): [True: 9.65k, False: 9.65k]
  ------------------
  483|  9.65k|            frame->setNumMipmaps(numMipmaps == MIP_DEFAULT
  ------------------
  |  Branch (483:34): [True: 10, False: 9.64k]
  ------------------
  484|  9.65k|                                     ? TextureManager::getSingleton().getDefaultNumMipmaps()
  485|  9.65k|                                     : numMipmaps);
  486|  9.65k|    }
_ZN4Ogre16TextureUnitState10setIsAlphaEb:
  494|  9.65k|    {
  495|  9.65k|        OgreAssert(mFramePtrs[0], "frame must not be blank");
  ------------------
  |  Branch (495:9): [True: 0, False: 9.65k]
  ------------------
  496|  9.65k|        OGRE_IGNORE_DEPRECATED_BEGIN
  497|  9.65k|        for(auto& frame : mFramePtrs)
  ------------------
  |  Branch (497:25): [True: 9.65k, False: 9.65k]
  ------------------
  498|  9.65k|            frame->setTreatLuminanceAsAlpha(isAlpha);
  499|  9.65k|        OGRE_IGNORE_DEPRECATED_END
  500|  9.65k|    }
_ZN4Ogre16TextureUnitState23setHardwareGammaEnabledEb:
  513|  9.65k|    {
  514|  9.65k|        OgreAssert(mFramePtrs[0], "frame must not be blank");
  ------------------
  |  Branch (514:9): [True: 0, False: 9.65k]
  ------------------
  515|  9.65k|        for(auto& frame : mFramePtrs)
  ------------------
  |  Branch (515:25): [True: 9.65k, False: 9.65k]
  ------------------
  516|  9.65k|            frame->setHardwareGammaEnabled(g);
  517|  9.65k|    }
_ZN4Ogre16TextureUnitState18setTextureCoordSetEh:
  530|    194|    {
  531|    194|        mTextureCoordSetIndex = set;
  532|    194|    }
_ZN4Ogre16TextureUnitState20setColourOperationExENS_21LayerBlendOperationExENS_16LayerBlendSourceES2_RKNS_11ColourValueES5_f:
  540|  13.2k|    {
  541|  13.2k|        mColourBlendMode.operation = op;
  542|  13.2k|        mColourBlendMode.source1 = source1;
  543|  13.2k|        mColourBlendMode.source2 = source2;
  544|  13.2k|        mColourBlendMode.colourArg1 = arg1;
  545|  13.2k|        mColourBlendMode.colourArg2 = arg2;
  546|  13.2k|        mColourBlendMode.factor = manualBlend;
  547|  13.2k|    }
_ZN4Ogre16TextureUnitState18setColourOperationENS_19LayerBlendOperationE:
  550|  12.6k|    {
  551|       |        // Set up the multitexture and multipass blending operations
  552|  12.6k|        switch (op)
  ------------------
  |  Branch (552:17): [True: 12.6k, False: 0]
  ------------------
  553|  12.6k|        {
  554|      4|        case LBO_REPLACE:
  ------------------
  |  Branch (554:9): [True: 4, False: 12.6k]
  ------------------
  555|      4|            setColourOperationEx(LBX_SOURCE1, LBS_TEXTURE, LBS_CURRENT);
  556|      4|            setColourOpMultipassFallback(SBF_ONE, SBF_ZERO);
  557|      4|            break;
  558|      1|        case LBO_ADD:
  ------------------
  |  Branch (558:9): [True: 1, False: 12.6k]
  ------------------
  559|      1|            setColourOperationEx(LBX_ADD, LBS_TEXTURE, LBS_CURRENT);
  560|      1|            setColourOpMultipassFallback(SBF_ONE, SBF_ONE);
  561|      1|            break;
  562|  12.6k|        case LBO_MODULATE:
  ------------------
  |  Branch (562:9): [True: 12.6k, False: 5]
  ------------------
  563|  12.6k|            setColourOperationEx(LBX_MODULATE, LBS_TEXTURE, LBS_CURRENT);
  564|  12.6k|            setColourOpMultipassFallback(SBF_DEST_COLOUR, SBF_ZERO);
  565|  12.6k|            break;
  566|      0|        case LBO_ALPHA_BLEND:
  ------------------
  |  Branch (566:9): [True: 0, False: 12.6k]
  ------------------
  567|      0|            setColourOperationEx(LBX_BLEND_TEXTURE_ALPHA, LBS_TEXTURE, LBS_CURRENT);
  568|      0|            setColourOpMultipassFallback(SBF_SOURCE_ALPHA, SBF_ONE_MINUS_SOURCE_ALPHA);
  569|      0|            break;
  570|  12.6k|        }
  571|       |
  572|       |
  573|  12.6k|    }
_ZN4Ogre16TextureUnitState28setColourOpMultipassFallbackENS_16SceneBlendFactorES1_:
  576|  12.9k|    {
  577|  12.9k|        mColourBlendFallbackSrc = sourceFactor;
  578|  12.9k|        mColourBlendFallbackDest = destFactor;
  579|  12.9k|    }
_ZN4Ogre16TextureUnitState17setAlphaOperationENS_21LayerBlendOperationExENS_16LayerBlendSourceES2_fff:
  587|     45|    {
  588|     45|        mAlphaBlendMode.operation = op;
  589|     45|        mAlphaBlendMode.source1 = source1;
  590|     45|        mAlphaBlendMode.source2 = source2;
  591|     45|        mAlphaBlendMode.alphaArg1 = arg1;
  592|     45|        mAlphaBlendMode.alphaArg2 = arg2;
  593|     45|        mAlphaBlendMode.factor = manualBlend;
  594|     45|    }
_ZN4Ogre16TextureUnitState9addEffectENS0_13TextureEffectE:
  597|  3.48k|    {
  598|       |        // Ensure controller pointer is null
  599|  3.48k|        effect.controller = 0;
  600|       |
  601|  3.48k|        if (effect.type != ET_TRANSFORM)
  ------------------
  |  Branch (601:13): [True: 2.81k, False: 670]
  ------------------
  602|  2.81k|        {
  603|       |            // Replace - must be unique
  604|       |            // Search for existing effect of this type
  605|  2.81k|            EffectMap::iterator i = mEffects.find(effect.type);
  606|  2.81k|            if (i != mEffects.end())
  ------------------
  |  Branch (606:17): [True: 27, False: 2.79k]
  ------------------
  607|     27|            {
  608|       |                // Destroy old effect controller if exist
  609|     27|                if (i->second.controller)
  ------------------
  |  Branch (609:21): [True: 0, False: 27]
  ------------------
  610|      0|                {
  611|      0|                    ControllerManager::getSingleton().destroyController(i->second.controller);
  612|      0|                }
  613|       |
  614|     27|                mEffects.erase(i);
  615|     27|            }
  616|  2.81k|        }
  617|       |
  618|  3.48k|        if (isLoaded())
  ------------------
  |  Branch (618:13): [True: 0, False: 3.48k]
  ------------------
  619|      0|        {
  620|       |            // Create controller
  621|      0|            createEffectController(effect);
  622|      0|        }
  623|       |
  624|       |        // Record new effect
  625|  3.48k|        mEffects.emplace(effect.type, effect);
  626|       |
  627|  3.48k|    }
_ZN4Ogre16TextureUnitState17setEnvironmentMapEbi:
  673|  1.08k|    {
  674|  1.08k|        if (enable)
  ------------------
  |  Branch (674:13): [True: 1.08k, False: 1]
  ------------------
  675|  1.08k|        {
  676|  1.08k|            TextureEffect eff = {ET_ENVIRONMENT_MAP};
  677|  1.08k|            eff.subtype = envMapType;
  678|  1.08k|            addEffect(eff);
  679|  1.08k|        }
  680|      1|        else
  681|      1|        {
  682|      1|            removeEffect(ET_ENVIRONMENT_MAP);
  683|      1|        }
  684|  1.08k|    }
_ZN4Ogre16TextureUnitState12removeEffectENS0_17TextureEffectTypeE:
  687|  3.94k|    {
  688|       |        // Get range of items matching this effect
  689|  3.94k|        std::pair< EffectMap::iterator, EffectMap::iterator > remPair = 
  690|  3.94k|            mEffects.equal_range( type );
  691|       |        // Remove controllers
  692|  3.97k|        for (EffectMap::iterator i = remPair.first; i != remPair.second; ++i)
  ------------------
  |  Branch (692:53): [True: 36, False: 3.94k]
  ------------------
  693|     36|        {
  694|     36|            if (i->second.controller)
  ------------------
  |  Branch (694:17): [True: 0, False: 36]
  ------------------
  695|      0|            {
  696|      0|                ControllerManager::getSingleton().destroyController(i->second.controller);
  697|      0|            }
  698|     36|        }
  699|       |        // Erase         
  700|  3.94k|        mEffects.erase( remPair.first, remPair.second );
  701|  3.94k|    }
_ZN4Ogre16TextureUnitState16setTextureScrollEff:
  716|    196|    {
  717|    196|        mUMod = u;
  718|    196|        mVMod = v;
  719|    196|        mRecalcTexMatrix = true;
  720|    196|    }
_ZN4Ogre16TextureUnitState15setTextureScaleEff:
  723|    361|    {
  724|    361|        mUScale = uScale;
  725|    361|        mVScale = vScale;
  726|    361|        mRecalcTexMatrix = true;
  727|    361|    }
_ZN4Ogre16TextureUnitState18setScrollAnimationEff:
  813|  1.20k|    {
  814|       |        // Remove existing effects
  815|  1.20k|        removeEffect(ET_UVSCROLL);
  816|  1.20k|        removeEffect(ET_USCROLL);
  817|  1.20k|        removeEffect(ET_VSCROLL);
  818|       |
  819|       |        // don't create an effect if the speeds are both 0
  820|  1.20k|        if (uSpeed == 0.0f && vSpeed == 0.0f)
  ------------------
  |  Branch (820:13): [True: 227, False: 973]
  |  Branch (820:31): [True: 6, False: 221]
  ------------------
  821|      6|        {
  822|      6|            return;
  823|      6|        }
  824|       |
  825|       |        // Create new effect
  826|  1.19k|        if (uSpeed == vSpeed)
  ------------------
  |  Branch (826:13): [True: 209, False: 985]
  ------------------
  827|    209|        {
  828|    209|            addEffect({ET_UVSCROLL, uSpeed});
  829|    209|        }
  830|    985|        else
  831|    985|        {
  832|    985|            if (uSpeed)
  ------------------
  |  Branch (832:17): [True: 764, False: 221]
  ------------------
  833|    764|            {
  834|    764|                addEffect({ET_USCROLL, uSpeed});
  835|    764|            }
  836|    985|            if (vSpeed)
  ------------------
  |  Branch (836:17): [True: 428, False: 557]
  ------------------
  837|    428|            {
  838|    428|                addEffect({ET_VSCROLL, vSpeed});
  839|    428|            }
  840|    985|        }
  841|  1.19k|    }
_ZN4Ogre16TextureUnitState18setRotateAnimationEf:
  844|    339|    {
  845|       |        // Remove existing effect
  846|    339|        removeEffect(ET_ROTATE);
  847|       |        // don't create an effect if the speed is 0
  848|    339|        if(speed == 0.0f) 
  ------------------
  |  Branch (848:12): [True: 10, False: 329]
  ------------------
  849|     10|        {
  850|     10|          return;
  851|     10|        }
  852|       |        // Create new effect
  853|    329|        addEffect({ET_ROTATE, speed});
  854|    329|    }
_ZN4Ogre16TextureUnitState21setTransformAnimationENS0_20TextureTransformTypeENS_12WaveformTypeEffff:
  858|    677|    {
  859|       |        // Remove existing effect
  860|       |        // note, only remove for subtype, not entire ET_TRANSFORM
  861|       |        // otherwise we won't be able to combine subtypes
  862|       |        // Get range of items matching this effect
  863|  1.03k|        for (EffectMap::iterator i = mEffects.begin(); i != mEffects.end(); ++i)
  ------------------
  |  Branch (863:56): [True: 368, False: 665]
  ------------------
  864|    368|        {
  865|    368|            if (i->second.type == ET_TRANSFORM && i->second.subtype == ttype)
  ------------------
  |  Branch (865:17): [True: 196, False: 172]
  |  Branch (865:51): [True: 12, False: 184]
  ------------------
  866|     12|            {
  867|     12|                if (i->second.controller)
  ------------------
  |  Branch (867:21): [True: 0, False: 12]
  ------------------
  868|      0|                {
  869|      0|                    ControllerManager::getSingleton().destroyController(i->second.controller);
  870|      0|                }
  871|     12|                mEffects.erase(i);
  872|       |
  873|       |                // should only be one, so jump out
  874|     12|                break;
  875|     12|            }
  876|    368|        }
  877|       |
  878|       |        // don't create an effect if the given values are all 0
  879|    677|        if(base == 0.0f && phase == 0.0f && frequency == 0.0f && amplitude == 0.0f)
  ------------------
  |  Branch (879:12): [True: 252, False: 425]
  |  Branch (879:28): [True: 248, False: 4]
  |  Branch (879:45): [True: 9, False: 239]
  |  Branch (879:66): [True: 7, False: 2]
  ------------------
  880|      7|        {
  881|      7|            return;
  882|      7|        }
  883|       |        // Create new effect
  884|    670|        TextureEffect eff = {ET_TRANSFORM};
  885|    670|        eff.subtype = ttype;
  886|    670|        eff.waveType = waveType;
  887|    670|        eff.base = base;
  888|    670|        eff.frequency = frequency;
  889|    670|        eff.phase = phase;
  890|    670|        eff.amplitude = amplitude;
  891|    670|        addEffect(eff);
  892|    670|    }
_ZN4Ogre16TextureUnitState15retrieveTextureERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  960|   819k|    TexturePtr TextureUnitState::retrieveTexture(const String& name) {
  961|   819k|        TextureManager::ResourceCreateOrRetrieveResult res;
  962|   819k|        res = TextureManager::getSingleton().createOrRetrieve(name, mParent->getResourceGroup());
  963|   819k|        return static_pointer_cast<Texture>(res.first);
  964|   819k|    }
_ZN4Ogre16TextureUnitState7_unloadEv:
 1124|  12.6k|    {
 1125|       |        // Destroy animation controller
 1126|  12.6k|        if (mAnimController)
  ------------------
  |  Branch (1126:13): [True: 0, False: 12.6k]
  ------------------
 1127|      0|        {
 1128|      0|            ControllerManager::getSingleton().destroyController(mAnimController);
 1129|      0|            mAnimController = 0;
 1130|      0|        }
 1131|       |
 1132|       |        // Destroy effect controllers
 1133|  12.6k|        for (auto & e : mEffects)
  ------------------
  |  Branch (1133:23): [True: 3.41k, False: 12.6k]
  ------------------
 1134|  3.41k|        {
 1135|  3.41k|            if (e.second.controller)
  ------------------
  |  Branch (1135:17): [True: 0, False: 3.41k]
  ------------------
 1136|      0|            {
 1137|      0|                ControllerManager::getSingleton().destroyController(e.second.controller);
 1138|      0|                e.second.controller = 0;
 1139|      0|            }
 1140|  3.41k|        }
 1141|       |
 1142|       |        // don't unload named textures. may be used elsewhere
 1143|       |        // drop references on managed textures, however
 1144|  12.6k|        if(mContentType != CONTENT_NAMED)
  ------------------
  |  Branch (1144:12): [True: 1.20k, False: 11.4k]
  ------------------
 1145|  1.20k|            mFramePtrs[0].reset();
 1146|  12.6k|    }
_ZNK4Ogre16TextureUnitState8isLoadedEv:
 1149|  13.7k|    {
 1150|  13.7k|        return mParent->isLoaded();
 1151|  13.7k|    }
_ZN4Ogre16TextureUnitState7setNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 1185|  14.9k|    {
 1186|  14.9k|        mName = name;
 1187|  14.9k|    }
_ZN4Ogre16TextureUnitState13_notifyParentEPNS_4PassE:
 1190|  12.6k|    {
 1191|  12.6k|        mParent = parent;
 1192|  12.6k|    }
_ZN4Ogre16TextureUnitState22setCompositorReferenceERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_j:
 1195|    870|    {  
 1196|    870|        mCompositorRefName = compositorName; 
 1197|    870|        mCompositorRefTexName = textureName; 
 1198|    870|        mCompositorRefMrtIndex = mrtIndex; 
 1199|    870|    }
_ZNK4Ogre16TextureUnitState18isDefaultFilteringEv:
 1209|  6.46k|    bool TextureUnitState::isDefaultFiltering() const {
 1210|  6.46k|        return mSampler == TextureManager::getSingleton().getDefaultSampler();
 1211|  6.46k|    }
_ZN4Ogre16TextureUnitState16_getLocalSamplerEv:
 1214|  6.46k|    {
 1215|  6.46k|        if(isDefaultFiltering())
  ------------------
  |  Branch (1215:12): [True: 4.58k, False: 1.87k]
  ------------------
 1216|  4.58k|            mSampler = TextureManager::getSingleton().createSampler();
 1217|       |
 1218|  6.46k|        return mSampler;
 1219|  6.46k|    }

_ZN4Ogre5TimerC2Ev:
   36|      1|{
   37|      1|    reset();
   38|      1|}
_ZN4Ogre5Timer5resetEv:
   42|      1|{
   43|      1|    zeroClock = clock();
   44|      1|    start = steady_clock::now();
   45|      1|}

_ZN4Ogre26UnifiedHighLevelGpuProgramC2EPNS_15ResourceManagerERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEmSB_bPNS_20ManualResourceLoaderE:
   50|    805|        :GpuProgram(creator, name, handle, group, isManual, loader)
   51|    805|    {
   52|    805|        if (createParamDictionary("UnifiedHighLevelGpuProgram"))
  ------------------
  |  Branch (52:13): [True: 1, False: 804]
  ------------------
   53|      1|        {
   54|      1|            setupBaseParamDictionary();
   55|       |
   56|      1|            ParamDictionary* dict = getParamDictionary();
   57|       |
   58|      1|            dict->addParameter(ParameterDef("delegate",
   59|      1|                "Additional delegate programs containing implementations.",
   60|      1|                PT_STRING),&msCmdDelegate);
   61|      1|        }
   62|       |
   63|    805|    }
_ZN4Ogre26UnifiedHighLevelGpuProgramD2Ev:
   66|    805|    {
   67|       |
   68|    805|    }
_ZNK4Ogre26UnifiedHighLevelGpuProgram14chooseDelegateEv:
   71|  3.05k|    {
   72|  3.05k|        OGRE_LOCK_AUTO_MUTEX;
   73|       |
   74|  3.05k|        mChosenDelegate.reset();
   75|       |
   76|  3.05k|        for (const String& dn : mDelegateNames)
  ------------------
  |  Branch (76:31): [True: 12.4k, False: 3.05k]
  ------------------
   77|  12.4k|        {
   78|  12.4k|            GpuProgramPtr deleg = GpuProgramManager::getSingleton().getByName(dn, mGroup);
   79|       |
   80|       |            //recheck with auto resource group
   81|  12.4k|            if (!deleg)
  ------------------
  |  Branch (81:17): [True: 4.01k, False: 8.42k]
  ------------------
   82|  4.01k|                deleg = GpuProgramManager::getSingleton().getByName(dn, RGN_AUTODETECT);
   83|       |
   84|       |            // Silently ignore missing links
   85|  12.4k|            if(!deleg || (!deleg->isSupported() && !deleg->hasCompileError()))
  ------------------
  |  Branch (85:16): [True: 4.01k, False: 8.42k]
  |  Branch (85:27): [True: 8.42k, False: 0]
  |  Branch (85:52): [True: 8.42k, False: 0]
  ------------------
   86|  12.4k|                continue;
   87|       |
   88|      0|            if (deleg->getType() != getType())
  ------------------
  |  Branch (88:17): [True: 0, False: 0]
  ------------------
   89|      0|            {
   90|      0|                LogManager::getSingleton().logError("unified program '" + getName() +
   91|      0|                                                    "' delegating to program with different type '" + dn + "'");
   92|      0|                continue;
   93|      0|            }
   94|       |
   95|      0|            mChosenDelegate = deleg;
   96|      0|            break;
   97|      0|        }
   98|  3.05k|    }
_ZNK4Ogre26UnifiedHighLevelGpuProgram12_getDelegateEv:
  101|  3.05k|    {
  102|  3.05k|        if (!mChosenDelegate)
  ------------------
  |  Branch (102:13): [True: 3.05k, False: 0]
  ------------------
  103|  3.05k|        {
  104|  3.05k|            chooseDelegate();
  105|  3.05k|        }
  106|  3.05k|        return mChosenDelegate;
  107|  3.05k|    }
_ZN4Ogre26UnifiedHighLevelGpuProgram18addDelegateProgramERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  110|  3.12k|    {
  111|  3.12k|            OGRE_LOCK_AUTO_MUTEX;
  112|       |
  113|  3.12k|        mDelegateNames.push_back(name);
  114|       |
  115|       |        // reset chosen delegate
  116|  3.12k|        mChosenDelegate.reset();
  117|       |
  118|  3.12k|    }
_ZN4Ogre26UnifiedHighLevelGpuProgram16createParametersEv:
  148|    305|    {
  149|    305|        if (isSupported())
  ------------------
  |  Branch (149:13): [True: 0, False: 305]
  ------------------
  150|      0|        {
  151|      0|            return _getDelegate()->createParameters();
  152|      0|        }
  153|    305|        else
  154|    305|        {
  155|       |            // return a default set
  156|    305|            GpuProgramParametersSharedPtr params = GpuProgramManager::getSingleton().createParameters();
  157|       |            // avoid any errors on parameter names that don't exist
  158|    305|            params->setIgnoreMissingParams(true);
  159|    305|            return params;
  160|    305|        }
  161|    305|    }
_ZNK4Ogre26UnifiedHighLevelGpuProgram11isSupportedEv:
  172|  1.66k|    {
  173|       |        // Supported if one of the delegates is
  174|  1.66k|        return _getDelegate() && _getDelegate()->isSupported();
  ------------------
  |  Branch (174:16): [True: 0, False: 1.66k]
  |  Branch (174:34): [True: 0, False: 0]
  ------------------
  175|  1.66k|    }
_ZNK4Ogre26UnifiedHighLevelGpuProgram15hasCompileErrorEv:
  260|      1|    {
  261|      1|        if (!_getDelegate())
  ------------------
  |  Branch (261:13): [True: 1, False: 0]
  ------------------
  262|      1|        {
  263|      1|            return false;
  264|      1|        }
  265|      0|        else
  266|      0|        {
  267|      0|            return _getDelegate()->hasCompileError();
  268|      0|        }
  269|      1|    }
_ZN4Ogre26UnifiedHighLevelGpuProgram6unloadEv:
  298|    779|    {
  299|    779|        if (_getDelegate())
  ------------------
  |  Branch (299:13): [True: 0, False: 779]
  ------------------
  300|      0|            _getDelegate()->unload();
  301|    779|    }
_ZN4Ogre26UnifiedHighLevelGpuProgram11addListenerEPNS_8Resource8ListenerE:
  362|    305|    {
  363|    305|        if (_getDelegate())
  ------------------
  |  Branch (363:13): [True: 0, False: 305]
  ------------------
  364|      0|            _getDelegate()->addListener(lis);
  365|    305|    }
_ZN4Ogre26UnifiedHighLevelGpuProgram14removeListenerEPNS_8Resource8ListenerE:
  368|    305|    {
  369|    305|        if (_getDelegate())
  ------------------
  |  Branch (369:13): [True: 0, False: 305]
  ------------------
  370|      0|            _getDelegate()->removeListener(lis);
  371|    305|    }
_ZN4Ogre11CmdDelegate5doSetEPvRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  402|  3.12k|    {
  403|  3.12k|        static_cast<UnifiedHighLevelGpuProgram*>(target)->addDelegateProgram(val);
  404|  3.12k|    }
_ZN4Ogre33UnifiedHighLevelGpuProgramFactoryC2Ev:
  408|      1|    {
  409|      1|    }
_ZNK4Ogre33UnifiedHighLevelGpuProgramFactory11getLanguageEv:
  416|      1|    {
  417|      1|        return sLanguage;
  418|      1|    }
_ZN4Ogre33UnifiedHighLevelGpuProgramFactory6createEPNS_15ResourceManagerERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEmSB_bPNS_20ManualResourceLoaderE:
  423|    805|    {
  424|       |        return OGRE_NEW UnifiedHighLevelGpuProgram(creator, name, handle, group, isManual, loader);
  425|    805|    }

_ZN4Ogre20DefaultWorkQueueBaseC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   65|      1|        : mName(name)
   66|      1|        , mWorkerThreadCount(1)
   67|      1|        , mWorkerRenderSystemAccess(false)
   68|      1|        , mIsRunning(false)
   69|      1|        , mResposeTimeLimitMS(10)
   70|      1|        , mPaused(false)
   71|      1|        , mAcceptRequests(true)
   72|      1|        , mShuttingDown(false)
   73|      1|    {
   74|      1|    }
_ZN4Ogre20DefaultWorkQueueBase31setWorkersCanAccessRenderSystemEb:
   87|      1|    {
   88|      1|        mWorkerRenderSystemAccess = access;
   89|      1|    }

_ZNK4Ogre17ZipArchiveFactory7getTypeEv:
  331|      2|    {
  332|      2|        static String name = "Zip";
  333|      2|        return name;
  334|      2|    }
_ZN4Ogre25EmbeddedZipArchiveFactoryC2Ev:
  358|      1|    EmbeddedZipArchiveFactory::EmbeddedZipArchiveFactory() {}
_ZNK4Ogre25EmbeddedZipArchiveFactory7getTypeEv:
  378|      2|    {
  379|      2|        static String name = "EmbeddedZip";
  380|      2|        return name;
  381|      2|    }

LLVMFuzzerTestOneInput:
   95|  5.81k|extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
   96|  5.81k|  if (size == 0 || size > FUZZ_MAX_INPUT)
  ------------------
  |  Branch (96:7): [True: 0, False: 5.81k]
  |  Branch (96:20): [True: 7, False: 5.80k]
  ------------------
   97|      7|    return 0;
   98|       |
   99|  5.80k|  global_init();
  100|       |
  101|  5.80k|  Ogre::DataStreamPtr stream(new Ogre::MemoryDataStream("fuzz.os", const_cast<uint8_t*>(data), size, false, true));
  102|       |
  103|  5.80k|  try
  104|  5.80k|  {
  105|  5.80k|    Ogre::ScriptCompilerManager::getSingleton().parseScript(stream, FUZZ_GROUP);
  106|  5.80k|  }
  107|  5.80k|  catch (std::exception&)
  108|  5.80k|  {
  109|    838|  }
  110|       |
  111|  5.80k|  purge_state();
  112|  5.80k|  return 0;
  113|  5.80k|}
script_fuzz.cpp:_ZL11global_initv:
   63|  5.80k|static void global_init() {
   64|  5.80k|  if (g_initialized)
  ------------------
  |  Branch (64:7): [True: 5.80k, False: 1]
  ------------------
   65|  5.80k|    return;
   66|       |
   67|      1|  auto *logMgr = new Ogre::LogManager();
   68|      1|  logMgr->createLog("fuzz.log", true, false);
   69|      1|  logMgr->setMinLogLevel(Ogre::LML_CRITICAL);
   70|       |
   71|      1|  new Ogre::Root("", "", "");
   72|       |
   73|       |  /* Root::initialise() would do this, but that needs a RenderSystem. */
   74|      1|  Ogre::MaterialManager::getSingleton().initialise();
   75|      1|  new Ogre::DefaultTextureManager();
   76|       |
   77|      1|  static FuzzScriptListener listener;
   78|      1|  Ogre::ScriptCompilerManager::getSingleton().setListener(&listener);
   79|       |
   80|      1|  Ogre::ResourceGroupManager::getSingleton().createResourceGroup(FUZZ_GROUP, false);
   81|      1|  g_initialized = true;
   82|      1|}
_ZN18FuzzScriptListener10importFileEPN4Ogre14ScriptCompilerERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE:
   56|  15.9k|    {
   57|  15.9k|        return std::make_shared<Ogre::ConcreteNodeList>();
   58|  15.9k|    }
_ZN18FuzzScriptListener11handleErrorEPN4Ogre14ScriptCompilerEjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEiSB_:
   53|  87.2k|    void handleError(Ogre::ScriptCompiler*, Ogre::uint32, const Ogre::String&, int, const Ogre::String&) override {}
script_fuzz.cpp:_ZL11purge_statev:
   85|  5.80k|static void purge_state() {
   86|  5.80k|  auto &rgm = Ogre::ResourceGroupManager::getSingleton();
   87|  5.80k|  rgm.destroyResourceGroup(FUZZ_GROUP);
   88|  5.80k|  rgm.createResourceGroup(FUZZ_GROUP, false);
   89|       |
   90|       |  /* Particle system templates are not Resources - they live in a private map
   91|       |   * in ParticleSystemManager and would grow without bound otherwise. */
   92|  5.80k|  Ogre::ParticleSystemManager::getSingleton().removeAllTemplates();
   93|  5.80k|}

