Beispiel #1
0
STDMETHODIMP CTangramNode::get_Attribute(BSTR bstrKey, BSTR* pVal)
{
	IXMLDOMElement* ele = NULL;
	m_ObjItem.elem.QueryInterface<IXMLDOMElement>(&ele);
	if (ele != NULL)
	{
		VARIANT var;
		ele->getAttribute(bstrKey,&var);		
		ele->Release();

		if (var.vt == VT_BSTR)
		{
			*pVal = var.bstrVal;
		}
	}
	return S_OK;
}
Beispiel #2
0
HRESULT COFSNcDlg2::GetNodeAttribute(IXMLDOMNode *pNode, BSTR bsAttrName, CComBSTR &strAttrValue)
{
	HRESULT hr = S_OK;
	IXMLDOMElement *pEle = NULL;
	
	if(pNode == NULL)
		return E_INVALIDARG;
	
	hr = pNode->QueryInterface(IID_IXMLDOMElement, (void**)&pEle);
	if(pEle)
	{
		CComVariant var;
		hr = pEle->getAttribute(bsAttrName, &var);
		strAttrValue = var.bstrVal;
		pEle->Release();
	}
	return hr;
}
Beispiel #3
0
bool COpenGL::SetShadersGLSL(const TCHAR *glslFileName)
{
	char *fragment=NULL, *vertex=NULL;
	IXMLDOMDocument * pXMLDoc = NULL;
	IXMLDOMElement * pXDE = NULL;
	IXMLDOMNode * pXDN = NULL;
	HRESULT hr;
	BSTR queryString, nodeContent;

	TCHAR errorMsg[MAX_PATH + 50];

	if(fragmentShader) {
		glDetachShader(shaderProgram,fragmentShader);
		glDeleteShader(fragmentShader);
		fragmentShader = 0;
	}
	if(vertexShader) {
		glDetachShader(shaderProgram,vertexShader);
		glDeleteShader(vertexShader);
		vertexShader = 0;
	}
	if(shaderProgram) {
		glUseProgram(0);
		glDeleteProgram(shaderProgram);
		shaderProgram = 0;
	}

	if(glslFileName==NULL || *glslFileName==TEXT('\0'))
		return true;

	if(!LoadShaderFunctions()) {
        MessageBox(NULL, TEXT("Unable to load OpenGL shader functions"), TEXT("Shader Loading Error"),
			MB_OK|MB_ICONEXCLAMATION);
        return false;
    }

	hr = CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pXMLDoc));

	if(FAILED(hr)) {
		MessageBox(NULL, TEXT("Error creating XML Parser"), TEXT("Shader Loading Error"),
			MB_OK|MB_ICONEXCLAMATION);
		return false;
	}

	VARIANT fileName;
	VARIANT_BOOL ret;
	fileName.vt = VT_BSTR;
#ifdef UNICODE
	fileName.bstrVal = SysAllocString(glslFileName);
#else
	wchar_t tempfilename[MAX_PATH];
	MultiByteToWideChar(CP_UTF8,0,glslFileName,-1,tempfilename,MAX_PATH);
	fileName.bstrVal = SysAllocString(tempfilename);
