@@ -1237,7 +1237,8 @@ Int ShroudTextureShader::set(Int stage)
12371237 Matrix4x4 curView;
12381238 DX8Wrapper::_Get_DX8_Transform (D3DTS_VIEW, curView);
12391239
1240- D3DXMatrixInverse (&inv, &det, (D3DXMATRIX*)&curView);
1240+ D3DXMATRIX d3dCurView = Build_D3DXMATRIX (curView);
1241+ D3DXMatrixInverse (&inv, &det, &d3dCurView);
12411242
12421243 D3DXMATRIX scale,offset;
12431244
@@ -1260,8 +1261,8 @@ Int ShroudTextureShader::set(Int stage)
12601261 width = 1 .0f /(width*shroud->getTextureWidth ());
12611262 height = 1 .0f /(height*shroud->getTextureHeight ());
12621263 D3DXMatrixScaling (&scale, width, height, 1 );
1263- *(( D3DXMATRIX *)&curView) = (inv * offset) * scale;
1264- DX8Wrapper::_Set_DX8_Transform ((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), *((Matrix4x4*)&curView) );
1264+ D3DXMATRIX texTransform = (inv * offset) * scale;
1265+ DX8Wrapper::_Set_DX8_Transform ((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), texTransform );
12651266 }
12661267 m_stageOfSet=stage;
12671268 return TRUE ;
@@ -1330,7 +1331,8 @@ Int FlatShroudTextureShader::set(Int stage)
13301331 Matrix4x4 curView;
13311332 DX8Wrapper::_Get_DX8_Transform (D3DTS_VIEW, curView);
13321333
1333- D3DXMatrixInverse (&inv, &det, (D3DXMATRIX*)&curView);
1334+ D3DXMATRIX d3dCurView = Build_D3DXMATRIX (curView);
1335+ D3DXMatrixInverse (&inv, &det, &d3dCurView);
13341336
13351337 D3DXMATRIX scale,offset;
13361338
@@ -1353,8 +1355,8 @@ Int FlatShroudTextureShader::set(Int stage)
13531355 width = 1 .0f /(width*shroud->getTextureWidth ());
13541356 height = 1 .0f /(height*shroud->getTextureHeight ());
13551357 D3DXMatrixScaling (&scale, width, height, 1 );
1356- *(( D3DXMATRIX *)&curView) = (inv * offset) * scale;
1357- DX8Wrapper::_Set_DX8_Transform ((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), *((Matrix4x4*)&curView) );
1358+ D3DXMATRIX texTransform = (inv * offset) * scale;
1359+ DX8Wrapper::_Set_DX8_Transform ((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), texTransform );
13581360 }
13591361 m_stageOfSet=stage;
13601362 return TRUE ;
@@ -1422,8 +1424,8 @@ Int MaskTextureShader::set(Int pass)
14221424 D3DXMATRIX inv;
14231425 float det;
14241426
1425- // Get inverse view matrix so we can transform camera space points back to world space
1426- D3DXMatrixInverse (&inv, &det, (D3DXMATRIX*)&curView );
1427+ D3DXMATRIX d3dCurView = Build_D3DXMATRIX (curView);
1428+ D3DXMatrixInverse (&inv, &det, &d3dCurView );
14271429
14281430 D3DXMATRIX scale,offset,offsetTextureCenter;
14291431 Coord3D centerPos;
@@ -1449,18 +1451,19 @@ Int MaskTextureShader::set(Int pass)
14491451 Real worldTexelHeight=(1 .0f -fadeLevel)*25 .0f ;
14501452
14511453 // /@todo: Fix this to work with non 128x128 textures.
1454+ D3DXMATRIX texTransform;
14521455 if (worldTexelWidth != 0 && worldTexelHeight != 0 )
14531456 { Real widthScale = 1 .0f /(worldTexelWidth*128 .0f );
14541457 Real heightScale = 1 .0f /(worldTexelHeight*128 .0f );
14551458 D3DXMatrixScaling (&scale, widthScale, heightScale, 1 );
1456- *((D3DXMATRIX *)&curView) = ((inv * offset) * scale)*offsetTextureCenter;
1459+ texTransform = ((inv * offset) * scale)*offsetTextureCenter;
14571460 }
14581461 else
14591462 { D3DXMatrixScaling (&scale, 0 , 0 , 1 ); // scaling by 0 will set uv coordinates to 0,0
1460- *((D3DXMATRIX *)&curView) = ((inv * offset) * scale);
1463+ texTransform = ((inv * offset) * scale);
14611464 }
14621465
1463- DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE0, *((Matrix4x4*)&curView) );
1466+ DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE0, texTransform );
14641467
14651468 return TRUE ;
14661469}
@@ -1715,24 +1718,27 @@ Int TerrainShader2Stage::set(Int pass)
17151718 D3DXMATRIX inv;
17161719 float det;
17171720
1718- D3DXMatrixInverse (&inv, &det, (D3DXMATRIX*)&curView);
1721+ D3DXMATRIX d3dCurView = Build_D3DXMATRIX (curView);
1722+ D3DXMatrixInverse (&inv, &det, &d3dCurView);
17191723
17201724 if (W3DShaderManager::getCurrentShader () == W3DShaderManager::ST_TERRAIN_BASE_NOISE12)
17211725 {
17221726 // setup cloud pass
17231727 DX8Wrapper::_Get_D3D_Device8 ()->SetTexture (0 , W3DShaderManager::getShaderTexture (2 )->Peek_D3D_Texture ());
17241728
1725- updateNoise1 (((D3DXMATRIX*)&curView),&inv); // update curView with texture matrix
1726- DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE0, curView);
1729+ D3DXMATRIX texTransform;
1730+ terrainShader2Stage.updateNoise1 (&texTransform,&inv);
1731+ DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE0, texTransform);
17271732 // clouds always need bilinear filtering
17281733 DX8Wrapper::Set_DX8_Texture_Stage_State (0 , D3DTSS_MINFILTER, D3DTEXF_LINEAR);
17291734 DX8Wrapper::Set_DX8_Texture_Stage_State (0 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
17301735
17311736 // setup noise pass
17321737 DX8Wrapper::_Get_D3D_Device8 ()->SetTexture (1 , W3DShaderManager::getShaderTexture (3 )->Peek_D3D_Texture ());
17331738
1734- updateNoise2 (((D3DXMATRIX*)&curView),&inv);
1735- DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE1, curView);
1739+ D3DXMATRIX texTransform2;
1740+ terrainShader2Stage.updateNoise2 (&texTransform2,&inv);
1741+ DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE1, texTransform2);
17361742 // noise always needs point/linear filtering. Why point!?
17371743 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MINFILTER, D3DTEXF_POINT);
17381744 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
@@ -1751,25 +1757,26 @@ Int TerrainShader2Stage::set(Int pass)
17511757 else
17521758 { // only 1 noise or cloud texture
17531759 // Now setup the texture pipeline.
1760+ D3DXMATRIX texTransform3;
17541761 if (W3DShaderManager::getCurrentShader () == W3DShaderManager::ST_TERRAIN_BASE_NOISE1)
17551762 { // setup cloud pass
17561763 DX8Wrapper::_Get_D3D_Device8 ()->SetTexture (0 , W3DShaderManager::getShaderTexture (2 )->Peek_D3D_Texture ());
1757- updateNoise1 (((D3DXMATRIX*)&curView) ,&inv); // update curView with texture matrix
1764+ terrainShader2Stage. updateNoise1 (&texTransform3 ,&inv);
17581765 DX8Wrapper::Set_DX8_Texture_Stage_State (0 , D3DTSS_MINFILTER, D3DTEXF_LINEAR);
17591766 DX8Wrapper::Set_DX8_Texture_Stage_State (0 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
17601767 }
17611768 else
17621769 {
17631770 // setup noise pass
17641771 DX8Wrapper::_Get_D3D_Device8 ()->SetTexture (0 , W3DShaderManager::getShaderTexture (3 )->Peek_D3D_Texture ());
1765- updateNoise2 (((D3DXMATRIX*)&curView) ,&inv); // update curView with texture matrix
1772+ terrainShader2Stage. updateNoise2 (&texTransform3 ,&inv);
17661773 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MINFILTER, D3DTEXF_POINT);
17671774 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
17681775 }
17691776
17701777 DX8Wrapper::Set_DX8_Texture_Stage_State ( 1 , D3DTSS_COLOROP, D3DTOP_DISABLE );
17711778 DX8Wrapper::Set_DX8_Texture_Stage_State ( 1 , D3DTSS_ALPHAOP, D3DTOP_DISABLE );
1772- DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE0, *((Matrix4x4*)&curView) );
1779+ DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE0, texTransform3 );
17731780 }
17741781 break ;
17751782 }
@@ -2043,7 +2050,8 @@ Int TerrainShaderPixelShader::set(Int pass)
20432050
20442051 D3DXMATRIX inv;
20452052 float det;
2046- D3DXMatrixInverse (&inv, &det, (D3DXMATRIX*)&curView);
2053+ D3DXMATRIX d3dCurView = Build_D3DXMATRIX (curView);
2054+ D3DXMatrixInverse (&inv, &det, &d3dCurView);
20472055
20482056 DX8Wrapper::Set_DX8_Texture_Stage_State (2 , D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
20492057 // Two output coordinates are used.
@@ -2066,11 +2074,13 @@ Int TerrainShaderPixelShader::set(Int pass)
20662074 DX8Wrapper::Set_DX8_Texture_Stage_State (3 , D3DTSS_MINFILTER, D3DTEXF_POINT);
20672075 DX8Wrapper::Set_DX8_Texture_Stage_State (3 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
20682076
2069- terrainShader2Stage.updateNoise1 (((D3DXMATRIX*)&curView),&inv); // update curView with texture matrix
2070- DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE2, curView);
2077+ D3DXMATRIX texTransform1;
2078+ terrainShader2Stage.updateNoise1 (&texTransform1,&inv);
2079+ DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE2, texTransform1);
20712080
2072- terrainShader2Stage.updateNoise2 (((D3DXMATRIX*)&curView),&inv); // update curView with texture matrix
2073- DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE3, curView);
2081+ D3DXMATRIX texTransform2;
2082+ terrainShader2Stage.updateNoise2 (&texTransform2,&inv);
2083+ DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE3, texTransform2);
20742084
20752085 DX8Wrapper::Set_DX8_Texture_Stage_State (3 , D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
20762086 // Two output coordinates are used.
@@ -2080,21 +2090,22 @@ Int TerrainShaderPixelShader::set(Int pass)
20802090 { // single noise texture shader
20812091 DX8Wrapper::_Get_D3D_Device8 ()->SetPixelShader (m_dwBaseNoise1PixelShader);
20822092
2093+ D3DXMATRIX texTransform3;
20832094 if (W3DShaderManager::getCurrentShader () == W3DShaderManager::ST_TERRAIN_BASE_NOISE1)
20842095 { // cloud map
20852096 DX8Wrapper::_Get_D3D_Device8 ()->SetTexture (2 , W3DShaderManager::getShaderTexture (2 )->Peek_D3D_Texture ());
2086- terrainShader2Stage.updateNoise1 (((D3DXMATRIX*)&curView) ,&inv); // update curView with texture matrix
2097+ terrainShader2Stage.updateNoise1 (&texTransform3 ,&inv);
20872098 DX8Wrapper::Set_DX8_Texture_Stage_State (2 , D3DTSS_MINFILTER, D3DTEXF_LINEAR);
20882099 DX8Wrapper::Set_DX8_Texture_Stage_State (2 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
20892100 }
20902101 else
20912102 { // light map
20922103 DX8Wrapper::_Get_D3D_Device8 ()->SetTexture (2 , W3DShaderManager::getShaderTexture (3 )->Peek_D3D_Texture ());
2093- terrainShader2Stage.updateNoise2 (((D3DXMATRIX*)&curView) ,&inv); // update curView with texture matrix
2104+ terrainShader2Stage.updateNoise2 (&texTransform3 ,&inv);
20942105 DX8Wrapper::Set_DX8_Texture_Stage_State (2 , D3DTSS_MINFILTER, D3DTEXF_POINT);
20952106 DX8Wrapper::Set_DX8_Texture_Stage_State (2 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
20962107 }
2097- DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE2, curView );
2108+ DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE2, texTransform3 );
20982109 }
20992110 }
21002111 else
@@ -2164,14 +2175,15 @@ Int CloudTextureShader::set(Int stage)
21642175 D3DXMATRIX inv;
21652176 float det;
21662177
2167- D3DXMatrixInverse (&inv, &det, (D3DXMATRIX*)&curView);
2178+ D3DXMATRIX d3dCurView = Build_D3DXMATRIX (curView);
2179+ D3DXMatrixInverse (&inv, &det, &d3dCurView);
21682180
2169- // Get a texture matrix that applies the current cloud position
2170- terrainShader2Stage.updateNoise1 (((D3DXMATRIX*)&curView),&inv,false ); // update curView with texture matrix
2181+ D3DXMATRIX texTransform;
2182+ terrainShader2Stage.updateNoise1 (&texTransform,&inv,false );
2183+ DX8Wrapper::_Set_DX8_Transform ((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), texTransform);
21712184
21722185 DX8Wrapper::Set_DX8_Texture_Stage_State (stage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
21732186 DX8Wrapper::Set_DX8_Texture_Stage_State (stage, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
2174- DX8Wrapper::_Set_DX8_Transform ((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), curView);
21752187 DX8Wrapper::Set_DX8_Texture_Stage_State (stage, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
21762188 DX8Wrapper::Set_DX8_Texture_Stage_State (stage, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
21772189 DX8Wrapper::Set_DX8_Texture_Stage_State (stage, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
@@ -2298,7 +2310,8 @@ Int RoadShaderPixelShader::set(Int pass)
22982310
22992311 D3DXMATRIX inv;
23002312 float det;
2301- D3DXMatrixInverse (&inv, &det, (D3DXMATRIX*)&curView);
2313+ D3DXMATRIX d3dCurView = Build_D3DXMATRIX (curView);
2314+ D3DXMatrixInverse (&inv, &det, &d3dCurView);
23022315
23032316 if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex )
23042317 { DX8Wrapper::Set_DX8_Texture_Stage_State (0 , D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
@@ -2330,11 +2343,13 @@ Int RoadShaderPixelShader::set(Int pass)
23302343 DX8Wrapper::Set_DX8_Texture_Stage_State (2 , D3DTSS_MINFILTER, D3DTEXF_POINT);
23312344 DX8Wrapper::Set_DX8_Texture_Stage_State (2 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
23322345
2333- terrainShader2Stage.updateNoise1 (((D3DXMATRIX*)&curView),&inv, false ); // get texture projection matrix
2334- DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE1, curView);
2346+ D3DXMATRIX texTransform1;
2347+ terrainShader2Stage.updateNoise1 (&texTransform1,&inv, false );
2348+ DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE1, texTransform1);
23352349
2336- terrainShader2Stage.updateNoise2 (((D3DXMATRIX*)&curView),&inv, false ); // get texture projection matrix
2337- DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE2, curView);
2350+ D3DXMATRIX texTransform2;
2351+ terrainShader2Stage.updateNoise2 (&texTransform2,&inv, false );
2352+ DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE2, texTransform2);
23382353
23392354 DX8Wrapper::Set_DX8_Texture_Stage_State (2 , D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
23402355 // Two output coordinates are used.
@@ -2413,7 +2428,8 @@ Int RoadShader2Stage::set(Int pass)
24132428
24142429 D3DXMATRIX inv;
24152430 float det;
2416- D3DXMatrixInverse (&inv, &det, (D3DXMATRIX*)&curView);
2431+ D3DXMATRIX d3dCurView = Build_D3DXMATRIX (curView);
2432+ D3DXMatrixInverse (&inv, &det, &d3dCurView);
24172433
24182434 if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex )
24192435 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
@@ -2434,33 +2450,33 @@ Int RoadShader2Stage::set(Int pass)
24342450 DX8Wrapper::Set_DX8_Texture_Stage_State ( 1 , D3DTSS_ALPHAARG2, D3DTA_CURRENT );
24352451 DX8Wrapper::Set_DX8_Texture_Stage_State ( 1 , D3DTSS_ALPHAOP, D3DTOP_MODULATE );
24362452
2453+ D3DXMATRIX texTransform3;
24372454 if (W3DShaderManager::getCurrentShader () == W3DShaderManager::ST_ROAD_BASE_NOISE12)
24382455 { // full shader, apply noise 1 in pass 0.
24392456 DX8Wrapper::Set_Texture (1 ,W3DShaderManager::getShaderTexture (1 ));
24402457 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MINFILTER, D3DTEXF_LINEAR);
24412458 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
24422459
2443- terrainShader2Stage.updateNoise1 (((D3DXMATRIX*)&curView),&inv, false ); // get texture projection matrix
2444- DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE1, curView);
2460+ terrainShader2Stage.updateNoise1 (&texTransform3,&inv, false );
24452461 }
24462462 else
24472463 { // single noise texture shader
24482464 if (W3DShaderManager::getCurrentShader () == W3DShaderManager::ST_ROAD_BASE_NOISE1)
24492465 { // cloud map
24502466 DX8Wrapper::Set_Texture (1 ,W3DShaderManager::getShaderTexture (1 ));
2451- terrainShader2Stage.updateNoise1 (((D3DXMATRIX*)&curView) ,&inv, false ); // update curView with texture matrix
2467+ terrainShader2Stage.updateNoise1 (&texTransform3 ,&inv, false );
24522468 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MINFILTER, D3DTEXF_LINEAR);
24532469 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
24542470 }
24552471 else
24562472 { // light map
24572473 DX8Wrapper::Set_Texture (1 ,W3DShaderManager::getShaderTexture (2 ));
2458- terrainShader2Stage.updateNoise2 (((D3DXMATRIX*)&curView) ,&inv, false ); // update curView with texture matrix
2474+ terrainShader2Stage.updateNoise2 (&texTransform3 ,&inv, false );
24592475 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MINFILTER, D3DTEXF_POINT);
24602476 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
24612477 }
2462- DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE1, curView);
24632478 }
2479+ DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE1, texTransform3);
24642480 }
24652481 else
24662482 { // just base texturing
@@ -2475,7 +2491,8 @@ Int RoadShader2Stage::set(Int pass)
24752491
24762492 D3DXMATRIX inv;
24772493 float det;
2478- D3DXMatrixInverse (&inv, &det, (D3DXMATRIX*)&curView);
2494+ D3DXMATRIX d3dCurView = Build_D3DXMATRIX (curView);
2495+ D3DXMatrixInverse (&inv, &det, &d3dCurView);
24792496
24802497 if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex )
24812498 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
@@ -2484,7 +2501,9 @@ Int RoadShader2Stage::set(Int pass)
24842501
24852502 DX8Wrapper::Set_Texture (1 ,W3DShaderManager::getShaderTexture (2 ));
24862503
2487- terrainShader2Stage.updateNoise2 (((D3DXMATRIX*)&curView),&inv, false ); // update curView with texture matrix
2504+ D3DXMATRIX texTransform;
2505+ terrainShader2Stage.updateNoise2 (&texTransform,&inv, false );
2506+ DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE1, texTransform);
24882507 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MINFILTER, D3DTEXF_POINT);
24892508 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
24902509
@@ -2516,7 +2535,7 @@ Int RoadShader2Stage::set(Int pass)
25162535 DX8Wrapper::Set_DX8_Render_State (D3DRS_SRCBLEND,D3DBLEND_ZERO);
25172536 DX8Wrapper::Set_DX8_Render_State (D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR);
25182537
2519- DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE0, curView );
2538+ DX8Wrapper::_Set_DX8_Transform (D3DTS_TEXTURE0, texTransform );
25202539 }
25212540
25222541 return TRUE ;
0 commit comments