#endif
	hr = pXMLDoc->load(fileName,&ret);
	SysFreeString(fileName.bstrVal);

	if(FAILED(hr) || hr==S_FALSE) {
		_stprintf(errorMsg,TEXT("Error loading GLSL shader file:\n%s"),glslFileName);
		MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION);
		pXMLDoc->Release();
		return false;
	}

	VARIANT attributeValue;
	BSTR attributeName;

	hr = pXMLDoc->get_documentElement(&pXDE);
	if(FAILED(hr) || hr==S_FALSE) {
		_stprintf(errorMsg,TEXT("Error loading root element from file:\n%s"),glslFileName);
		MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION);
		pXMLDoc->Release();
		return false;
	}

	attributeName=SysAllocString(L"language");
	pXDE->getAttribute(attributeName,&attributeValue);
	SysFreeString(attributeName);
	pXDE->Release();

	if(attributeValue.vt!=VT_BSTR || lstrcmpiW(attributeValue.bstrVal,L"glsl")) {
		_stprintf(errorMsg,TEXT("Shader language is <%s>, expected <GLSL> in file:\n%s"),attributeValue.bstrVal,glslFileName);
		MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION);
		if(attributeValue.vt==VT_BSTR) SysFreeString(attributeValue.bstrVal);
		pXMLDoc->Release();
		return false;
	}
	if(attributeValue.vt==VT_BSTR) SysFreeString(attributeValue.bstrVal);

	queryString=SysAllocString(L"/shader/fragment");
	hr = pXMLDoc->selectSingleNode(queryString,&pXDN);
	SysFreeString(queryString);

	if(hr == S_OK) {
		hr = pXDN->get_text(&nodeContent);
		if(hr == S_OK) {
			int requiredChars = WideCharToMultiByte(CP_ACP,0,nodeContent,-1,fragment,0,NULL,NULL);
			fragment = new char[requiredChars];
			WideCharToMultiByte(CP_UTF8,0,nodeContent,-1,fragment,requiredChars,NULL,NULL);
		}
		SysFreeString(nodeContent);
		pXDN->Release();
		pXDN = NULL;
	}

	queryString=SysAllocString(L"/shader/vertex");
	hr = pXMLDoc->selectSingleNode(queryString,&pXDN);
	SysFreeString(queryString);

	if(hr == S_OK) {
		hr = pXDN->get_text(&nodeContent);
		if(hr == S_OK) {
			int requiredChars = WideCharToMultiByte(CP_ACP,0,nodeContent,-1,vertex,0,NULL,NULL);
			vertex = new char[requiredChars];
			WideCharToMultiByte(CP_UTF8,0,nodeContent,-1,vertex,requiredChars,NULL,NULL);
		}
		SysFreeString(nodeContent);
		pXDN->Release();
		pXDN = NULL;
	}

	pXMLDoc->Release();

	if(!fragment && !vertex) {
		_stprintf(errorMsg,TEXT("No vertex or fragment program in file:\n%s"),glslFileName);
		MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION);
		return false;
	}

    shaderProgram = glCreateProgram ();
	if(vertex) {
		vertexShader = glCreateShader (GL_VERTEX_SHADER);
		glShaderSource(vertexShader, 1, (const GLchar **)&vertex, NULL);
		glCompileShader(vertexShader);
		glAttachShader(shaderProgram, vertexShader);
		delete[] vertex;
	}
	if(fragment) {
		fragmentShader = glCreateShader (GL_FRAGMENT_SHADER);
		glShaderSource(fragmentShader, 1, (const GLchar **)&fragment, NULL);    
		glCompileShader(fragmentShader);    
		glAttachShader(shaderProgram, fragmentShader);
		delete[] fragment;
	}

    glLinkProgram(shaderProgram);
    glUseProgram(shaderProgram);

	shader_type = OGL_SHADER_GLSL;

    return true;
}
Beispiel #4
0
bool CDirect3D::SetShaderHLSL(const TCHAR *file)
{
	//MUDLORD: the guts
	//Compiles a shader from files on disc
	//Sets LUT textures to texture files in PNG format.

	TCHAR folder[MAX_PATH];
	TCHAR rubyLUTfileName[MAX_PATH];
	TCHAR *slash;
	char *shaderText = NULL;

	TCHAR errorMsg[MAX_PATH + 50];

	IXMLDOMDocument * pXMLDoc = NULL;
	IXMLDOMElement * pXDE = NULL;
	IXMLDOMNode * pXDN = NULL;
	BSTR queryString, nodeContent;

	HRESULT hr;

	shaderTimer = 1.0f;
	shaderTimeStart = 0;
	shaderTimeElapsed = 0;

	if(effect) {
		effect->Release();
		effect = NULL;
	}
	for(int i = 0; i < MAX_SHADER_TEXTURES; i++) {
		if (rubyLUT[i] != NULL) {
			rubyLUT[i]->Release();
			rubyLUT[i] = NULL;
		}
	}
	if (file == NULL || *file==TEXT('\0'))
		return true;

	hr = CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pXMLDoc));

	if(FAILED(hr)) {
		MessageBox(NULL, TEXT("Error creating XML Parser"), TEXT("Shader Loading Error"),
			MB_OK|MB_ICONEXCLAMATION);
		return false;
	}

	VARIANT fileName;
	VARIANT_BOOL ret;
	fileName.vt = VT_BSTR;
#ifdef UNICODE
	fileName.bstrVal = SysAllocString(file);
#else
	wchar_t tempfilename[MAX_PATH];
	MultiByteToWideChar(CP_UTF8,0,file,-1,tempfilename,MAX_PATH);
	fileName.bstrVal = SysAllocString(tempfilename);
#endif
	hr = pXMLDoc->load(fileName,&ret);
	SysFreeString(fileName.bstrVal);

	if(FAILED(hr) || hr==S_FALSE) {
		_stprintf(errorMsg,TEXT("Error loading HLSL shader file:\n%s"),file);
		MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION);
		pXMLDoc->Release();
		return false;
	}

	VARIANT attributeValue;
	BSTR attributeName;

	hr = pXMLDoc->get_documentElement(&pXDE);
	if(FAILED(hr) || hr==S_FALSE) {
		_stprintf(errorMsg,TEXT("Error loading root element from file:\n%s"),file);
		MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION);
		pXMLDoc->Release();
		return false;
	}

	attributeName=SysAllocString(L"language");
	pXDE->getAttribute(attributeName,&attributeValue);
	SysFreeString(attributeName);
	pXDE->Release();

	if(attributeValue.vt!=VT_BSTR || lstrcmpiW(attributeValue.bstrVal,L"hlsl")) {
		_stprintf(errorMsg,TEXT("Shader language is <%s>, expected <HLSL> in file:\n%s"),attributeValue.bstrVal,file);
		MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION);
		if(attributeValue.vt==VT_BSTR) SysFreeString(attributeValue.bstrVal);
		pXMLDoc->Release();
		return false;
	}
	if(attributeValue.vt==VT_BSTR) SysFreeString(attributeValue.bstrVal);

	queryString=SysAllocString(L"/shader/source");
	hr = pXMLDoc->selectSingleNode(queryString,&pXDN);
	SysFreeString(queryString);

	if(hr == S_OK) {
		hr = pXDN->get_text(&nodeContent);
		if(hr == S_OK) {
			int requiredChars = WideCharToMultiByte(CP_ACP,0,nodeContent,-1,shaderText,0,NULL,NULL);
			shaderText = new char[requiredChars];
			WideCharToMultiByte(CP_UTF8,0,nodeContent,-1,shaderText,requiredChars,NULL,NULL);
		}
		SysFreeString(nodeContent);
		pXDN->Release();
		pXDN = NULL;
	}

	pXMLDoc->Release();

	if(!shaderText) {
		_stprintf(errorMsg,TEXT("No HLSL shader program in file:\n%s"),file);
		MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"),
			MB_OK|MB_ICONEXCLAMATION);
		return false;
	}

	LPD3DXBUFFER pBufferErrors = NULL;
	hr = D3DXCreateEffect( pDevice,shaderText,strlen(shaderText),NULL, NULL,
		D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY, NULL, &effect, 
		&pBufferErrors );
	delete[] shaderText;
	if( FAILED(hr) ) {
		_stprintf(errorMsg,TEXT("Error parsing HLSL shader file:\n%s"),file);
		MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION);
		if(pBufferErrors) {
			LPVOID pCompilErrors = pBufferErrors->GetBufferPointer();
			MessageBox(NULL, (const TCHAR*)pCompilErrors, TEXT("FX Compile Error"),
				MB_OK|MB_ICONEXCLAMATION);
		}
		return false;
	}

	lstrcpy(folder,file);
	slash = _tcsrchr(folder,TEXT('\\'));
	if(slash)
		*(slash+1)=TEXT('\0');
	else
		*folder=TEXT('\0');
	SetCurrentDirectory(S9xGetDirectoryT(DEFAULT_DIR));

	for(int i = 0; i < MAX_SHADER_TEXTURES; i++) {		
		_stprintf(rubyLUTfileName, TEXT("%srubyLUT%d.png"), folder, i);
		hr = D3DXCreateTextureFromFile(pDevice,rubyLUTfileName,&rubyLUT[i]);
		if FAILED(hr){
			rubyLUT[i] = NULL;
		}
	}

	D3DXHANDLE hTech;
	effect->FindNextValidTechnique(NULL,&hTech);
	effect->SetTechnique( hTech );
	shader_type = D3D_SHADER_HLSL;
	return true;
}
HRESULT CPageEvents::UpdateItemFromNode(LPARAM lNode)
{
  USES_CONVERSION;

  // Typecast the tree item's param as an XML element pointer
  IXMLDOMElement* pElement = reinterpret_cast<IXMLDOMElement*>(lNode);
  if (!pElement)
    return S_FALSE;

  // Use to enable/disable the check boxes
  bool bEnableLog2NT = false;
  bool bEnableLog2DB = false;

  // Determine if the node is a group element or an event
  CComBSTR bstrTagName;
  VERIFY(SUCCEEDED(pElement->get_tagName(&bstrTagName)));
  bool bIsEvent = 0 == wcscmp(bstrTagName, m_bstrEvent);
  bool bIsGroup = !bIsEvent && 0 == wcscmp(bstrTagName, m_bstrEventGroup);
  ASSERT(bIsEvent || bIsGroup);
  if (bIsEvent)
  {
    // Get the Severity attribute
    CComVariant varSeverity;
    pElement->getAttribute(m_bstrSeverity, &varSeverity);
    VERIFY(SUCCEEDED(varSeverity.ChangeType(VT_BSTR)));
    SetDlgItemText(IDC_EVENT_TYPE, TypeFromSeverity(V_BSTR(&varSeverity)));

    // Get the event id attribute
    CComVariant varEventID;
    pElement->getAttribute(m_bstrID, &varEventID);
    VERIFY(SUCCEEDED(varEventID.ChangeType(VT_I4)));
    SetDlgItemInt(IDC_EVENT_ID, V_I4(&varEventID));

    // Get the CanChangeLogAsNTEvent attribute
    IXMLDOMAttributePtr spAttrNT;
    if (S_OK == pElement->getAttributeNode(m_bstrCanChangeLogAsNTEvent, &spAttrNT))
    {
      CComVariant varCanChange;
      spAttrNT->get_value(&varCanChange);
      VERIFY(SUCCEEDED(varCanChange.ChangeType(VT_BOOL)));
      bEnableLog2NT = !!V_BOOL(&varCanChange);
    }
    else
    {
      // When not specified, the default is true
      bEnableLog2NT = true;
    }

    // Get the LogAsNTEvent attribute
    CComVariant varLog2NT;
    pElement->getAttribute(m_bstrLogAsNTEvent, &varLog2NT);
    VERIFY(SUCCEEDED(varLog2NT.ChangeType(VT_BOOL)));
    CheckDlgButton(IDC_LOG2NT, V_BOOL(&varLog2NT));

    // Get the CanChangeLogAsDBEvent attribute
    IXMLDOMAttributePtr spAttrDB;
    if (S_OK == pElement->getAttributeNode(m_bstrCanChangeLogAsDBEvent, &spAttrDB))
    {
      CComVariant varCanChange;
      spAttrDB->get_value(&varCanChange);
      VERIFY(SUCCEEDED(varCanChange.ChangeType(VT_BOOL)));
      bEnableLog2DB = !!V_BOOL(&varCanChange);
    }
    else
    {
      // When not specified, the default is true
      bEnableLog2DB = true;
    }

    // Get the LogAsDBEvent attribute
    CComVariant varLog2DB;
    pElement->getAttribute(m_bstrLogAsDBEvent, &varLog2DB);
    VERIFY(SUCCEEDED(varLog2DB.ChangeType(VT_BOOL)));
    CheckDlgButton(IDC_LOG2DB, V_BOOL(&varLog2DB));
  }
  else
  {
    // Always show the type as "Group"
    CString strGroup;
    strGroup.LoadString(IDS_TYPE_GROUP);
    SetDlgItemText(IDC_EVENT_TYPE, strGroup);

    // Get the group LowerBound attribute
    CComVariant varLowerBound;
    pElement->getAttribute(m_bstrLowerBound, &varLowerBound);
    VERIFY(SUCCEEDED(varLowerBound.ChangeType(VT_UI4)));

    // Get the group UpperBound attribute
    CComVariant varUpperBound;
    pElement->getAttribute(m_bstrUpperBound, &varUpperBound);
    VERIFY(SUCCEEDED(varUpperBound.ChangeType(VT_UI4)));

    // Format the group's range into a string
    TCHAR szID[_MAX_PATH];
    wsprintf(szID, TEXT("%u - %u"), V_UI4(&varLowerBound),
      V_UI4(&varUpperBound));
    SetDlgItemText(IDC_EVENT_ID, szID);

    // TODO: Work-out how to best support indeterminate checkbox state
    CheckDlgButton(IDC_LOG2NT, false);
    CheckDlgButton(IDC_LOG2DB, false);
  }

  // Get the event/group Description attribute
  CComVariant varDescription;
  pElement->getAttribute(m_bstrDescription, &varDescription);
  VERIFY(SUCCEEDED(varDescription.ChangeType(VT_BSTR)));
  SetDlgItemText(IDC_DESCRIPTION, OLE2CT(V_BSTR(&varDescription)));

  // Enable/disable checkboxes
  GetDlgItem(IDC_LOG2NT)->EnableWindow(bEnableLog2NT);
  GetDlgItem(IDC_LOG2DB)->EnableWindow(bEnableLog2DB);

  // Uncheck checkboxes that are disabled
  if (!bEnableLog2NT)
    CheckDlgButton(IDC_LOG2NT, false);
  if (!bEnableLog2DB)
    CheckDlgButton(IDC_LOG2DB, false);

  // Indicate success
  return S_OK;
}